完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
程序写好后发现有一定几率上电后看门狗复位,然后屏蔽看门狗,用定时器控制灯闪烁作为指示,主循环里串口每隔一秒输出一句话;
发现有一定几率主循环里不走,但定时器控制的灯正常闪烁。程序不知道停在哪里了。 然后把主循环里的语句逐句屏蔽掉,最后发现可能是ADC这部分的问题。 ADC这里是这样实现的,只用了STM32的1个ADC引脚,用多路模拟开关来切换外部多个输入信号。 之前ADC的DMA传输就没搞明白,在主循环外开启DMA后,发现读写spi flash异常慢,后来关掉ADC的DMA后正常了。 于是不敢一直开启DMA,而是在主循环里进行ADC读取前开启DMA,读取后再关闭DMA。 请教下大家,问题可能出在哪里?到底程序停在了哪里?
|
|
相关推荐
1个回答
|
|
从您的描述来看,问题可能出在ADC的DMA传输功能上。在主循环中不断开启和关闭ADC的DMA传输功能可能导致资源竞争或中断冲突,从而导致程序运行不稳定。以下是一些建议来解决这个问题:
1. **优化DMA配置**:确保DMA传输的配置是正确的,包括源地址、目标地址、传输大小等。错误的配置可能导致数据传输错误,进而影响程序的稳定性。 2. **避免在主循环中频繁开启和关闭DMA**:频繁地开启和关闭DMA可能会引起资源竞争,尤其是在高负载的情况下。您可以考虑将DMA的开启和关闭操作移到一个单独的函数中,并在需要时调用这个函数。 3. **使用中断而不是轮询**:在STM32中,使用中断来处理ADC转换完成事件通常比轮询更可靠。您可以配置ADC在转换完成后触发一个中断,然后在中断服务程序中处理数据。 4. **检查看门狗复位的原因**:看门狗复位通常发生在系统长时间没有响应时。您需要检查为什么程序会触发看门狗复位,是否是因为程序在某个地方卡住了。 5. **使用调试工具**:使用STM32的调试工具,如ST-Link,可以帮助您跟踪程序的执行流程,找出问题所在。 6. **减少主循环中的操作**:主循环通常用于处理用户输入、更新显示等任务,而不是进行大量的数据处理。您可以考虑将数据处理的任务移到一个单独的线程或任务中。 7. **检查SPI Flash的配置**:您提到在开启ADC的DMA后,读写SPI Flash变慢。这可能是因为DMA传输和SPI Flash共享了某些资源,导致冲突。您需要检查SPI Flash的配置,确保它不会与ADC的DMA传输冲突。 8. **软件去抖动**:如果您的ADC输入信号可能存在抖动,您可以考虑在软件中实现去抖动逻辑,以提高数据的稳定性。 9. **硬件去抖动**:如果可能,您也可以考虑在硬件层面实现去抖动,比如使用RC滤波器。 10. **更新固件**:确保您的STM32固件是最新的,有时候固件更新可以解决一些已知的问题。 最后,如果问题依然存在,您可能需要更详细地检查您的代码,或者寻求专业的技术支持。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1784 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1088 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
729 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1680 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
734浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
559浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 21:38 , Processed in 0.851112 second(s), Total 81, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号