stm32f103rct6利用内部时钟延时1us的函数
时间: 2024-05-04 10:20:57 浏览: 8
stm32f103rct6的内部时钟频率为72MHz,因此可以利用SysTick定时器来实现1us的延时。
以下是一个简单的函数实现:
```C
void delay_us(uint32_t us)
{
SysTick->LOAD = us * (SystemCoreClock / 1000000); // 设置定时器装载值
SysTick->VAL = 0; // 清空计数器
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk; // 启用定时器
while((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0); // 等待计数器溢出
SysTick->CTRL = 0; // 禁用定时器
}
```
该函数将延时时间us转换为定时器的装载值,并启用定时器进行计数。当计数器溢出时,函数会退出并禁用定时器。需要注意的是,该函数可能会有一定的误差,因为SysTick定时器的时钟源来自内部时钟,而内部时钟的精度可能不够高。如果需要更高精度的延时,可以使用外部时钟源。
相关问题
给我编写一个关于stm32f103rct6的延时us的函数
好的,以下是关于stm32f103rct6的延时us函数的代码:
```
void delay_us(uint32_t us) {
TIM2->ARR = us; //设置定时器2的自动重载寄存器为目标延时时间
TIM2->CNT = 0x00; //清除定时器2的计数器
TIM2->CR1 |= TIM_CR1_CEN; //开启定时器2
while((TIM2->SR & TIM_SR_UIF) == 0) {} //等待定时器2的计数完成
TIM2->CR1 &= ~TIM_CR1_CEN; //关闭定时器2
TIM2->SR &= ~TIM_SR_UIF; //清除定时器2的中断标志位
}
```
以上是一个简单的延时us函数,通过设置定时器的周期和开启/关闭定时器的方式实现。需要注意的是,在使用此函数时,需要预先初始化定时器2并开启与之对应的时钟(例如:`RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE)`)。此外,该函数只适用于延时比较短的情况,如果需要长时间的延时,则建议使用systick定时器或者其他更为精确的定时方式。
stm32f103rct6延时1毫秒的函数
在stm32f103rct6上,可以使用SysTick定时器来实现延时功能。以下是一个实现延时1毫秒的函数:
```c
void delay_ms(uint32_t ms)
{
uint32_t ticks = SystemCoreClock / 1000 * ms;
SysTick->LOAD = ticks - 1;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk))
;
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
```
在这个函数中,我们首先计算出需要多少个SysTick时钟周期来实现指定的延时时间。然后,我们将这个值加载到SysTick定时器的LOAD寄存器中,并将VAL寄存器清零。接着,我们启用SysTick定时器,并使用一个循环来等待定时器计数器达到指定的延时时间。最后,我们禁用SysTick定时器,以便下一次使用。