st32 标准库 起初小灯熄灭,等到触发条件小灯延时后熄灭,使用非阻塞型延时函数并由返回值
时间: 2023-12-12 07:05:28 浏览: 85
基于stm32标准库的延时函数
来判断延时是否结束是一种常见的做法。在ST32标准库中,可以使用以下函数进行非阻塞型延时:
```c
void HAL_Delay(uint32_t milliseconds)
```
该函数的作用是延时指定的毫秒数,但是它是一个阻塞函数,也就是说在延时期间程序会被挂起。
如果要实现非阻塞型延时,可以使用以下代码:
```c
static uint32_t delay_start_time = 0;
void delay_start(uint32_t milliseconds) {
delay_start_time = HAL_GetTick();
}
bool delay_complete(uint32_t milliseconds) {
return (HAL_GetTick() - delay_start_time >= milliseconds);
}
```
在需要延时的地方,调用`delay_start`函数设置延时起始时间,然后在主循环中调用`delay_complete`函数判断是否延时结束。如果返回值为`true`,表示延时已经结束。
例如,下面的代码实现了一个简单的功能:当按下按键时,小灯亮起并延时2秒后熄灭。
```c
#include "stm32f1xx_hal.h"
#define LED_PIN GPIO_PIN_13
#define LED_PORT GPIOC
#define BTN_PIN GPIO_PIN_0
#define BTN_PORT GPIOA
static uint32_t delay_start_time = 0;
void delay_start(uint32_t milliseconds) {
delay_start_time = HAL_GetTick();
}
bool delay_complete(uint32_t milliseconds) {
return (HAL_GetTick() - delay_start_time >= milliseconds);
}
int main(void) {
HAL_Init();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef gpio_init = {0};
gpio_init.Mode = GPIO_MODE_OUTPUT_PP;
gpio_init.Pin = LED_PIN;
gpio_init.Pull = GPIO_NOPULL;
gpio_init.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_PORT, &gpio_init);
gpio_init.Mode = GPIO_MODE_INPUT;
gpio_init.Pin = BTN_PIN;
gpio_init.Pull = GPIO_PULLUP;
gpio_init.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(BTN_PORT, &gpio_init);
while (1) {
if (HAL_GPIO_ReadPin(BTN_PORT, BTN_PIN) == GPIO_PIN_RESET) {
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);
delay_start(2000);
}
if (delay_complete(2000)) {
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET);
}
}
}
```
在这个例子中,`delay_start`函数用于设置延时起始时间,`delay_complete`函数则用于判断延时是否结束。在主循环中,先检测按键是否按下,如果按下则点亮小灯并启动延时;然后在每次循环中检测延时是否结束,如果结束则熄灭小灯。
阅读全文