# 一、结构体

typedef enum{
    WAITING,//等待新峰值
    MONITORING,//持续检测新峰值
}PeakState;

PeakState peak_state = WAITING;

while(1)
{
switch(peak_state)
        {
            case WAITING://发现潜在新峰值
                if(V > MH)
                {
                    candidate_max = V;
                    start_tick = HAL_GetTick();//开始计时
                    peak_state = MONITORING;
                }
                break;
            case MONITORING:
                if(V > candidate_max)//如果还有更大的,重置计时,但状态仍然是检查,知道稳定超过2s,记录最大值
                {
                    candidate_max = V;
                    start_tick = HAL_GetTick();//重置计时
                }
                else if(V < candidate_max)
                {
                    candidate_max = 0;
                    peak_state = WAITING;
                }
                else if(HAL_GetTick() - start_tick >= 2000)
                {
                    MH = candidate_max;
                    candidate_max = 0;
                    peak_state = WAITING;
                }
                break;
            default:
                break;
        }
}

# 二、中断

​ 在例如gd32f4xx_it.h 文件中都是中断函数,定义各种异常和中断的默认处理函数(如 SysTick_Handler)。但标准库本身并未直接提供 uwTick 变量(这是STM32 HAL库的特性)。

​ 如何在GD32F4xx中实现类似 uwTick 的功能?

# 1. 手动实现全局计时变量

在GD32的标准库中,你需要自行定义一个全局变量(如 uwTick)并在 SysTick_Handler 中递增它:

// 在gd32f4xx_it.c中添加以下代码
volatile uint32_t uwTick = 0;  // 全局计时变量

void SysTick_Handler(void)
{
    uwTick++;  // 每毫秒递增一次(假设SysTick配置为1kHz)
}

# 2. 初始化SysTick定时器

在系统初始化时配置SysTick为1ms中断(典型配置):

#include "gd32f4xx.h"

void systick_config(void)
{
    /* 系统时钟频率(根据实际情况修改) */
    uint32_t system_core_clock = 168000000;  // 例如GD32F4xx主频168MHz
    
    /* 配置SysTick为1ms中断 */
    SysTick_Config(system_core_clock / 1000);  // 168MHz/1000 = 168000次计数 = 1ms
}

# 3. 实现延时函数

基于 uwTick 实现类似STM32 HAL的 HAL_Delay()

void delay_ms(uint32_t ms)
{
    uint32_t tickstart = uwTick;
    while ((uwTick - tickstart) < ms) {
        // 等待
    }
}

# 关键点说明

  1. SysTick配置
    • SysTick_Config() 是GD32标准库提供的函数(在 core_cm4.h 中定义),直接配置SysTick时钟和重载值。
    • 确保 system_core_clock 的值与实际系统主频一致。
  2. 中断优先级
    • SysTick默认是内核中断,优先级较低,一般无需额外配置。
  3. 与STM32 HAL的区别
    • STM32 HAL库会自动生成 uwTickHAL_Delay(),而GD32标准库需要用户手动实现。

# 三、地址形函数