Gunar Kroeger / Mbed OS AcusticLocator
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers AnalogInDma.cpp Source File

AnalogInDma.cpp

00001 #include "AnalogInDma.h"
00002 
00003 
00004 AnalogInDma::AnalogInDma()
00005 {
00006 }
00007 AnalogInDma::~AnalogInDma()
00008 {
00009     
00010 }
00011 bool AnalogInDma::init()
00012 {
00013     MX_DMA_Init();
00014     if(!MX_ADC1_Init())
00015         return false;
00016     return true;
00017 }
00018 
00019 bool AnalogInDma::start(uint32_t* pData, uint32_t Length)
00020 {
00021     if (HAL_ADC_Start_DMA(&hadc1, pData, Length) != HAL_OK)
00022         return false;
00023     return true;
00024 }
00025 
00026 /* ADC1 init function */
00027 bool AnalogInDma::MX_ADC1_Init()
00028 {
00029     ADC_MultiModeTypeDef multimode;
00030     ADC_ChannelConfTypeDef sConfig;
00031 
00032     /**Common config 
00033     */
00034     hadc1.Instance = ADC1;
00035     hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
00036     hadc1.Init.Resolution = ADC_RESOLUTION_12B;
00037     hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
00038     hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
00039     hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
00040     hadc1.Init.LowPowerAutoWait = DISABLE;
00041     hadc1.Init.ContinuousConvMode = ENABLE;
00042     hadc1.Init.NbrOfConversion = 4;
00043     hadc1.Init.DiscontinuousConvMode = DISABLE;
00044     hadc1.Init.NbrOfDiscConversion = 1;
00045     hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
00046     hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
00047     hadc1.Init.DMAContinuousRequests = ENABLE;
00048     hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
00049     hadc1.Init.OversamplingMode = DISABLE;
00050     if (HAL_ADC_Init(&hadc1) != HAL_OK)
00051         return false;
00052 
00053     /**Configure the ADC multi-mode 
00054     */
00055     multimode.Mode = ADC_MODE_INDEPENDENT;
00056     if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
00057         return false;
00058 
00059     /**Configure Regular Channel 
00060     */
00061     sConfig.Channel = ADC_CHANNEL_5;
00062     sConfig.Rank = 1;
00063     sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5;
00064     sConfig.SingleDiff = ADC_SINGLE_ENDED;
00065     sConfig.OffsetNumber = ADC_OFFSET_NONE;
00066     sConfig.Offset = 0;
00067     if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
00068         return false;
00069 
00070     /**Configure Regular Channel 
00071     */
00072     sConfig.Channel = ADC_CHANNEL_6;
00073     sConfig.Rank = 2;
00074     if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
00075         return false;
00076 
00077     /**Configure Regular Channel 
00078     */
00079     sConfig.Channel = ADC_CHANNEL_9;
00080     sConfig.Rank = 3;
00081     if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
00082         return false;
00083     /**Configure Regular Channel 
00084     */
00085     sConfig.Channel = ADC_CHANNEL_15;
00086     sConfig.Rank = 4;
00087     if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
00088         return false;
00089     return true;
00090 }
00091 
00092 /** 
00093 * Enable DMA controller clock
00094 */
00095 void AnalogInDma::MX_DMA_Init() 
00096     {
00097     /* DMA controller clock enable */
00098     __HAL_RCC_DMA1_CLK_ENABLE();
00099 
00100     /* DMA interrupt init */
00101     /* DMA1_Channel1_IRQn interrupt configuration */
00102     HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
00103     HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
00104 }