关于Cubemx(HAL库)中ADC和DMA同时启用存在的问题

在编程STM32使用Cubemx时,错误地将ADC初始化放在了DMA之前,导致数据提取出错。正确的初始化顺序应当是先初始化DMA,再初始化ADC。调整代码后,ADC与DMA的初始化顺序得到纠正,从而实现了正常的功能。
摘要由CSDN通过智能技术生成

        在使用Cubemx编程STM32时,若同时开启ADC和DMA,则软件自动生成的代码如下

         可以看到,ADC初始化在DMA前面,这样一来,我们会发现从DMA提取的数据错误的,原因就在它们两个初始化函数的先后顺序是有讲究的。

正确的顺序应该是DMA初始化在前,ADC初始化在后,上述代码更改后如下:

 经上述改正后,代码功能能正常实现。

在HAL函数库,使用DMA传输ADC数据时,可以使用ADC-DMA传输完成断函数来处理DMA传输完成事件。以下是ADC-DMA传输完成断函数的用法: 首先,需要在代码定义断处理函数: ```c void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { // 处理ADC-DMA传输完成事件的代码 } ``` 然后,在初始化ADCDMA时,需要启用ADC-DMA传输完成断: ```c /* 初始化ADC */ ADC_HandleTypeDef hadc; hadc.Instance = ADC1; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.ScanConvMode = DISABLE; hadc.Init.ContinuousConvMode = ENABLE; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.NbrOfConversion = 1; if (HAL_ADC_Init(&hadc) != HAL_OK) { // 初始化ADC失败的错误处理代码 } /* 配置DMA */ DMA_HandleTypeDef hdma; hdma.Instance = DMA1_Stream0; hdma.Init.Channel = DMA_CHANNEL_0; hdma.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma.Init.PeriphInc = DMA_PINC_DISABLE; hdma.Init.MemInc = DMA_MINC_ENABLE; hdma.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma.Init.Mode = DMA_CIRCULAR; hdma.Init.Priority = DMA_PRIORITY_HIGH; hdma.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma) != HAL_OK) { // 初始化DMA失败的错误处理代码 } /* 关联ADCDMA */ __HAL_LINKDMA(&hadc, DMA_Handle, hdma); /* 启用ADC-DMA传输完成断 */ HAL_NVIC_SetPriority(ADC_IRQn, 0, 0); HAL_NVIC_EnableIRQ(ADC_IRQn); ``` 最后,在ADC-DMA传输完成断函数处理数据: ```c void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { uint16_t adc_value = HAL_ADC_GetValue(hadc); // 处理ADC数据的代码 } ``` 在ADC-DMA传输完成断函数,可以使用HAL_ADC_GetValue函数获取ADC转换的值,并进行相应的处理。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式创客工坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值