基于stm32f103编写一段利用滴答定时器定时100ms的中断服务函数
时间: 2024-02-17 12:03:15 浏览: 59
好的,下面是可以用于基于stm32f103的滴答定时器定时100ms的中断服务函数的代码:
```c
void SysTick_Handler(void)
{
static uint32_t ticks = 0;
ticks++;
if(ticks >= 100)
{
ticks = 0;
// 在这里添加你想要执行的代码
}
}
```
在这个中断服务函数中,我们使用了一个静态变量 `ticks` 来计数,每次进入中断服务函数就将 `ticks` 加1,当 `ticks` 达到100时,就将 `ticks` 重置为0,并执行你想要执行的代码。
需要注意的是,为了使该中断服务函数能够正常工作,需要在初始化代码中开启滴答定时器,并设置中断周期为1ms,代码如下:
```c
void SysTick_Init(void)
{
SysTick->CTRL &= ~(SysTick_CTRL_ENABLE_Msk); // 关闭滴答定时器
SysTick->LOAD = SystemCoreClock / 1000; // 设置中断周期为1ms
SysTick->VAL = 0;
SysTick->CTRL |= (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk); // 开启滴答定时器中断
}
```
将上述代码添加到你的工程中,并在需要的地方调用 `SysTick_Init()` 函数进行初始化即可。
相关问题
STM32F103滴答定时器 1微秒延时
对于STM32F103微秒级延时,可以使用滴答定时器(SysTick)来实现。SysTick定时器是一个24位倒计数器,它可以用于生成固定时间间隔的中断。下面是一个示例代码,可以实现1微秒的延时:
```c
#include "stm32f10x.h"
// 初始化SysTick定时器
void SysTick_Init(void) {
// 设置SysTick的重载值为72-1(72MHz时钟下1微秒)
SysTick->LOAD = SystemCoreClock / 1000000 - 1;
// 设置SysTick为系统时钟源,并启动定时器
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
}
// 微秒级延时函数
void delay_us(uint32_t us) {
uint32_t start = SysTick->VAL;
uint32_t count = us * (SystemCoreClock / 1000000);
while ((SysTick->VAL - start) < count) {
// 等待延时时间到达
}
}
int main() {
// 初始化SysTick定时器
SysTick_Init();
// 微秒级延时1秒
delay_us(1000000);
while (1) {
// 主循环
}
}
```
在上述代码中,我们首先通过`SysTick_Init()`函数初始化了SysTick定时器,将其设置为1微秒的重载值,并启动了定时器。然后,通过`delay_us()`函数实现了所需的微秒级延时。在`main()`函数中,我们可以调用`delay_us()`函数来实现需要的延时。
请注意,该方法是通过循环等待的方式实现延时,这可能会导致较大的误差。如果需要更精确的延时,可以考虑使用其他定时器或外部设备来实现。
STM32F103滴答定时器 毫秒微秒延时
对于STM32F103系列微控制器的滴答定时器,可以使用它来实现毫秒和微秒级的延时。下面是两个简单的函数示例,用于实现延时。
首先,我们需要启用滴答定时器。可以使用下面的代码片段来初始化滴答定时器:
```c
void SysTick_Init(void)
{
SysTick->LOAD = (uint32_t)(SystemCoreClock / 1000) - 1; // 设置滴答定时器的重装载值,实现1ms的中断一次
SysTick->VAL = 0; // 清空当前计数值
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; // 开启滴答定时器
}
```
接下来,我们可以定义一个函数来实现毫秒级延时:
```c
void delay_ms(uint32_t ms)
{
uint32_t start = SysTick->VAL; // 记录当前计数值
uint32_t target = start - (ms * (SystemCoreClock / 1000)); // 计算目标计数值
if (start < target) // 处理计数器溢出的情况
{
while (SysTick->VAL > start || SysTick->VAL <= target);
}
else
{
while (SysTick->VAL > start && SysTick->VAL <= target);
}
}
```
最后,我们可以定义一个函数来实现微秒级延时:
```c
void delay_us(uint32_t us)
{
uint32_t start = SysTick->VAL; // 记录当前计数值
uint32_t target = start - (us * (SystemCoreClock / 1000000)); // 计算目标计数值
if (start < target) // 处理计数器溢出的情况
{
while (SysTick->VAL > start || SysTick->VAL <= target);
}
else
{
while (SysTick->VAL > start && SysTick->VAL <= target);
}
}
```
使用这两个函数,你可以在STM32F103微控制器上实现所需的毫秒和微秒级延时。请注意,这些函数会阻塞程序的执行,直到延时结束。
阅读全文