STM32开发笔记66: 移植看门狗驱动程序到STM32L053R8T6

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qingwufeiyang12346/article/details/86100714

单片机型号:STM32L053R8T6


在文章STM32开发笔记45:看门狗驱动程序的移植已经介绍了看门狗驱动程序的移植方法,其实现的是将STM32CubeMX中的驱动程序,移植到自己已有的工程中。本文将介绍将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

2、在2_psp层引入iwdg.cpp和iwdg.h文件,并在include.h中包含iwdg.h头文件,程序如下:

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

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

#define IWDG_MODE 5	    //	0:	不使能IWDG
                            //	5:	5秒复位

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、在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、现在,我们只需在关键的地方加入喂狗语句即可,首先是main函数中的后台主循环需加入,还有我们可以在延时语句中加入喂狗语句,程序如下:

void CTarget::Delayms(uint16_t u16_ms)
{
	HAL_Delay(u16_ms);
#if IWDG_MODE != 0			
	this->Iwdg.Refresh();
#endif
}

至此,整个程序移植完成。

 

 

原创性文章,转载请注明出处CSDN:http://blog.csdn.net/qingwufeiyang12346。 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qingwufeiyang12346/article/details/86100714
今日推荐