STM32F103HAL库微妙延时
时间: 2023-10-14 14:04:40 AIGC 浏览: 162 评论: 4
在STM32F103微控制器上,可以使用HAL库提供的延时函数来实现微秒级的延时。HAL库中提供了以下两个函数用于实现微秒级延时:
1. HAL_Delay()函数:该函数用于实现毫秒级的延时,可以通过调用该函数多次来实现微秒级的延时。例如,如果需要实现10微秒的延时,可以调用HAL_Delay(0)函数10次。
2. HAL_Delay_us()函数:该函数用于实现微秒级的延时。例如,如果需要实现10微秒的延时,可以直接调用HAL_Delay_us(10)函数。
需要注意的是,由于系统时钟频率的不同,延时的精度可能会有所差异。因此,在使用延时函数时应根据实际情况进行验证和调整。
相关问题
stm32f103HAL库延时函数
### 关于STM32F103 HAL库中的延时函数
在STM32F103系列微控制器的HAL库中,延时功能通常通过`HAL_Delay()`函数实现。该函数基于SysTick定时器来提供毫秒级的时间延迟[^3]。以下是关于其使用方法以及相关示例代码的内容。
#### `HAL_Delay()` 函数说明
`HAL_Delay()` 是一个阻塞型延时函数,用于实现指定时间长度内的暂停操作。它接受一个参数,表示需要延时的毫秒数。此函数依赖于系统的滴答频率(即`HAL_InitTick()`设置的频率),因此在调用之前需确保已正确初始化系统滴答计数器。
```c
void HAL_Delay(uint32_t Delay);
```
- 参数:`Delay` 表示延时时长(单位为毫秒)。
- 返回值:无返回值。
为了使`HAL_Delay()`正常工作,在项目初始化阶段应完成以下两步:
1. 调用`HAL_Init()`以初始化HAL库并启动默认配置。
2. 配置系统时钟并通过`HAL_InitTick()`设定合适的滴答频率。
#### 示例代码
下面是一个完整的例子,展示如何在STM32F103 HAL库环境中使用`HAL_Delay()`:
```c
#include "stm32f1xx_hal.h"
// 系统时钟初始化函数
void SystemClock_Config(void);
int main(void)
{
// 初始化HAL库
HAL_Init();
// 配置系统时钟
SystemClock_Config();
// GPIO端口初始化 (假设LED连接至PA5)
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
while (1)
{
// LED点亮
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
// 延迟500ms
HAL_Delay(500);
// LED熄灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
// 延迟500ms
HAL_Delay(500);
}
}
```
上述代码实现了简单的LED闪烁效果,其中每次状态切换之间都有500毫秒的间隔。
#### 微妙级别延时
如果需要更精确的小于一秒范围内的延时,则可以通过自定义函数或者利用TIMx定时器来达成目标。例如,创建一个基于忙等待机制的微妙延时函数如下所示:
```c
__attribute__((optimize("O0"))) void udelay_us(uint32_t us)
{
uint32_t ticks_start = DWT->CYCCNT; // 获取当前周期计数值
uint32_t cycles = (SystemCoreClock / 1000000) * us;
while ((DWT->CYCCNT - ticks_start) < cycles); // 忙等待直到达到所需us数量
}
```
注意:这种方法仅适用于调试环境下的简单应用场合;对于实际产品开发不推荐采用此类方案,因为会占用CPU资源并且可能受到中断干扰影响准确性。
---
###
stm32f103hal库dht11
### STM32F103 HAL库驱动DHT11温湿度传感器
#### 初始化配置
为了使STM32F103C8T6能够通过HAL库读取来自DHT11的数据,初始化阶段至关重要。这涉及到设置GPIO引脚作为输入/输出以及配置必要的延时函数来处理微秒级的时间间隔。
```c
// 定义用于通信的GPIO端口和引脚
#define DHT11_PORT GPIOA
#define DHT11_PIN GPIO_PIN_8
void DHT11_Init(void){
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 配置PA8为推挽输出模式
GPIO_InitStruct.Pin = DHT11_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStruct);
}
```
#### 数据传输协议实现
根据DHT11的工作原理,在主机发送启动信号之后,会等待从机返回应答脉冲序列。这段代码展示了如何检测这个过程中的高低电平变化并验证其合法性。
```c
uint8_t dht11_check(void){
uint8_t retry=0;
// 设置为输入状态前先清除之前的输出状态
HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET);
// 切换到浮空输入模式以接收外部设备反馈
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = DHT11_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(DHT11_PORT, &GPIO_InitStruct);
// 等待高电平超过最大容忍次数则认为失败
while (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)&&retry<100){
retry++;
DHT11_delay_us(1);
}
if(retry>=100)return 1;
// 清零重试计数器准备下一轮测试
retry=0;
// 接下来应该看到的是持续一段时间的低电平
while (!HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)&&retry<100){
retry++;
DHT11_delay_us(1);
}
return (retry >= 100)? 1 : 0 ;
}
```
#### 微秒级别延迟函数定义
由于标准HAL库提供的`HAL_Delay()`仅支持毫秒级别的精度,因此需要自定义一个可以精确控制更短时间周期的方法:
```c
#include "stm32f1xx_hal.h"
static void DHT11_delay_us(uint16_t us){
uint32_t ticks_start = HAL_GetTick();
uint32_t current_ticks;
do {
current_ticks = HAL_GetTick();
}while((current_ticks - ticks_start)*1000/us <= 1);
}
```
上述方法利用了系统滴答定时器来进行简单的循环等待操作,从而达到所需的微妙级延时效果[^2]。
阅读全文
相关推荐















评论

Mrs.Wong
2025.08.12
HAL_Delay()和HAL_Delay_us()函数使用详解。

FelaniaLiu
2025.05.12
STM32F103HAL库实现微秒级延时有具体方法说明。

不美的阿美
2025.04.29
实现微秒级延时,注意函数多次调用可能影响效率。

恽磊
2025.03.24
根据时钟频率调整,确保延时精度。