这次我就来分享两个实际利用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】设计模式之大略工厂模式、工厂模式、抽象工厂模式的比拟
本"大众号全部原创干货已整理成一个目录,回答[ 资源 ]即可得到。










