stm32用状态机实现非阻塞式流水灯的代码怎么写
时间: 2023-06-03 20:07:49 浏览: 248
以下是使用状态机实现非阻塞式流水灯的基本代码框架:
``` c
#include "stm32f10x.h"
// 定义LED引脚的GPIO端口和引脚号
#define LED_GPIO GPIOC
#define LED_PIN GPIO_Pin_13
// 定义状态机的状态
enum LedState {
LED_OFF,
LED_ON
};
// 定义状态机的结构体
struct LedStateMachine {
enum LedState state;
uint32_t time_ms;
};
// 初始化状态机
void LedStateMachine_Init(struct LedStateMachine *sm) {
if (sm) {
sm->state = LED_OFF;
sm->time_ms = 0;
}
}
// 更新状态机
void LedStateMachine_Update(struct LedStateMachine *sm, uint32_t delta_ms) {
if (sm) {
sm->time_ms += delta_ms;
switch (sm->state) {
case LED_OFF:
if (sm->time_ms >= 1000) { // 闪烁时间为1秒
sm->state = LED_ON;
sm->time_ms = 0;
}
break;
case LED_ON:
if (sm->time_ms >= 500) { // 亮灯时间为0.5秒
sm->state = LED_OFF;
sm->time_ms = 0;
}
break;
default:
break;
}
}
}
// 设置LED状态
void Led_SetState(enum LedState state) {
if (state == LED_OFF) {
LED_GPIO->BSRR = LED_PIN << 16; // GPIO_ResetBits(LED_GPIO, LED_PIN);
}
else {
LED_GPIO->BSRR = LED_PIN; // GPIO_SetBits(LED_GPIO, LED_PIN);
}
}
int main(void) {
// 初始化GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = LED_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_GPIO, &GPIO_InitStructure);
// 初始化状态机
struct LedStateMachine sm;
LedStateMachine_Init(&sm);
// 无限循环更新状态机并切换LED状态
while (1) {
LedStateMachine_Update(&sm, 1); // 每次更新的时间间隔为1ms
Led_SetState(sm.state);
}
}
```
以上代码实现了通过状态机控制LED灯的闪烁,状态机包含了两个状态:LED_OFF和LED_ON,LED初始化为LED_OFF状态,每当经过1秒的时间后,LED状态会从LED_OFF变成LED_ON,持续时间为0.5秒;每当经过0.5秒的时间后,LED状态会从LED_ON变成LED_OFF,持续时间也为0.5秒,如此反复循环,实现了类似流水灯的效果。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)