stm32f103死循环毫秒延时
时间: 2025-02-12 09:17:44 浏览: 25
STM32F103 毫秒级延时死循环实现方法
对于STM32F103系列单片机而言,可以采用基于空操作的死循环来实现毫秒级别的延迟。然而这种方法存在明显的不足之处,即无法提供精确的时间控制,并且会使得中央处理器处于忙碌等待状态[^1]。
下面展示了一个简单的通过嵌套循环结构完成的大致毫秒级别延时函数:
void delay_ms(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 12000; j++); // 这里的数值取决于系统的时钟频率以及期望达到的具体延时时长
}
}
上述代码中的内层for
循环执行次数决定了每次调用该函数能够产生的大致延时长度。需要注意的是,由于编译器优化等因素的影响,实际运行时间可能会有所偏差。
尽管这种做法简单易懂,但在实际项目开发过程中不推荐广泛使用这种方式来进行定时处理,因为这不仅浪费了宝贵的计算资源而且难以保证准确性。更优的选择是利用内置定时器外设功能来替代软件延时方案。
相关问题
STM32F103滴答定时器 毫秒微秒延时
对于STM32F103系列微控制器的滴答定时器,可以使用它来实现毫秒和微秒级的延时。下面是两个简单的函数示例,用于实现延时。
首先,我们需要启用滴答定时器。可以使用下面的代码片段来初始化滴答定时器:
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; // 开启滴答定时器
}
接下来,我们可以定义一个函数来实现毫秒级延时:
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);
}
}
最后,我们可以定义一个函数来实现微秒级延时:
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微控制器上实现所需的毫秒和微秒级延时。请注意,这些函数会阻塞程序的执行,直到延时结束。
STM32F103for循环延时函数
可以使用以下代码实现基于for循环的延时函数:
void delay_us(uint32_t us)
{
uint32_t i;
for(i=0;i<us*8;i++);
}
void delay_ms(uint32_t ms)
{
uint32_t i;
for(i=0;i<ms;i++)
{
delay_us(1000);
}
}
其中,delay_us函数实现微秒级别的延时,delay_ms函数实现毫秒级别的延时。需要注意的是,这种延时方式会占用CPU资源,因此在实际应用中需要根据具体情况选择合适的延时方式。
相关推荐
















