459 字
2 分钟
stm32开发中dma中断遇到的神秘小问题
stm32开发中dma中断遇到的神秘小问题
神秘问题
笔者在配置stm32 adc+dma的时候发现freertos的线程无法正确执行,大概就是adc_dma初始化后后面的所有任务都无法执行,在用ozone进行神秘的大调试后发现是dma的中断有问题,但是在ozone里一步步单步调试的时候是可以进去线程里的,大抵是ozone的单步调试不受中断影响或者不需要stm32的cpu参与。背后的问题是dma的高频率中断霸占了cpu,导致cpu一直在处理中断无法执行其他任务,也就是假设1us的中断,可能cpu进入中断后执行了1.1us,出来后又进入了中断回调函数,导致一个死循环。
解决方法
既然知道了原因解决也很简单,笔者想到有两种解决方法,一是降低adc的采样频率,二是关闭dma中断,下文详细介绍要如何操作。
增加预分频即可,但笔者没有尝试过要增加到多少才是合适的频率,有兴趣的可自行尝试,所以更推荐第二折解决方法,对于不需要进入dma的中断在cube里的nvic直接关闭即可,但是尝试过的人会发现cube默认强制启动dma中断,似乎只能在代码里手动关闭,其实不然,把force dma interrupt关闭即可,详见下图
stm32开发中dma中断遇到的神秘小问题
https://wleaf666.github.io/posts/dma的一些神秘小问题/