打印
[活动]

【G32A1465测评】WDT_FastTest

[复制链接]
503|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
丙丁先生|  楼主 | 2024-12-15 10:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
---

/*!
* @文件 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);/* 等待真实密钥 */
    }
}
```



使用特权

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

本版积分规则

671

主题

2398

帖子

5

粉丝