GD32F303配置SysTick
时间: 2025-08-07 18:59:49 浏览: 4
在GD32F303微控制器上配置SysTick定时器,可以通过以下步骤实现。SysTick定时器是Cortex-M内核的一部分,因此其配置方式与STM32等其他Cortex-M系列MCU类似。以下是基于GD32F303的SysTick配置方法。
### 1. SysTick定时器的基本特性
SysTick定时器是一个24位递减计数器,可以用于生成周期性中断,常用于实现系统级的延时或任务调度。它支持两种时钟源:
- **HCLK**(系统时钟)
- **HCLK/8**(系统时钟除以8)
通过配置控制寄存器,可以选择时钟源、使能中断以及启动定时器。
### 2. 配置步骤
#### (1) 设置SysTick重装载值
SysTick的重装载值由 `SysTick->LOAD` 寄存器设置。假设系统时钟为 `SystemCoreClock`,若希望生成1ms的延时,则可计算如下:
```c
SysTick->LOAD = SystemCoreClock / 1000 - 1; // 1ms reload value
```
该表达式将SysTick的计数周期设置为1ms。
#### (2) 配置SysTick控制寄存器
接下来配置SysTick控制寄存器 `SysTick->CTRL`,选择时钟源并使能中断(如果需要):
```c
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | // 使用HCLK作为时钟源
SysTick_CTRL_TICKINT_Msk | // 使能中断
SysTick_CTRL_ENABLE_Msk; // 启动定时器
```
- `SysTick_CTRL_CLKSOURCE_Msk`:选择HCLK作为时钟源;
- `SysTick_CTRL_TICKINT_Msk`:使能SysTick中断;
- `SysTick_CTRL_ENABLE_Msk`:启动SysTick计数器。
#### (3) 实现延时函数
可以使用 `SysTick->VAL` 寄存器来读取当前计数值,并结合中断或轮询方式实现延时函数。例如,实现一个简单的毫秒级延时函数如下:
```c
void delay_ms(uint32_t ms) {
for (; ms > 0; ms--) {
SysTick->VAL = 0; // 清空当前计数值
while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0); // 等待计数到0
}
}
```
该函数通过轮询方式实现延时,适用于裸机环境。
### 3. 使用中断方式实现系统滴答
若需实现系统级滴答(如RTOS中的时间基准),可在SysTick_Handler中断服务函数中进行处理:
```c
void SysTick_Handler(void) {
// 用户自定义处理,如增加系统时间计数器
}
```
在配置SysTick时,需确保 `SysTick_CTRL_TICKINT_Msk` 被置位以使能中断。
### 4. 完整配置示例
以下是一个完整的SysTick初始化函数示例,适用于GD32F303系列MCU:
```c
#include "gd32f30x.h"
void systick_config(void) {
// 设置SysTick为1ms中断一次
SysTick->LOAD = SystemCoreClock / 1000 - 1;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
}
void delay_ms(uint32_t ms) {
for (; ms > 0; ms--) {
SysTick->VAL = 0;
while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0);
}
}
int main(void) {
systick_config();
while (1) {
// 主循环
delay_ms(500); // 延时500ms
}
}
```
### 5. 注意事项
- 确保 `SystemCoreClock` 的值正确反映了当前系统时钟频率。
- 若使用中断方式,需在中断向量表中正确注册 `SysTick_Handler`。
- 若系统时钟频率发生变化,需重新计算 `SysTick->LOAD` 的值以保持定时精度。
阅读全文
相关推荐




















