STM32F103for循环延时函数
时间: 2023-11-11 13:59:57 浏览: 136
可以使用以下代码实现基于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资源,因此在实际应用中需要根据具体情况选择合适的延时方式。
相关问题
stm32f103for循环延时代码详解
STM32F103系列微控制器是一种基于ARM Cortex-M3架构的MCU,通常用于嵌入式系统开发。对于延时功能,特别是不需要精确计数的简单延时,可以使用for循环配合硬件定时器或者软件延迟方法实现。
**1. 使用软件延时(delay\_us):**
如果你需要的是简化的延时,你可以利用while循环和定时器寄存器的方式,例如每轮循环让CPU稍微休息一下:
```c
void delay_us(uint16_t us)
{
uint32_t start = HAL_GetTick(); // 获取当前时间戳
while((HAL_GetTick() - start) < us);
}
```
这里的`HAL_GetTick()`函数返回自上一次从系统时钟得到的时间戳,通过不断对比这个值和目标延时期间,达到延时目的。
**2. 使用硬件定时器(TIMx):**
如果你需要更准确且不会占用太多处理器资源的延时,可以利用定时器的预分频和捕获功能。比如使用TIM1的某个通道:
```c
// 初始化定时器
TIM_HandleTypeDef TimHandle;
TIM_TimeBaseInitTypeDef.TIM_Prescaler = ...; // 预分频
TIM_TimeBaseInitTypeDef.TIM_Period = ...; // 定时周期
HAL_TIM_Base_Init(&TimHandle);
HAL_TIM_Base_Start_IT(&TimHandle);
// 延时函数
void timer_delay(uint32_t us)
{
TIM_CounterCompareCmd(TIMx, ENABLE); // 开始比较
__HAL_TIM_SET_COMPARE(TIMx, INDEX, us * TimerPrescaler); // 设置比较值
while(!__HAL_TIM_GET_FLAG(TIMx, TIM_FLAG_Update)); // 循环等待更新标志
TIM_CounterCompareCmd(TIMx, DISABLE); // 关闭比较
}
```
在这里,你需要先配置好定时器的工作模式,并设置适当的预分频系数(TimerPrescaler)以得到所需的延时。
**
STM32f103c8t6延时函数
在STM32F103C8T6芯片上,你可以使用以下代码来实现延时函数:
```c
#include "stm32f10x.h"
void delay_ms(uint32_t ms) {
// 获取当前的系统滴答计数器值
uint32_t start = SysTick->VAL;
// 计算延时的滴答计数器值
uint32_t delayTicks = ms * (SystemCoreClock / 1000);
// 处理溢出情况
if (delayTicks > start) {
delayTicks -= start;
while (SysTick->VAL > delayTicks);
}
// 正常情况下的延时
while ((SysTick->VAL + start) > delayTicks);
}
```
这个延时函数使用了系统滴答定时器(SysTick)来实现。使用`delay_ms()`函数可以实现以毫秒为单位的延时。请确保在使用之前,已经正确配置系统滴答定时器的时钟源和中断。
阅读全文