stm32f103c8t6 systick delay
时间: 2025-05-13 17:52:05 浏览: 24
### STM32F103C8T6 上使用 SysTick 实现延迟功能
SysTick 是 ARM Cortex-M3 微控制器中的一个定时器模块,常用于实现简单的延时和时间管理功能。在 STM32F103C8T6 的开发中,可以通过配置 SysTick 来实现精确的毫秒级或微秒级延迟。
以下是基于 HAL 库的一个典型 SysTick 延迟实现方法:
#### 配置 SysTick 定时器
SysTick 使用系统时钟作为其计数源,默认情况下,它的频率等于系统的主频(SystemCoreClock)。为了实现精确的时间间隔,需设置重装载寄存器值以及初始化回调函数。
```c
#include "stm32f1xx_hal.h"
volatile uint32_t TimingDelay;
void SysTick_Init(void) {
// 设置每 1ms 触发一次中断 (假设 SystemCoreClock = 72MHz)
if (HAL_SYSTICK_Config(SystemCoreClock / 1000) != HAL_OK) {
while(1);
}
// 将优先级设为最低
HAL_NVIC_SetPriority(SysTick_IRQn, 3, 0);
}
// SysTick 中断服务程序
void SysTick_Handler(void) {
if(TimingDelay != 0){
TimingDelay--;
}
}
```
上述代码片段实现了 SysTick 初始化并设置了每 1 毫秒触发一次中断的功能[^1]。`TimingDelay` 变量是一个全局变量,用来记录剩余的等待时间。
#### 创建延迟函数
利用 `TimingDelay` 和 `SysTick_Handler()` 函数,可以创建一个通用的阻塞型延迟函数。
```c
void Delay_ms(uint32_t nTime) {
TimingDelay = nTime;
while(TimingDelay != 0); // 等待直到 TimingDelay 被清零
}
```
此函数会阻塞当前线程执行,直至指定的毫秒数过去为止。它适用于单任务环境下的简单应用场合。
如果需要更复杂的多任务调度,则推荐采用 RTOS 提供的服务来代替手动编写延迟逻辑,比如 uC/OS-II 或者 uC/OS-III 所支持的任务延迟接口 os_delay() [^2]。
#### 结合 UART 输出测试
当完成了基本的延时功能之后,还可以尝试将其应用于实际场景之中,例如控制 LED 的闪烁或者通过串口打印信息等操作。下面展示了一个例子,在这里我们不仅调用了前面定义好的延时函数还加入了标准 C 库风格的标准输出宏 printf 支持[^3]:
```c
int fputc(int ch, FILE *f) {
uint8_t temp[1] = {ch};
HAL_UART_Transmit(&huart1, temp, sizeof(temp), HAL_MAX_DELAY);
return ch;
}
int main(void) {
HAL_Init();
SysTick_Init();
__IO uint8_t counter = 0;
while (1) {
printf("Counter Value:%d\r\n",counter++);
GPIO_WriteBit(GPIOA,GPIO_Pin_5,Bit_SET); /* Turn ON the LED */
Delay_ms(500);
GPIO_WriteBit(GPIOA,GPIO_Pin_5,Bit_RESET); /* Turn OFF the LED */
Delay_ms(500);
}
}
```
以上展示了如何在一个基础项目里集成 SysTick 并配合其他外设一起工作的情况。值得注意的是这里的 `__IO`, `GPIO_WriteBit` 等都是旧版固件库里的 API ,如果是最新版本则应该替换成为对应的新形式如 `HAL_GPIO_TogglePin`.
阅读全文
相关推荐


















