stm32f103例程代码延时
时间: 2025-01-03 19:41:19 浏览: 11
### STM32F103 延时函数 示例代码
对于STM32F103单片机而言,延时功能可以通过系统定时器(SysTick)来实现。下面展示的是基于SysTick的微秒级、毫秒级以及秒级别的延时函数。
#### 头文件定义
首先,在头文件`sys_tick.h`中声明延时函数接口:
```c
#ifndef _BSP_SYS_TICK_H_
#define _BSP_SYS.Tick_H_
#include "stm32f10x.h"
void Delay_us(uint32_t xus);
void Delay_ms(uint32_t xms);
void Delay_s(uint32_t xs);
#endif /* _BSP_SYS_TICK_H_ */
```
#### 实现文件中的具体实现
接着是在`.c`文件内的实际编码部分:
```c
#include "sys_tick.h"
#include "misc.h"
// SysTick初始化设置,通常在启动文件或主程序开始处调用一次即可.
void SysTick_Init(void){
// 配置SysTick中断优先级为最低
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_SetPriority(SysTick_IRQn, 3);
}
/**
* @brief 微妙级别延迟函数
*
* @param nus 要等待的时间(单位: us)
*/
void Delay_us(uint32_t nus){
uint32_t ticks;
uint32_t tellapsed;
uint32_t reload;
// 记录当前计数值
ticks = (nus * (SystemCoreClock / 1000000UL));
if(ticks > 16777215){
ticks = 16777215;
}
reload = SysTick->LOAD;
SysTick->VAL = 0x00; // 清空计数器
SysTick->LOAD = ticks - 1;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;
do{
tellapsed = ((reload - SysTick->VAL)&0xFFFFFF);
}while(tellapsed != reload);
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0x00;
}
/**
* @brief 毫秒级别延迟函数
*
* @param nms 要等待的时间(单位: ms)
*/
void Delay_ms(uint32_t nms){
uint32_t i;
for(i=0;i<nms;i++){
Delay_us(1000); // 使用Delay_us()完成更精确控制
}
}
/**
* @brief 秒级别延迟函数
*
* @param ns 要等待的时间(单位: s)
*/
void Delay_s(uint32_t ns){
uint32_t j;
for(j=0;j<ns;j++){
Delay_ms(1000); // 利用已经写好的Delay_ms()
}
}
```
上述代码展示了如何利用STM32内部资源——特别是SysTick定时器——创建灵活且可靠的延时机制[^1]。
阅读全文