stm32F103 us级延时
时间: 2023-08-11 16:03:06 浏览: 80
在 STM32F103 微控制器中,可以使用 SysTick 定时器来实现微秒级延时。SysTick 定时器是一个24位向下计数器,可以用来生成周期性的中断。
以下是一个示例代码,实现了 1 微秒的延时功能:
```c
void delay_us(uint32_t us)
{
uint32_t ticks = us * (SystemCoreClock / 1000000); // 计算需要的 SysTick 滴答数
SysTick->LOAD = ticks - 1;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
while((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0); // 等待延时时间到达
SysTick->CTRL = 0; // 关闭定时器
}
```
在这个函数中,我们首先将需要延时的微秒数转换成需要的 SysTick 滴答数,然后配置 SysTick 定时器并启动它。在等待延时时间到达时,我们轮询 SysTick 的 COUNTFLAG 标志位,直到它被置位,表示时间到达了。最后关闭定时器。
相关问题
stm32F103 us级延时不用定时器
在STM32F103中,可以使用内置的SysTick定时器来实现微秒级的延时,而不需要使用外部定时器。SysTick定时器是一个24位的向下计数器,可以用来产生精确的时间基准。以下是使用SysTick实现微秒级延时的示例代码:
```c
// 使能SysTick定时器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
// 计算SysTick每个tick的时间
// 假设系统时钟频率为72MHz
uint32_t tick_time_us = 1000000 / SystemCoreClock;
// 微秒级延时函数
void delay_us(uint32_t us) {
uint32_t start_tick = SysTick->VAL;
uint32_t target_tick = start_tick - us * tick_time_us;
if (target_tick > start_tick) {
// 如果计数器溢出,需要加上计数器的最大值
target_tick += SysTick->LOAD + 1;
}
while (SysTick->VAL > target_tick);
}
```
在这个示例代码中,我们首先使能了SysTick定时器,并计算出每个tick的时间。然后,我们定义了一个名为`delay_us`的函数,用于实现微秒级延时。在函数中,我们首先获取当前的SysTick计数器值,然后计算出目标计数器值。最后,我们在一个循环中等待SysTick计数器达到目标值。当计数器溢出时,我们需要加上计数器的最大值。
stm32f103rct6延时1us的函数
以下是基于STM32F103RCT6芯片的延时1us的函数代码:
```c
void delay_us(uint16_t us)
{
uint16_t i;
for(i=0;i<us;i++)
{
uint16_t j=12; // 迭代次数,根据CPU主频和循环次数调整
while(j--);
}
}
```
注意,对于不同的CPU主频和循环次数,需要根据实际情况进行调整。如果需要更高精度的延时,可以使用定时器或者外部晶振等硬件来实现。
阅读全文