stm32f103rct6利用内部时钟延时1us的函数
时间: 2024-05-04 21:20:57 浏览: 176
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延时函数
在 STM32F103RCT6 上,可以使用以下代码实现毫秒级延时函数:
```c
void delay_ms(uint16_t ms)
{
uint32_t delay = ms * (SystemCoreClock / 1000 / 8);
while(delay--) {}
}
```
其中 `SystemCoreClock` 是系统时钟频率,需要根据实际设置进行修改。这里假设时钟频率为 72MHz,每个循环耗时为 8 个时钟周期,因此计算出每毫秒需要循环的次数为 `(72MHz / 1000 / 8) = 9000`。最后等待的总循环次数即为 `delay = ms * 9000`。
阅读全文
相关推荐
















