stm32-HAL使用stop模式后DMA初始化的问题

简介: 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三种模式选择4edc953e2c684bbe819ffa954c899c08.png

我们选择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 篮球。关注我,与我一起同行。

目录
相关文章
|
16天前
|
存储 数据管理 数据处理
处理STM32 DMA方式下的HAL_UART_ERROR_ORE错误
通过正确配置UART和DMA、实现有效的错误处理回调函数以及优化数据处理和缓冲区管理,可以有效处理STM32中DMA方式下的 `HAL_UART_ERROR_ORE`错误。这些方法确保了数据的高效传输和处理,避免了因数据溢出导致的通信中断和数据丢失。希望这些解决方案能够帮助您在实际应用中更好地应对和解决此类问题。
95 0
|
6月前
|
传感器
STM32标准库ADC和DMA知识点总结-1
STM32标准库ADC和DMA知识点总结
|
4月前
|
前端开发 安全
stm32f407探索者开发板(十一)——SystemInit时钟系统初始化剖析
stm32f407探索者开发板(十一)——SystemInit时钟系统初始化剖析
154 0
|
5月前
经验大分享:STM32F4寄存器初始化系列:GPIO
经验大分享:STM32F4寄存器初始化系列:GPIO
31 0
|
6月前
|
存储 芯片
STM32 cubemx配置USART DMA传输
STM32 cubemx配置USART DMA传输
152 0
|
存储 Perl
STM32速成笔记(八)—DMA
本文介绍了DMA的概念,用途。对于STM32F103ZET6的DMA做出了详细地介绍,给出了DMA配置步骤。最后,以配置DMA搬运ADC转换结果为例,给出了DMA的配置和使用方法。
233 0
STM32速成笔记(八)—DMA
|
存储 内存技术
STM32F0单片机快速入门八 聊聊 Coolie DMA
STM32F0单片机快速入门八 聊聊 Coolie DMA
STM32F103C8 DMA与AD多通道
STM32F103C8 DMA与AD多通道
99 0
|
数据处理
STM32实现DMA接收串口数据
STM32实现DMA接收串口数据
302 0