# 一、结构体
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) {
// 等待
}
}
# 关键点说明
- SysTick配置
SysTick_Config()是GD32标准库提供的函数(在core_cm4.h中定义),直接配置SysTick时钟和重载值。- 确保
system_core_clock的值与实际系统主频一致。
- 中断优先级
- SysTick默认是内核中断,优先级较低,一般无需额外配置。
- 与STM32 HAL的区别
- STM32 HAL库会自动生成
uwTick和HAL_Delay(),而GD32标准库需要用户手动实现。
- STM32 HAL库会自动生成

