基于stm32f103编写一段利用滴答定时器定时100ms的中断服务函数
时间: 2024-02-17 10:03:15 浏览: 22
好的,下面是可以用于基于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()` 函数进行初始化即可。
相关问题
stm32f103zet6中系统滴答器和通用定时器原理
STM32F103ZET6是一款基于ARM Cortex-M3内核的微控制器,它具有丰富的外设资源,包括系统滴答器和通用定时器。下面我简单介绍一下这两种外设的原理:
1. 系统滴答器
系统滴答器是STM32F103ZET6中一个重要的定时器,它可以用于产生固定时间间隔的中断信号。系统滴答器的原理比较简单,它的时钟源来自内部的RC振荡器或外部的晶体振荡器,通过预分频和计数器配置,可以产生具有不同时间间隔的中断信号。在使用中,我们可以在中断处理函数中进行一些周期性的任务,比如定时更新LED灯的状态、定时采集传感器数据等。
2. 通用定时器
通用定时器是STM32F103ZET6中功能最为强大的定时器之一,它可以用于产生PWM波、测量脉冲宽度等多种应用。通用定时器包括四个独立的定时器(TIM2、TIM3、TIM4和TIM5),每个定时器都有多个通道,可以独立地产生不同的PWM波形。通用定时器的原理是,它的时钟源来自APB1总线时钟,可以通过预分频和计数器配置,产生具有不同频率和占空比的PWM波形。在使用中,我们可以通过改变预分频、计数器和CCR寄存器的值,来调整PWM波的频率和占空比,从而实现不同的应用。
希望我的回答能够帮助你理解STM32F103ZET6中系统滴答器和通用定时器的原理。如果你还有其他问题,可以继续问我哦!
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微控制器上实现所需的毫秒和微秒级延时。请注意,这些函数会阻塞程序的执行,直到延时结束。