stm32-HAL 使用 stop 模式后 DMA 初始化的问题
前言:
stm32 是嵌入式 MCU 开发中最多应用的芯片,很早之前我们开发 ST 芯一般都是标准库开发,标准库简洁好读,现在要配合 CubeMX 生成代码,所以官方主推 HAL 库和 LL 库,但是 HAL 代码冗杂很绕,因为出来也不久,有些代码使用之后不是那么好用。
这次我就来分享两个实际使用 HAL 库过程中遇到的两个问题,一个是使用 uart 的发送中断进行数据发送产生的数组访问越界的问题。一个是 stop 模式下,dma 相关的外设休眠唤醒需要注意缺省化之后,重新初始化。
这篇是 DMA 唤醒使用的介绍:
作者:良知犹存
转载授权以及围观:欢迎关注微信公众号:羽林君
或者添加作者个人微信:become_me
前情提要:
单片机的休眠唤醒是我们经常使用的一个功能。
进行 HAL 库休眠唤醒的时候 我们直接使用函数即可
官方提供的库文件 stm32f4xx_hal_pwr.h 里面有相应的 stop sleep standby 三种模式选择
我们选择 stop 模式
执行大致代码如下:
这个流程是标准库使用的一个标准流程:
系统初始化 ------>系统运行 ------> 某种条件下进入休眠 ------> 唤醒系统 ------> 重新初始化外设 ------> 系统运行
但是在使用 HAL 库时候发现,DMA 相关外设用这种方式进入 stop 模式后,系统唤醒之后重新初始化整个 MCU 会出现 DMA 使用故障。对应内存获取的数据位置对不上。
经过一点点测试验证,发现在 HAL 库中如果要把 DMA 相关外设进入 stop 模式唤醒正常工作,需要休眠之前把相关初始化好的 DMA 外设进行 DeInit 缺省化,休眠之后再进行初始化就可以正常工作。
修改建议:
系统初始化 ------>系统运行 ------> 某种条件下(休眠期前缺省化 DMA 外设)进入休眠 ------> 唤醒系统 ------> 重新初始化外设 ------> 系统运行
最后代码可以正常的使用。
结语
这就是我分享的项目中遇到一个 stm32 HAL 库休眠唤醒 DMA 外设的问题,如果大家有更好的想法和需求,也欢迎大家加我好友交流分享哈。
作者:良知犹存,白天努力工作,晚上原创公号号主。公众号内容除了技术还有些人生感悟,一个认真输出内容的职场老司机,也是一个技术之外丰富生活的人,摄影、音乐 and 篮球。关注我,与我一起同行。
推荐阅读
【3】CPU中的程序是怎么运行起来的 必读
本公众号全部原创干货已整理成一个目录,回复[ 资源 ]即可获得。
版权声明: 本文为 InfoQ 作者【良知犹存】的原创文章。
原文链接:【http://xie.infoq.cn/article/840a63725ff72625e7d3c4c70】。文章转载请联系作者。
评论