网站开发绑定微信qq注册,代练平台,适合大学生做的网站有哪些,投诉网站怎么做1. 引言
STM32 G0 系列产品具有丰富的外设和强大的处理性能以及良好的低功耗特性#xff0c;被广泛用于各类工业产品中#xff0c;包括一些需要低功耗需求的应用。
2. 问题描述
用户使用 STM32G0B1 作为汽车多媒体音响控制器的控制芯片#xff0c;用来作为收音机频道存贮…1. 引言
STM32 G0 系列产品具有丰富的外设和强大的处理性能以及良好的低功耗特性被广泛用于各类工业产品中包括一些需要低功耗需求的应用。
2. 问题描述
用户使用 STM32G0B1 作为汽车多媒体音响控制器的控制芯片用来作为收音机频道存贮和各种检测控制。在实验室条件下模拟汽车频繁打火的情形进行测试连续工作 72 小时实验中进入 STOP 模式后会出现无法再继续运行的情况屏幕没有显示输出外部中断无反应。
3. 问题重现与解决
通常调查问题时采取调试监控的方式。但是用户产品是在检测外部掉电时测外部电压汽车 ACC 电源轿车 12V下降后立刻进入低功耗模式然后通过 RTC 和外部中断PC13 下降沿触发即汽车打火上电唤醒 MCU 继续工作。
那么既然是已经进入低功耗模式并且在几十个小时内才会出现故障通常的用 ST-LINK 在线调试方式显然很困难重现问题即使幸运的遇到了故障也很容易错过引起故障的代码部分看到了现象却无法定位。
在此种情况下正面分析出问题的可能性极小况且用户代码量超过 200k。这时候采用排除法不失为一种可行的办法。通过增加测试样本数量进行并行测试提高定位效率。 在实践中根据代码结构时序采用提高触发唤醒频率的方式减少故障发生的时间。
图 1 是为了方便说明问题模拟用户关键程序。主要是进入 STOP 前后外设的处理来复现故障现象。
图 1 模拟 ACC 掉电唤醒程序 在经过一段时间的实验并从增加和减少该段代码的排除中最后验证并定位到下面的代码引起故障发生。 图 2 定位到引起的故障代码 反复分析我们可以看到在进入 STOP 前用户需要停止 ADC 和 DMA。但是在停止 DMA时用户程序直接停掉 DMA 的时钟。从函数名称上看是从其他软件直接搬过来并且误以为是DMA 的默认初始化动作。
图 3 DMA 正确的停止方式 查询参考手册停止循环模式的 DMA 应该从外设停止开始而不是简单粗暴的停止 DMA 时钟。而且在程序顺序上客户是先停止了 DMA 的时钟然后才去停止 ADC 的 DMA 请求。显然当 DMA 开始工作时突然停止时钟会使 DMA 和总线处于一个不确定阶段状态因此才有极低概率发生唤醒故障。
到此已经找到了发生的原因按说应该找到了前因后果。但奇怪的是无意中发现振荡器的波形比较奇怪并不符合低功耗模式。 图 4 外部振荡器 HSE 波形 在发生故障状态时发现外部震荡器还在持续震荡因此判定此时并非进入低功耗模式。利用IAR 编译器以 HOT PLUG 的方式连接调试与观测。
通过调试界面可以看到代码会不停的进入 DMA 中断。 图五 故障模式下的调试 图六 代码进入循环过程 奇怪的是每次并没有看到 DMA 的寄存器内容原因是已经关闭了 DMA 外设的时钟。所以无法看到任何状态标志。退出中断时在 C 语言下就无法单步调试了。 切换到汇编界面下可以看到代码可以继续运行到系统时钟配置函数但是在配置函数中的除法部分进入了循环然后又发生了 DMA 中断并且循环没有出来。
显然正常的调试手段已显示出逻辑的不正常。
4. 小结
至此情况已经明了。由于软件在进入低功耗前试图关闭 ADC 加 DMA 工作没有按照手册的规范通过外设停止的方式关闭而是简单粗暴的关闭 DMA 时钟导致总线和运行逻辑出错无法继续执行。
外部看起来像是进入低功耗模式后外部中断触发没有执行芯片没有唤醒实际上是DMA 进入了不正常的循环中断方式导致了系统卡在循环代码下。
芯片的外设功能强大每种外设运行的方式也不相同因此停止外设时需根据外设特点以及参考手册的建议来实施切不可按自己想象的方式执行这样引起隐蔽的偶发故障就很难去定位解决了。
此外 ST 已经建立好完整强大的生态系统按照 cube 软件库的规范编写调用驱动函数可以避免少走类似的弯路。 本文档参考ST官方的《【应用笔记】LAT1236看似无法唤醒的一种异常现象分析》文档。 参考下载地址https://download.csdn.net/download/u014319604/89034127