打印
[应用相关]

移植看门狗驱动程序到STM32L053R8T6

[复制链接]
741|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
晓伍|  楼主 | 2019-7-4 11:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本文将介绍将STM32F070F6P6上的看门狗驱动程序移植到STM32L053R8T6的方法,步骤如下:



1、在1_bsp层引入STM32官方的驱动程序stm32l0xx_hal_iwdg.c,并修改stm32l0xx_hal_conf.h中的内容,使能内部看门狗,相关程序如下,然后进行编译,形成bsp.lib

#define HAL_MODULE_ENABLED  
/*#define HAL_ADC_MODULE_ENABLED   */
/*#define HAL_CRYP_MODULE_ENABLED   */
/*#define HAL_COMP_MODULE_ENABLED   */
/*#define HAL_CRC_MODULE_ENABLED   */
/*#define HAL_CRYP_MODULE_ENABLED   */
/*#define HAL_DAC_MODULE_ENABLED   */
/*#define HAL_FIREWALL_MODULE_ENABLED   */
/*#define HAL_I2S_MODULE_ENABLED   */
#define HAL_IWDG_MODULE_ENABLED   
/*#define HAL_LCD_MODULE_ENABLED   */
/*#define HAL_LPTIM_MODULE_ENABLED   */
/*#define HAL_RNG_MODULE_ENABLED   */
#define HAL_RTC_MODULE_ENABLED   
#define HAL_SPI_MODULE_ENABLED   
#define HAL_TIM_MODULE_ENABLED
/*#define HAL_TSC_MODULE_ENABLED   */
#define HAL_UART_MODULE_ENABLED
/*#define HAL_USART_MODULE_ENABLED   */
/*#define HAL_IRDA_MODULE_ENABLED   */
/*#define HAL_SMARTCARD_MODULE_ENABLED   */
/*#define HAL_SMBUS_MODULE_ENABLED   */
/*#define HAL_WWDG_MODULE_ENABLED   */
#define HAL_PCD_MODULE_ENABLED
#define HAL_GPIO_MODULE_ENABLED
#define HAL_DMA_MODULE_ENABLED
#define HAL_I2C_MODULE_ENABLED
#define HAL_RCC_MODULE_ENABLED
#define HAL_FLASH_MODULE_ENABLED
#define HAL_PWR_MODULE_ENABLED
#define HAL_CORTEX_MODULE_ENABLED


使用特权

评论回复
沙发
晓伍|  楼主 | 2019-7-4 11:10 | 只看该作者
2、在2_psp层引入iwdg.cpp和iwdg.h文件,并在include.h中包含iwdg.h头文件,程序如下:

#include "..\src_2_psp\iwdg\iwdg.h"

使用特权

评论回复
板凳
晓伍|  楼主 | 2019-7-4 11:11 | 只看该作者

3、在config.h文件中,加入看门狗配置程序。



  • #define IWDG_MODE 5            //        0:        不使能IWDG



  •                             //        5:        5秒复位


使用特权

评论回复
地板
晓伍|  楼主 | 2019-7-4 11:11 | 只看该作者
4、更改iwdg.cpp中的程序,增加对STM32L053R8T6支持,程序如下:

#include "include.h"

CIwdg::CIwdg(void)
{
        this->hIwdg.Instance = IWDG;
#if IWDG_MODE == 5
  this->hIwdg.Init.Prescaler = IWDG_PRESCALER_64;
  this->hIwdg.Init.Window = 4095;
#if defined (STM32F070x6)                                        //时钟40KHz 40000 / 64 * 5 = 3125
  this->hIwdg.Init.Reload = 3125;
#elif defined (STM32L053xx)                                //时钟37KHz 37000 / 64 * 5 = 2890
        this->hIwdg.Init.Reload = 2890;
#else
        #error "在iwdg.cpp中,未指定单片机类型"
#endif
#endif
  if (HAL_IWDG_Init(&this->hIwdg) != HAL_OK)
  {
    Target.ErrorHandler(__FILE__, __LINE__);
  }
}

void CIwdg::Refresh(void)
{
        HAL_IWDG_Refresh(&this->hIwdg);
}


使用特权

评论回复
5
晓伍|  楼主 | 2019-7-4 11:11 | 只看该作者
5、在target.h中,增加对看门狗的支持语句,程序如下,此时对整个工程进行编译,然后下载到目标板,可以看到5秒钟的时间,目标板就复位,这说明看门狗已经起作用。

#ifndef TARGET_H_
#define TARGET_H_

#include "include.h"

void TARGET_Init(void);

#ifdef __cplusplus
extern "C"{

class CTarget
{
public:
        boolean bMilliSecond_1000;
        boolean bMilliSecond_100;
        boolean bMilliSecond_10;
        uint8_t CpuId[12];
#if IWDG_MODE != 0
        CIwdg Iwdg;
#endif
        CTarget(void);
        CInit Init;
        CHAL HAL;       

        boolean IsbMilliSecond_1000(void);
        boolean IsbMilliSecond_100(void);
        boolean IsbMilliSecond_10(void);
        void Delayms(uint16_t u16_ms);
        void ErrorHandler(const char *, int);
        void EnableLowPower(void);        //使能超低功耗
        void DisableAllIO(void);        //Disable所有IO引脚
        void ReadCpuId(void);                //读取唯一识别ID
        void Restart(void);
};

extern CTarget Target;

}
#endif
#endif


使用特权

评论回复
6
晓伍|  楼主 | 2019-7-4 11:12 | 只看该作者
6、现在,我们只需在关键的地方加入喂狗语句即可,首先是main函数中的后台主循环需加入,还有我们可以在延时语句中加入喂狗语句,程序如下:

void CTarget::Delayms(uint16_t u16_ms)
{
        HAL_Delay(u16_ms);
#if IWDG_MODE != 0                       
        this->Iwdg.Refresh();
#endif
}
至此,整个程序移植完成。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

4113

帖子

1

粉丝