自学S32K144(9)——WDT

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)  {}
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值