1.实验目的
在周期TIM中断中定时喂狗以及未及时喂狗导致复位,在程序中加入电源管理相关函数检测,复位原因
2.WDT实验配置流程
选择对应外设
LPO 时钟128 Khz
超时时间 = Timeout Value / Clock Source 单位s
配置超时时间500 ms
Tim配置
超时时间 计数值/(时钟源/分频) 单位/秒
配置定时器溢出时间 100ms
UART打印配置
管脚配置
3.新使用到的函数
看门狗初始化函数:
status_t WDOG_DRV_Init(uint32_t instance,const wdog_user_config_t * userConfigPtr)
串口初始化函数:
status_t LPUART_DRV_Init(uint32_t instance, lpuart_state_t * lpuartStatePtr,const lpuart_user_config_t * lpuartUserConfig)
串口发送函数:
status_t LPUART_DRV_SendData(uint32_t instance,const uint8_t * txBuff,uint32_t txSize)
获取串口传输状态函数
status_t LPUART_DRV_GetTransmitStatus(uint32_t instance, uint32_t * bytesRemaining)
检查系统复位状态函数
bool POWER_SYS_GetResetSrcStatusCmd(const RCM_Type * const baseAddr , const rcm_source_names_t srcName)
4 实现函数
4.1.主函数
#include "Cpu.h"
volatile int exit_code = 0;
#include "delay.h"
#include "uart.h"
#include"key.h"
uint8_t FTM_flag;
uint8_t FWDOG = 4;
void FTM_Feed_WDOG_ISR(void)
{
static uint8_t count = 0U;
count++;
PINS_DRV_TogglePins(PTD, 1 << 1);
if(count == FWDOG) // 喂狗
{
PINS_DRV_TogglePins(PTD, 1 << 0);
WDOG_DRV_Trigger(INST_WATCHDOG1);
count =0;
}
FTM_DRV_ClearStatusFlags(INST_FLEXTIMER_MC1,(uint32_t)FTM_TIME_OVER_FLOW_FLAG);
}
void WDOG_ISR(void)
{
// 复位前做一些紧急处理,时间很短,不要作耗时操作
}
/*!
\brief The main function for the project.
\details The startup initialization sequence is the following:
* - startup asm routine
* - main()
*/
int main(void)
{
uint8_t pinstate;
/* Write your local variable definition here */
ftm_state_t FTM0_StateStruct1;
/*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
#ifdef PEX_RTOS_INIT
PEX_RTOS_INIT(); /* Initialization of the selected RTOS. Macro is defined by the RTOS component. */
#endif
/*** End of Processor Expert internal initialization. ***/
/* Write your code here */
CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);
CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);
delay_init();
FTM_DRV_Init(INST_FLEXTIMER_MC1, &flexTimer_mc1_InitConfig,&FTM0_StateStruct1); //初始化Tim
INT_SYS_InstallHandler(FTM0_Ovf_Reload_IRQn,&FTM_Feed_WDOG_ISR,(isr_t*)0U); // 加载中断
INT_SYS_EnableIRQ(FTM0_Ovf_Reload_IRQn);
FTM_DRV_InitCounter(INST_FLEXTIMER_MC1, &flexTimer_mc1_TimerConfig);
FTM_DRV_CounterStart(INST_FLEXTIMER_MC1);
WDOG_DRV_Init(INST_WATCHDOG1, &watchdog1_Config0);//初始化WDt
INT_SYS_InstallHandler(WDOG_EWM_IRQn,WDOG_ISR,(isr_t *)0); // 安装看门狗中断
INT_SYS_EnableIRQ(WDOG_EWM_IRQn); //使能中断
PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); // IO初始化
LPUART_DRV_Init(INST_LPUART1, &lpuart1_State, &lpuart1_InitConfig0); //初始化串口
if(POWER_SYS_GetResetSrcStatusCmd(RCM,RCM_WATCH_DOG) == true) // 检查复位原因
{
u1_printf("复位由看门狗导致\r\n");
}
while(1)
{
pinstate = KEY_Proc (0); // 按键检查
if(pinstate ==BTN1_PRES ) // 更改喂狗周期
{
u1_printf("600ms喂狗一次\r\n");
FWDOG = 6;
}
PINS_DRV_TogglePins(PTD, 1 << 15);
PINS_DRV_TogglePins(PTD, 1 << 16);
delay_ms(100);
}
/*** Don't write any code pass this line, or it will be deleted during code generation. ***/
/*** RTOS startup code. Macro PEX_RTOS_START is defined by the RTOS component. DON'T MODIFY THIS CODE!!! ***/
#ifdef PEX_RTOS_START
PEX_RTOS_START(); /* Startup of the selected RTOS. Macro is defined by the RTOS component. */
#endif
/*** End of RTOS startup code. ***/
/*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
for(;;) {
if(exit_code != 0) {
break;
}
}
return exit_code;
/*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/
/* END main */
4.2 串口重定向代码
/*
* 来自品智科技
* S32K系列Printf输出函数
*/
#include"cpu.h"
#include"uart.h"
#include <stdio.h>
#include <string.h>
#include "stdarg.h"
#include <stdint.h>
#include <stdbool.h>
char USART1_TX_BUF[200];
void u1_printf(char* fmt,...)
{
uint32_t bytesRemaining;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART1_TX_BUF,fmt,ap);
va_end(ap);
LPUART_DRV_SendData(INST_LPUART1, (uint8_t *)USART1_TX_BUF, strlen(USART1_TX_BUF)); //发送
while (LPUART_DRV_GetTransmitStatus(INST_LPUART1, &bytesRemaining)
!= STATUS_SUCCESS) {}
}