stm32延时函数讲解
时间: 2023-10-11 17:14:19 浏览: 80
在STM32中,有很多方法可以实现延时。其中,最常用的方法是使用SysTick定时器。SysTick定时器是一个24位的倒计时寄存器,它可以每毫秒发出一个中断。我们可以使用SysTick定时器来创建一个延时函数。
下面是一个简单的延时函数的实现代码:
```c
void delay_ms(uint32_t ms)
{
uint32_t i;
SysTick->LOAD = 9000; // 1ms @ 72MHz
SysTick->CTRL = 0x05; // Enable SysTick
for (i = 0; i < ms; i++) {
while ((SysTick->CTRL & 0x10000) == 0); // Wait until count to 0
}
SysTick->CTRL = 0; // Disable SysTick
}
```
在这个函数中,我们使用SysTick定时器每毫秒发出一个中断。然后,我们循环指定的毫秒数,等待SysTick中断发生。当SysTick计数器减为0时,中断发生并将count标志位置1。我们等待count标志位被设置,然后清除它并继续等待下一个中断。
使用这个延时函数的方法是调用`delay_ms()`函数并传递需要延时的毫秒数作为参数。
需要注意的是,这个函数只是一个简单的延时函数,它会阻塞CPU。如果需要同时执行其他操作,可以使用STM32的其他定时器和中断来实现非阻塞延时。
相关问题
hcsr04超声波模块stm32代码讲解
好的,下面给出一个简单的 HCSR04 超声波模块的 STM32 代码讲解,代码如下:
```c
#include "stm32f10x.h"
#include "delay.h"
#define TRIG GPIO_Pin_0 // 发射引脚
#define ECHO GPIO_Pin_1 // 接收引脚
void HCSR04_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = TRIG;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = ECHO;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
float HCSR04_GetDistance(void)
{
uint32_t time = 0;
float distance = 0;
GPIO_ResetBits(GPIOA, TRIG); // 拉低发射引脚
delay_us(2); // 延时2us
GPIO_SetBits(GPIOA, TRIG); // 拉高发射引脚
delay_us(10); // 延时10us
GPIO_ResetBits(GPIOA, TRIG); // 拉低发射引脚
while (GPIO_ReadInputDataBit(GPIOA, ECHO) == RESET); // 等待高电平
time = 0;
while (GPIO_ReadInputDataBit(GPIOA, ECHO) == SET) // 计算高电平持续时间
{
delay_us(1);
time++;
}
distance = (float)time * 1.7 / 100; // 计算距离,单位为厘米
return distance;
}
int main(void)
{
HCSR04_Init();
float distance = 0;
while (1)
{
distance = HCSR04_GetDistance();
printf("Distance: %.2fcm\n", distance); // 在串口终端输出距离值
delay_ms(500);
}
}
```
该代码主要包含两个函数:`HCSR04_Init` 和 `HCSR04_GetDistance`。
首先,`HCSR04_Init` 函数用于初始化超声波模块的发射和接收引脚。发射引脚采用推挽输出模式,接收引脚采用浮空输入模式。
其次,`HCSR04_GetDistance` 函数用于获取超声波探测器与物体之间的距离。具体实现步骤如下:
1. 首先拉低发射引脚,延时2us,再拉高发射引脚,延时10us后再将发射引脚拉低,这样就可以发射一定周期的超声波信号。
2. 接下来等待接收引脚的高电平信号,计算高电平持续时间。
3. 最后根据高电平持续时间计算距离值,单位为厘米。
最后,在主函数中不断获取距离值,并在串口终端输出。其中,`delay.h` 头文件中包含了延时函数的实现,可以根据需要进行调整。同时,需要注意超声波探测器的工作电压和输出距离范围,以避免超出范围导致测量错误。
stm32 CM3 固件库 msic讲解
STM32 CM3固件库是一组用于STM32系列微控制器的软件库,它提供了许多常用的功能和驱动程序,包括GPIO、USART、SPI、I2C、ADC、DAC等。这些库函数可以帮助开发人员更快速地编写代码,减少开发时间和错误率。
其中,msic库是一个包含了一些常用的函数的库,例如延时函数delay_us()和delay_ms(),以及一些与系统时钟有关的函数,例如RCC_ClocksTypeDef结构体,可以获取系统时钟、AHB时钟和APB1/APB2时钟的频率等信息。
使用msic库需要在工程中添加相应的头文件和源文件,并进行初始化。例如,在使用delay_us()函数前需要调用SysTick_Config()函数进行SysTick定时器的初始化。
阅读全文