STM32F103使用cubemx配置ADC和DMA导致delay函数无法使用
用CUBEMX配置完adc和dma后在主函数中调用函数HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&DMA_value,6);会导致while循环中的delay延时函数失效,具体情况是:
不打开ADC,delay函数正常使用,可以1S打印一次信息,
但是打开HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&DMA_value,6);函数后,打印频率不是1S,而是比1S快
同样,只使用ADC不使用DMA,在while循环之前打开HAL_ADC_Start_IT(&hadc1);,可以1S打印一次信息,
但是如果同时打开HAL_ADC_Start_IT(&hadc1);和HAL_ADC_Start(&hadc1);,就会导致打印的频率比1S快
有没有大佬知道如何解决问题
这个可能是因为初始化顺序的问题吧
是不是你初始化的问题呢?
这个官方是否有demo呀,你可以参考demo来找找原因
可以关闭DMA,ADC是否正常啊
你可以问问ST的FAE,他家hal自动生成虽然简单,但是遇到问题也不好搞
打印频率快1秒呢?时序的问题?
没遇到过这问题啊,感觉像程序逻辑的事儿
你可以把工程附上来,让大家帮你看看
. While的delay函数失效,是不是因为你的delay采用的不是软延时呢?
正常delay你要是用定时器的话,也不会失效的啊,你可以看看初始化地方,定时器是否初始化了
是不是开启了中断呢? 这个需要关闭DMA的中断代码。 delay延时用的是for while死循环,这种延时精度不高,当有频繁中断产生时,延时就会变长,如果要精准定时建议你使用定时器,并且用优先级别较高的定时器 直接使用官方的程序进行移植会更好的 ADC的工作频率依赖于系统时钟的配置。如果系统时钟没有正确配置,可能会影响ADC的转换速率,从而影响到延时函数的执行。 比如在主循环中使用HAL_Delay()函数,或者在定时器中断中使用计数器来实现延时。这些方法都不会影响到中断服务函数的执行。 如果delay函数的准确性不是关键,可以考虑使用硬件延迟 在DMA传输完成中断中处理数据时,如果数据处理占用了过多的时间,也会影响到延时函数的执行。优化中断服务程序中的数据处理逻辑,尽量减少中断服务程序的执行时间。 可能会持续占用资源并干扰其他功能,包括delay函数。