analogIn with DMA
Diff: analoginDMA_api.c
- Revision:
- 2:08779d8f1873
- Parent:
- 1:4b275a292c9d
- Child:
- 4:2844a210bd46
--- a/analoginDMA_api.c Sat Jan 03 10:17:22 2015 +0000 +++ b/analoginDMA_api.c Sat Jan 03 14:28:35 2015 +0000 @@ -36,6 +36,8 @@ #include "PeripheralPins.h" ADC_HandleTypeDef AdcDMAHandle; +DMA_InitTypeDef DMA_InitStructure; //Variable used to setup the DMA +DMA_HandleTypeDef DMAHandle; int adcDMA_inited = 0; @@ -63,20 +65,21 @@ AdcDMAHandle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2; AdcDMAHandle.Init.Resolution = ADC_RESOLUTION12b; AdcDMAHandle.Init.ScanConvMode = DISABLE; - AdcDMAHandle.Init.ContinuousConvMode = DISABLE; + AdcDMAHandle.Init.ContinuousConvMode = ENABLE; AdcDMAHandle.Init.DiscontinuousConvMode = DISABLE; AdcDMAHandle.Init.NbrOfDiscConversion = 0; AdcDMAHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; AdcDMAHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1; AdcDMAHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; AdcDMAHandle.Init.NbrOfConversion = 1; - AdcDMAHandle.Init.DMAContinuousRequests = DISABLE; - AdcDMAHandle.Init.EOCSelection = DISABLE; + AdcDMAHandle.Init.DMAContinuousRequests = ENABLE; + AdcDMAHandle.Init.EOCSelection = ENABLE; HAL_ADC_Init(&AdcDMAHandle); + } } -static inline uint16_t adc_read(analogin_t *obj) +static inline uint16_t adc_read(analogin_t *obj,uint16_t* pData, uint32_t Length) { ADC_ChannelConfTypeDef sConfig; @@ -142,27 +145,28 @@ HAL_ADC_ConfigChannel(&AdcDMAHandle, &sConfig); - HAL_ADC_Start(&AdcDMAHandle); // Start conversion + // HAL_ADC_Start(&AdcDMAHandle); // Start conversion + HAL_ADC_Start_DMA(&AdcDMAHandle, (uint32_t*) pData, Length); // Wait end of conversion and get value if (HAL_ADC_PollForConversion(&AdcDMAHandle, 10) == HAL_OK) { - return (HAL_ADC_GetValue(&AdcDMAHandle)); + return (HAL_OK); } else { return 0; } } -uint16_t analogin_readdMA_u16(analogin_t *obj) +uint16_t analogin_readdMA_u16(analogin_t *obj,uint16_t* pData, uint32_t Length) { - uint16_t value = adc_read(obj); + uint16_t value = adc_read(obj,pData, Length); // 12-bit to 16-bit conversion value = ((value << 4) & (uint16_t)0xFFF0) | ((value >> 8) & (uint16_t)0x000F); return value; } -float analoginDMA_read(analogin_t *obj) +float analoginDMA_read(analogin_t *obj,uint16_t* pData, uint32_t Length) { - uint16_t value = adc_read(obj); + uint16_t value = adc_read(obj, pData, Length); return (float)value * (1.0f / (float)0xFFF); // 12 bits range }