---
/*!
* @文件 readme.txt
*
* @brief 本文件是例行说明
*
* @版本 V1.0.0 版本
*
* @日期 2024-03-20
*
* @注意
*
* 版权所有 (C) 2024 Geehy 半导体公司
*
* 除非符合GEEHY COPYRIGHT NOTICE(GEEHY软件包许可),否则不得使用此文件。
*
* 该程序仅供参考,其分发希望对客户开发自己的软件有所帮助和指导。除非适用法律要求或书面同意,否则该程序以“按原样”为基础分发,没有任何明示或暗示的担保或条件。
* 有关许可证下的控制权限和限制,请参阅GEEHY软件包许可。
*/
&par 示例描述
本演示展示了如何通过快速测试配置看门狗定时器(WDT)。
上电时,开始WDT_TEST_LOW测试;
被WDT_TEST_LOW重置后,开始WDT_TEST_HIGH测试;
被WDT_TEST_HIGH重置后,开始WDT_TEST_USER测试,并通过systick中断喂狗。
如果按下KEY1,停止喂狗,系统将被WDT_TEST_USER重置,并禁用WDT。
现象:
如果开始WDT_TEST_LOW,打开LED_BLUE。
如果开始WDT_TEST_HIGH,打开LED_BLUE。
如果开始WDT_TEST_USER,打开LED_GREEN。
如果被WDT_TEST_USER重置,打开LED_RED。
&par 硬件描述
LPUART1配置如下:
- 发射:PC7,接收:PC6
- 波特率 = 115200波特
- 字长 = 8位
- 一个停止位
- 无奇偶校验
- 硬件流控制禁用(RTS和CTS信号)
- 发送启用
&par 目录内容
&par IDE环境
- MDK-ARM V5.36.0.0 版本
- EWARM 版本 v8.50.5.26295
&par 硬件和软件环境
- 本示例运行在G32A1465评估设备上。
```c
/* Includes */
#include "stdio.h"
#include "main.h"
#include "board.h"
#include "system_g32a1xxx.h"
#include "user_config.h"
#include "g32a1xxx_power.h"
/** @defgroup WDT_FastTest_Functions Functions
@{
*/
static void SysTick_Init(void);
int main(void)
{
STATUS_T status; // 定义状态变量
uint32_t timeout = 0xFFFFFFFFU; // 定义超时变量并初始化为最大值
/* Init clock config */
// 初始化时钟配置
CLOCK_SYS_ClockManagerInit(g_clockConfigsArr, CLOCK_CONFIG_CNT,
g_clockCallbacksArr, CLOCK_CALLBACK_CNT);
CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);
LED_Init(); // 初始化LED
COM_Init(); // 初始化通信接口
BTN_Init(); // 初始化按钮
if((POWER_SYS_ReadResetSrcStatus(RMU, RMU_BY_POWER_ON) == true) && ((WDT->CSTS.reg & 0x00000018)== 0x00U))
{
// 如果系统由电源开启且WDT未被触发,则进行低电平测试
status = WDT_Init(WDT_INSTANCE, &wdtConfig); // 初始化看门狗定时器
if(status == STATUS_SUCCESS)
{
LED_On(LED_BLUE); // 打开蓝色LED表示进入低电平测试
/* LOW test */
printf("WDT_TEST_LOW\r\n"); // 打印低电平测试信息
WDT_ConfigTestMode(WDT_INSTANCE, WDT_TEST_LOW); // 配置看门狗为低电平测试模式
WDT_ConfigTimeout(WDT_INSTANCE, 0xAAAAU); // 设置看门狗超时时间
while(timeout--); /* CNT counts from 0xXX00 to 0xXXAA, and resets the MCU. */
// 等待计数器从0xXX00到0xXXAA,然后重置MCU
}
}
else if((POWER_SYS_ReadResetSrcStatus(RMU, RMU_BY_WATCH_DOG) == true))
{
// 如果系统由看门狗复位,则根据不同的测试阶段进行处理
if (((WDT->CSTS.reg & 0x00000018)>>3U)== 0x02U) // 低电平测试完成
{
// 进行高电平测试
status = WDT_Init(WDT_INSTANCE, &wdtConfig); // 初始化看门狗定时器
if(status == STATUS_SUCCESS)
{
LED_On(LED_BLUE); // 打开蓝色LED表示进入高电平测试
/* HIGH test */
printf("WDT_TEST_HIGH\r\n"); // 打印高电平测试信息
WDT_ConfigTestMode(WDT_INSTANCE, WDT_TEST_HIGH); // 配置看门狗为高电平测试模式
WDT_ConfigTimeout(WDT_INSTANCE, 0xAAAAU); // 设置看门狗超时时间
while(timeout--); /* CNT counts from 0x00XX to 0xAAXX, and resets the MCU. */
// 等待计数器从0x00XX到0xAAXX,然后重置MCU
}
}
else if (((WDT->CSTS.reg & 0x00000018)>>3U)== 0x03U) /* 低电平测试和高电平测试均已完成 */
{
// 进行用户测试
status = WDT_Init(WDT_INSTANCE, &wdtConfig); // 初始化看门狗定时器
if(status == STATUS_SUCCESS)
{
LED_On(LED_GREEN); // 打开绿色LED表示进入用户测试
/* USER test */
printf("WDT_TEST_USER\r\n"); // 打印用户测试信息
WDT_ConfigTestMode(WDT_INSTANCE, WDT_TEST_USER); // 配置看门狗为用户测试模式
WDT_ConfigTimeout(WDT_INSTANCE, 0x0AAAU); // 设置看门狗超时时间
SysTick_Init(); // 初始化系统滴答定时器
}
}
else if (((WDT->CSTS.reg & 0x00000018)>>3U)== 0x01U) // 用户测试完成
{
// 打印测试完成信息并禁用看门狗定时器
printf("******************************** \r\n");
printf("Reset by WDT_TEST_USER, test finished, disable WDT now \r\n");
printf("\r\n");
WDT_DeInit(WDT_INSTANCE); // 禁用看门狗定时器
LED_On(LED_RED); // 打开红色LED表示测试完成
}
}
while(1)
{
// 如果按下KEY1按钮,则停止喂狗并禁用系统滴答定时器
''' c
{
while(BTN_GetState(BUTTON_KEY1) == 0);/* wait for realse key */
G32_SysTick->CSR.reg = 0U; // 禁用系统滴答定时器
printf("Stop to feed WDT.\r\n"); // 打印停止喂狗信息
}
}
}
void SysTick_Init(void)
{
SystemCoreClockUpdate(); // 更新系统核心时钟频率
/** SystemFrequency / 1000 = 1ms */
if (SysTick_Config(SystemCoreClock / 1000)) // 配置系统滴答定时器每毫秒中断一次
{
while(BTN_GetState(BUTTON_KEY1) == 0);/* 等待真实密钥 */
}
}
```
|