• 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】设计模式之简单工厂模式、工厂模式、抽象工厂模式的对比

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

  • 相关阅读:
    没有加注解的后果
    异常:javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach>
    页面的跳转
    SpringBoot的修改操作
    抛出异常
    SpringBoot中的控制层的程序中的方法有返回值的原因
    Maven创建的项目使用SpringBoot框架运行时Progress窗口出现的过程
    @Entity注解不同来源
    maven项目不能正常导入到eclipse中
    使用mpvue开发小程序特别需要注意生命周期勾子created和beforeCreate问题
  • 原文地址:https://www.cnblogs.com/conscience-remain/p/15389712.html
Copyright © 2020-2023  润新知