stm32,使用 SysTick 定时器,实现 1ms 的延时,代码
时间: 2024-05-11 19:15:15 浏览: 7
如下:
```c
void delay_ms(uint32_t n)
{
uint32_t start = SysTick->VAL;
uint32_t ticks = SystemCoreClock / 1000;
while (n--)
{
while ((SysTick->VAL - start) & 0x800000);
start += ticks;
}
}
```
这是实现 1ms 延时的常用代码。你可以根据需要在自己的程序中使用。有没有感觉很方便呢?
相关问题
编写stm32延时中断 利用systick定时器
在STM32中,可以使用SysTick定时器来实现延时中断。SysTick是一个24位计数器,可以用作系统时钟或用于延迟。
以下是一个简单的例子,演示如何使用SysTick定时器实现延时中断。
首先,需要在CubeMX中启用SysTick定时器,并设置其时钟源和计数值。在此例中,假设SysTick的时钟源为CPU时钟,计数值为72000(这意味着SysTick每秒将递减72000次)。
在代码中,需要定义一个全局变量来记录延时的时间:
```
volatile uint32_t delay_time = 0;
```
然后,在SysTick中断处理程序中,可以递减计数器并检查是否已经到达零。如果到达零,就可以执行所需的操作,并重置计数器。
```
void SysTick_Handler(void)
{
if(delay_time > 0)
{
delay_time--;
}
}
```
接下来,可以定义一个延时函数,该函数将使用SysTick定时器来实现延时中断。该函数将设置delay_time变量,并等待SysTick中断处理程序将其递减为零。
```
void delay_ms(uint32_t ms)
{
delay_time = ms;
while(delay_time > 0);
}
```
最后,可以在主函数中调用delay_ms函数来实现延时中断:
```
int main(void)
{
// 初始化代码
while(1)
{
// 执行其他操作
delay_ms(1000); // 延时1秒
}
}
```
这样,每次调用delay_ms函数时,程序将等待1秒钟,直到SysTick中断处理程序将delay_time递减为零。在此期间,可以执行其他操作,而不必等待延时完成。
写一段STM32F103ZET6 Systick定时器延时程序
以下是一段基于STM32F103ZET6 Systick定时器的延时程序:
```
#include "stm32f10x.h"
void delay_ms(uint32_t ms) {
uint32_t ticks = ms * (SystemCoreClock / 1000);
SysTick->LOAD = ticks - 1;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0);
SysTick->CTRL = 0;
}
int main(void) {
// 初始化代码
while (1) {
// 业务代码
delay_ms(1000); // 延时1秒
}
}
```
在该程序中,我们定义了一个 `delay_ms` 函数来进行延时操作。该函数接收一个 `uint32_t` 类型的参数 `ms`,表示需要延时的毫秒数。
在函数内部,我们首先通过 `SystemCoreClock` 宏获取系统时钟频率,然后根据 `ms` 参数计算出需要延时的时钟周期数,赋值给 `SysTick->LOAD` 寄存器。接着,我们将 `SysTick->VAL` 寄存器清零,以确保计数器从零开始计数。最后,我们将 `SysTick->CTRL` 寄存器的 `ENABLE` 位设置为1,启动Systick定时器计数。同时,我们使用一个循环,不断检查 `SysTick->CTRL` 寄存器的 `COUNTFLAG` 位,直到计数器计满,即延时完成。最后,我们将 `SysTick->CTRL` 寄存器清零,停止计数器计数。
在主函数中,我们可以通过调用 `delay_ms` 函数来实现延时操作。例如,我们可以将其放在一个无限循环中,每隔一段时间执行一次延时操作。这样,我们就可以在程序中实现各种需要延时操作的业务逻辑了。