stm32 us延时函数
时间: 2023-08-21 14:05:53 浏览: 338
在STM32系列微控制器中,可以使用以下代码来实现us级别的延时函数:
```c
void Delay_us(uint32_t nus)
{
uint32_t ticks;
uint32_t told, tnow, tcnt = 0;
uint32_t reload = SysTick->LOAD;
ticks = nus * (SystemCoreClock / 1000000);
tcnt = 0;
told = SysTick->VAL;
while (1) {
tnow = SysTick->VAL;
if (tnow != told) {
if (tnow < told)
tcnt += told - tnow;
else
tcnt += reload - tnow + told;
told = tnow;
if (tcnt >= ticks)
break;
}
}
}
```
该函数基于系统滴答定时器(SysTick)实现。首先计算出需要延时的系统滴答定时器的滴答次数,然后在while循环中不断读取SysTick->VAL寄存器的值,直到延时时间到达。需要注意的是,该函数可能会受到其他中断的干扰,因此在实际使用中需要进行一定的优化和调试。
相关问题
STM32 HAL 延时函数
STM32 HAL是STMicroelectronics提供的一套针对STM32系列微控制器的硬件抽象层(Hardware Abstraction Layer)库。它提供了一系列的API函数,用于简化STM32微控制器的底层驱动和操作。
在STM32 HAL库中,延时函数是用来实现延时操作的函数。延时函数可以用于在程序中添加一定的时间延迟,以满足特定的需求,比如等待外设初始化完成、产生特定的时间间隔等。
在HAL库中,提供了两种常用的延时函数:
1. HAL_Delay(ms):该函数用于实现毫秒级别的延时,参数ms表示延时的毫秒数。
2. HAL_Delay_us(us):该函数用于实现微秒级别的延时,参数us表示延时的微秒数。
这两个函数底层使用了系统滴答定时器(SysTick)来实现延时功能。SysTick定时器是STM32微控制器内置的一个定时器,可以用来生成固定时间间隔的中断。
使用延时函数时,需要注意以下几点:
1. 在使用延时函数之前,需要先初始化SysTick定时器。
2. 延时函数会阻塞当前线程的执行,直到延时时间到达。
3. 延时时间并不是绝对准确的,受到系统时钟频率和其他中断的影响。
stm32f4延时函数
### STM32F4 单片机延时函数实现方法
#### 使用忙等待延迟
对于简单的应用程序,可以采用基于忙等待的延迟机制。这种方法适用于不需要精确时间控制的情况:
```c
volatile uint32_t timer = 0;
void delay_busy(void) {
while (timer < SOME_VALUE) { // Busy-waiting loop
__NOP(); // No operation to prevent compiler optimization
}
}
// 中断服务程序中更新计数值
void TIMx_IRQHandler(void) {
if (__HAL_TIM_GET_FLAG(&htimx, TIM_FLAG_UPDATE) != RESET) {
__HAL_TIM_CLEAR_IT(&htimx, TIM_IT_UPDATE);
timer++;
}
}
```
此代码展示了如何通过增加全局变量 `timer` 来终止繁忙等待循环[^1]。
#### 利用定时器实现微秒级延时
为了获得更精准的时间延迟,推荐使用硬件定时器如TIM5。当APB1总线频率设定为84 MHz时,预分频寄存器(PSC)设为83可得到1 μs 的滴答间隔:
```c
#define APB1_CLOCK_HZ 84000000UL
#define PRESCALER 83 /* PSC=PRESCALER */
#define COUNTER_PERIOD_US 65535U /* ARR */
static void tim_init_us_delay(TIM_HandleTypeDef *htim) {
htim->Instance = TIM5;
htim->Init.Prescaler = PRESCALER;
htim->Init.CounterMode = TIM_COUNTERMODE_UP;
htim->Init.Period = COUNTER_PERIOD_US;
htim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(htim); // 初始化定时器
HAL_TIM_Base_Start(htim); // 启动定时器
}
uint32_t us_to_ticks(uint32_t microseconds) {
return ((microseconds * (APB1_CLOCK_HZ / (PRESCALER + 1))) / 1000000L);
}
void delay_us(uint32_t us) {
__IO uint32_t counter_start = __HAL_TIM_GET_COUNTER(&htim5);
while ((__HAL_TIM_GET_COUNTER(&htim5) - counter_start) < us_to_ticks(us));
}
```
上述代码片段说明了如何初始化并利用定时器产生μs级别的延时[^2].
#### SysTick 定时器实现延时
SysTick 是 Cortex-M 内核自带的一个倒计数定时器,适合用来做短时间内的软件延时操作:
```c
static uint32_t fac_us;
void systick_init(void) {
SystemCoreClockUpdate();
fac_us = SystemCoreClock / 1000000ul; // 计算每微秒所需滴答次数
SysTick_Config(SystemCoreClock / 1000u); // 配置Systick中断每毫秒触发一次
}
void delay_systick_us(uint32_t us) {
uint32_t ticks = us * fac_us;
uint32_t start = SysTick->VAL;
do {
if (start >= SysTick->VAL) break;
} while (((start - SysTick->VAL) + ticks) > SysTick->LOAD);
}
```
这段代码解释了怎样配置SysTick定时器以及编写相应的微秒级别延时子程序[^3].
阅读全文
相关推荐











