写点什么

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_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
复制代码


执行大致代码如下:


#include "stdio.h"void SystemInit(void){  RCC_Init();  ADC_DMA_Init();  Usart_DMA_Init();}
int main(void){ SystemInit();
HAL_SuspendTick();//暂停滴答定时器 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); HAL_ResumeTick(); //恢复滴答定时器 SystemInit();
}
复制代码


这个流程是标准库使用的一个标准流程:


系统初始化 ------>系统运行 ------> 某种条件下进入休眠 ------> 唤醒系统 ------> 重新初始化外设 ------> 系统运行


但是在使用 HAL 库时候发现,DMA 相关外设用这种方式进入 stop 模式后,系统唤醒之后重新初始化整个 MCU 会出现 DMA 使用故障。对应内存获取的数据位置对不上。


经过一点点测试验证,发现在 HAL 库中如果要把 DMA 相关外设进入 stop 模式唤醒正常工作,需要休眠之前把相关初始化好的 DMA 外设进行 DeInit 缺省化,休眠之后再进行初始化就可以正常工作。

修改建议:

系统初始化 ------>系统运行 ------> 某种条件下(休眠期前缺省化 DMA 外设)进入休眠 ------> 唤醒系统 ------> 重新初始化外设 ------> 系统运行


#include "stdio.h"extern ADC_HandleTypeDef hadc1;extern DMA_HandleTypeDef hdma_adc1;
extern UART_HandleTypeDef huart2;extern DMA_HandleTypeDef hdma_usart2_tx;

void SystemInit(void){ RCC_Init(); ADC_DMA_Init(); Usart_DMA_Init();}
int main(void){ SystemInit(); HAL_DMA_DeInit(huart2.hdmatx); NVIC_DisableIRQ(DMA1_Stream6_IRQn); HAL_DMA_DeInit(hadc1.DMA_Handle); NVIC_DisableIRQ(DMA2_Stream0_IRQn);
HAL_SuspendTick();//暂停滴答定时器 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); HAL_ResumeTick(); //恢复滴答定时器 SystemInit();
}
复制代码


最后代码可以正常的使用。

结语

这就是我分享的项目中遇到一个 stm32 HAL 库休眠唤醒 DMA 外设的问题,如果大家有更好的想法和需求,也欢迎大家加我好友交流分享哈。




作者:良知犹存,白天努力工作,晚上原创公号号主。公众号内容除了技术还有些人生感悟,一个认真输出内容的职场老司机,也是一个技术之外丰富生活的人,摄影、音乐 and 篮球。关注我,与我一起同行。


                              ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧
复制代码


推荐阅读


【1】C++的智能指针你了解吗?


【2】嵌入式底层开发的软件框架简述


【3】CPU中的程序是怎么运行起来的 必读


【4】cartographer环境建立以及建图测试


【5】设计模式之简单工厂模式、工厂模式、抽象工厂模式的对比


本公众号全部原创干货已整理成一个目录,回复[ 资源 ]即可获得。

发布于: 刚刚阅读数: 2
用户头像

良知犹存

关注

还未添加个人签名 2020.05.29 加入

还未添加个人简介

评论

发布
暂无评论
stm32-HAL使用stop模式后DMA初始化的问题