stm32使用滴答定时器延时LED灯亮
时间: 2023-12-08 08:04:47 AIGC 浏览: 187
以下是使用滴答定时器延时LED灯亮的步骤:
1. 首先,需要在代码中包含stm32f1xx_hal.h头文件,以便使用HAL库函数。
2. 然后,需要初始化滴答定时器。可以使用以下代码:
```c
HAL_InitTick(TICK_INT_PRIORITY);
```
3. 接下来,需要配置滴答定时器。可以使用以下代码:
```c
HAL_SYSTICK_Config(SystemCoreClock / 1000);
```
这将使滴答定时器的时钟频率为系统时钟频率的1/1000。
4. 然后,可以使用以下代码实现延时功能:
```c
HAL_Delay(1000); // 延时1秒
```
这将使程序延时1秒。
5. 最后,可以使用以下代码控制LED灯的亮灭:
```c
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 点亮LED灯
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 熄灭LED灯
```
这将使LED灯点亮和熄灭。
相关问题
stm32systick滴答定时器
### STM32 SysTick滴答定时器使用教程
#### 介绍
SysTick 是 ARM Cortex-M 系列处理器中的一个简单易用的倒计数定时器,广泛应用于嵌入式系统中作为时间基准。该定时器包含四个主要寄存器用于配置和监控其行为[^1]。
#### 主要特性
- **24位递减计数器**:当计数值达到零时触发中断并重新加载预设值。
- **灵活的时间间隔设置**:支持从几微秒到几百毫秒不等的各种延迟需求。
- **低开销实现精准延时功能**:相比其他硬件定时器更加高效地利用 CPU 资源[^3]。
#### 初始化过程
为了初始化 SysTick 定时器,在程序启动阶段通常会调用 `delay_init()` 函数来计算不同单位时间内所需的滴答次数,并关闭外部时钟源以便于后续调整[^4]:
```c
void delay_init(){
SysTick->CTRL &= ~(1<<2); // 关闭外设时钟
fac_s = SystemCoreClock / 8; // 计算每秒钟对应的 Systick 数量
fac_ms = fac_s / 1000; // 每毫秒对应多少次 Systick 中断
fac_us = fac_ms / 1000; // 每微秒对应多少次 Systick 中断
}
```
上述代码片段展示了如何基于当前系统的主频 (`SystemCoreClock`) 来确定每一秒、每一毫秒以及每一微秒所经历的具体滴答数目。这里假设每次溢出产生的事件频率大约为主频除以八的结果。
#### 延迟函数设计
通过设定合适的重装载值 (RELOAD),可以精确控制等待多久才会发生下一次中断请求 IRQ 或者单纯依靠轮询方式查询是否已经到达目标时刻。下面给出了一种常见的微秒级延迟算法实现方法:
```c
// 微秒级别延时函数定义
void delay_us(u32 nus){
u32 temp;
SysTick->LOAD=nus*fac_us; // 设置比较匹配值
SysTick->VAL=0x00; // 清空当前计数值
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; // 开启计数
do{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); // 判断是否已过期
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;// 关闭计数
SysTick->VAL=0X00; // 清空计数器
}
```
此部分实现了对指定时间段内的阻塞型等待逻辑,其中涉及到几个重要的操作步骤:
- 配置 LOAD 寄存器为期望经过的时间长度;
- 将 VAL 设定成初始状态(通常是全清零);
- 启动控制器开始向下计数直至归零;
- 不断循环检测直到满足条件为止;
- 最终停止计数并将内部变量复原至默认态。
#### 应用场景举例
除了基本的软件延时之外,SysTick 还经常被用来充当 RTOS 的调度依据或是驱动某些周期性的任务执行,如 LED 流水灯效果展示、传感器数据采集等场合均可见其身影。
STM32F103 滴答定时器
### STM32F103 滴答定时器实现与配置教程
#### 什么是滴答定时器?
滴答定时器(SysTick Timer)是一个基于 ARM Cortex-M 内核的硬件定时器,广泛用于嵌入式开发中的时间管理。它能够提供高精度的时间延迟和周期性的中断触发功能,在 STM32F103 中常用来实现精确延时[^1]。
#### 配置方法
以下是通过 SysTick 实现精确延时的具体配置过程:
1. **初始化 SysTick 定时器**
初始化函数通常命名为 `Systick_Config` 或类似的名称,其主要目的是设置重装载寄存器值以及使能 SysTick 计数器和中断。
```c
void Systick_Config(uint32_t ticks) {
if (ticks > 0) {
SysTick->LOAD = ticks - 1; // 设置重装载值
SysTick->VAL = 0; // 清零当前计数值
SysTick->CTRL = 0x07; // 启用 SysTick 并使用系统时钟作为源
}
}
```
上述代码中,`ticks` 参数表示每次溢出所需的时间间隔,单位由系统时钟决定[^4]。
2. **编写延时函数**
基于上述初始化函数,可以进一步定义一个延时函数来控制具体毫秒级或微秒级的延时操作。
```c
void delay_ms(uint32_t ms) {
uint32_t reload_value;
reload_value = SystemCoreClock / 1000; // 根据系统核心频率计算每毫秒对应的重载值
while(ms--) {
Systick_Config(reload_value); // 调用初始化函数并等待一次溢出完成
while(!(SysTick->CTRL & 0x10000)); // 等待 COUNTFLAG 变为有效状态
}
}
```
这里利用了循环调用的方式实现了指定长度的延时效果[^2]。
3. **注意事项**
- 在实际应用过程中需要注意不同型号 MCU 的最大支持范围及其对应参数调整;
- 如果项目中有其他更高优先级的任务,则可能会影响最终的实际延时时长准确性[^3]。
#### 总结
通过对以上内容的学习可知,合理运用好 STM32 提供的各种外设资源可以帮助开发者更高效便捷地构建自己的应用程序框架结构;而像这样简单易懂又实用性强的小技巧更是值得每一位初学者深入掌握!
```c
// 示例完整代码片段
void Systick_Config(uint32_t ticks);
void delay_ms(uint32_t ms);
int main(void){
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟
Systick_Config(SystemCoreClock/1000);// 设定一秒钟内的滴答次数
while(1){
GPIO_TogglePin(GPIOA,GPIO_PIN_5); // 切换LED灯状态
delay_ms(500); // 延迟半秒
}
}
```
阅读全文
相关推荐














