【STM32F4xx踩坑记录】ADC+DMA+STM32CUBEMX 造成数据溢出的问题

配置-> 多通道ADC扫描模式+DMA无缓冲区+循环DMA
最近使用STM32F405RGT6进行开发,移植103c8t6的ADC+DMA是发现ADC模块中的值全为零,单步调试后发现ADC转换了一次(一个通道值)后就停止了转换.
单步调试发现ADC1->SR中 OVR溢出标志置1了,查询数据手册得知此标记为DMA溢出标志.
怀疑是DMA出现问题.
单步调试观察DMA2_Stream0内寄存机的值,发现初始化后与期望的值不一致
DMA2_Stream0->FCR (FIFO控制寄存器被设置为0x21)

查看STM32自动生成代码后发现DMA时钟使能在ADC初始化使能之后.
相当于HAL_ADC_MspInit 函数中对DMA的操作都是无效的.
解决方案:
先使能DMA时钟,然后进行DMA操作
注:因为初始化代码是CUBE自动生成的,所以这个问题有可能在软件更新后被修复,

后续: 使用DMA的外设初始化需要在DMA时钟使能之后进行.

### 回答1: FreeRTOS ADC DMA是一种嵌入式系统应用的技术,它涉及到采集模拟信号的ADC(模数转换器)和DMA(直接存储器访问)技术。DMA技术可以有效地增加系统的性能,减轻CPU的负担,提高数据传输的速度和稳定性。 在FreeRTOS中使用ADC DMA,需要确保硬件支持DMA功能,并且选择正确的DMA通道和优先级。此外,还需要编写相应的驱动程序,以便与FreeRTOS集成,实现数据采集和传输的自动化。 对于不同的应用场景,可以采用不同的ADC DMA方案。例如,周期性采集固定长度的数据时,可以采用循环DMA模式;而对于可变长度的数据,可以选择双缓冲DMA模式。 使用FreeRTOS ADC DMA技术,可以实现实时数据采集和处理,以及快速响应外部事件的需要。但是,在使用过程中需要注意一些问题,例如DMA缓存溢出DMA传输速度与处理速度不匹配等,需要考虑合适的解决方案,以确保系统的稳定性和可靠性。 ### 回答2: FreeRTOS是一个开源、实时操作系统,它提供了很多实用的功能和组件,其中包括ADC DMAADC DMA是一种用于在FreeRTOS系统中实现高效数据传输的技术。它可以使得数据的传输速度更快,减少了CPU的负载,从而提高了系统的效率。 ADC DMA可以帮助系统从模数转换器(ADC)中读取数据。当使用ADC DMA时,ADC数据会被存储在内部缓冲区中,而不需要CPU进行任何处理。一旦内部缓冲区被填满,DMA控制器就会自动将数据传输到外部存储器或设备上。 使用ADC DMA可以有效地减少CPU的负载,因为传输过程完全由控制器进行处理,而不需要CPU参与。这使得系统能够同时执行多个任务,并且可以更快地响应外部事件。 总之,ADC DMA是FreeRTOS操作系统中非常有效和实用的技术。它可以帮助系统更高效地获取ADC数据,并且大大减少了CPU的负载,从而提高了系统的效率和稳定性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值