stm32f103滴答定时器
时间: 2023-09-11 14:05:36 浏览: 93
STM32F103的滴答定时器是一个16位定时器,它被称为SysTick定时器。它是一个系统定时器,用于提供基本的操作系统定时器功能。
SysTick定时器有如下特点:
1. 定时精度为1us。
2. 可以配置为自动重载模式或者单次模式。
3. 可以配置中断触发或者不触发中断。
4. 可以配置时钟源为内部时钟(HCLK)或者外部时钟。
要在STM32F103上使用SysTick定时器,你需要进行以下步骤:
1. 使能SysTick定时器:通过设置STK_CTRL寄存器的ENABLE位实现。
2. 配置SysTick定时器的时钟源:通过设置STK_CTRL寄存器的CLKSOURCE位实现。
3. 配置SysTick定时器的加载值:通过设置STK_LOAD寄存器的值实现,该值决定定时器的溢出时间。
4. 配置SysTick定时器的中断:通过设置STK_CTRL寄存器的TICKINT位实现。
在使用SysTick定时器后,你可以通过读取STK_VAL寄存器来获取当前计数值,通过读取STK_CTRL寄存器的COUNTFLAG位来判断计数器是否溢出。
希望以上信息能对你有所帮助。如有更多问题,请随时提问!
相关问题
stm32f103 滴答定时器微秒精确计时
在STM32F103微控制器中,滴答定时器是一个基于硬件的计时器,可以用于进行微秒精确计时。它的计时单位可以根据系统的时钟频率进行调整。
要实现微秒精确计时,首先需要初始化滴答定时器。可以使用SysTick_Config函数来配置SysTick定时器的时钟和重载值。
在初始化完成后,可以使用SysTick->VAL来获取当前计数器的数值。该寄存器的值是一个递减的计数器,它在滴答定时器的时钟周期内减少。默认情况下,滴答定时器的时钟频率等于系统时钟频率的1/8。
为了实现微秒级计时,可以通过计算当前计数器的值与重载值的差来获取经过的滴答定时器周期数。由于滴答定时器的时钟频率为系统时钟频率的1/8,因此可以通过简单的乘法运算将周期数转换为微秒。
例如,如果系统时钟为72MHz,滴答定时器的重载值为72-1(因为计数器从0开始),那么可以使用以下代码来进行微秒计时:
```c
void delay_us(uint32_t us) {
uint32_t start = SysTick->VAL;
while((SysTick->VAL - start) < (us * 9)); //将周期数乘以9来转换为微秒
}
```
在上述代码中,先记录开始计数器的数值,然后在循环中检查当前计数器的值与开始计数器的差,当差值大于等于所需的微秒数乘以9时,循环结束。这样就实现了微秒级的精确计时。
需要注意的是,滴答定时器的计数器是一个32位的寄存器,在超过最大计数值后会回绕为0。因此,在进行微秒计时时,需要考虑到计数器的溢出情况,并根据具体的应用场景进行处理。
希望以上信息对您有所帮助!
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微控制器上实现所需的毫秒和微秒级延时。请注意,这些函数会阻塞程序的执行,直到延时结束。