
X6 |! e0 _% Y * \# {6 |" U. P' p2 o0 F6 O1 S( { 试验目的: 完成2路ADC采样(PA1,PA2)通过DMA的方式,转换结果放入uint32_tADC_ConvertedValue[2]数组中。ADC_ConvertedValue[1]放PA1(ADC第一通道的值),ADC_ConvertedValue[2]放PA2(ADC第二通道的值)。 具体配置: ![]() ![]() ![]() ![]() ![]() 程序分析: 首先定义数组存放ADC转换的值 uint32_t ADC_ConvertedValue[2]; 在主程序中加入HAL_ADC_Start_DMA(&hadc, ADC_ConvertedValue,2);开启ADC的DMA功能。 疑问及需要注意的地方: 1、 ADC配置中,由于时钟是48MHz,所以ClockPrescaler为Synchronous clock mode divided by 4,这样ADC的时钟为12MHz(ADC时钟不能超过14MHz) 2、 End of Conversion Selection配置没有试出是什么功能。 3、 ADC_Regular_ConversionMode配置转换的通道数及采样周期,此处如果设成1,那么ADC_ConvertedValue[2]的2个数都是这一个通道的值。 # t+ q1 @& B9 \5 E9 F4、 DMA配置中,如果选择Normal模式,那么只执行一次DMA就停止了,如果设置成Circular模式,就可以连续开启DMA。数据宽度设置为Word,外设地址不变,存储器地址加1。 " T+ W! Z. ?7 ]9 L2 S% I0 A5 v" f* D1 x2 ~$ i |
/* ADC1 DMA Init */
/* ADC1 Init */
hdma_adc1.Instance = DMA1_Channel1;
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;6 r7 \, W5 k: i' ^. P! M6 D
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;6 }& ^9 d" ~2 b& S1 `1 v8 [
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;7 c- e8 Q. N) |! d5 G
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;; n! S/ O6 J' z) S3 t, e
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc1.Init.Mode = DMA_NORMAL;+ _! d. @3 S1 T" V2 o& s
hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;+ h( Y$ `2 A& C: b% d3 N
if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)7 q% ]0 @+ `! a) _
{0 |3 W' a2 R9 a. J+ R! B( L0 ]
_Error_Handler(__FILE__, __LINE__);' G7 g) i9 x* N$ E! M
}, o4 i( K3 v% C5 @) Z0 d. P
__HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
2.存储的空间可以定义成uint32_t,word的数量可以要采集次数的一半:9 ?0 K$ k1 k8 I" Z+ O+ x1 S* a; }4 Y
uint32_t uhADCxConvertedValue[131];
3.启动DMA的时候,传入缓冲区的地址按(uint32_t *)传入。2 H, A5 q/ {4 J; d% ?- y
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&uhADCxConvertedValue, 262);
4.这样进行了262次采样后,存放在uhADCxConvertedValue区域内的数据就是按16bit连续放过去的。1 G' W1 g$ |" W. L% e6 x5 L- q
测亲的结果分享的。
pData不能是uint16_t的,因为DMA理论上是要有能力把数据“搬运”4GB地址空间里的任何位置,所以必须要uint32_t, 虽然pData是uint32_t 但是DMA从ADC的数据寄存器里搬运数据并不一定是按照32bit来复制的,而是根据Periphral 和Memory 的data width设置的,比如如果Memory 的数据宽度是Half Word那么dma就按照16bit递增地址来写数据
恩,是这样的
我当时做ADC_DMA也有这个困惑,从函数原型来看是用32bit
论坛有一个人发过,你可以找找