发新帖我要提问
123
返回列表
打印
[应用相关]

STM32实战总结:HAL之GPIO

[复制链接]
手机看帖
扫描二维码
随时随地手机跟帖
41
结合国际经验|  楼主 | 2023-12-27 16:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
举例说明,一个简单状态机:

使用特权

评论回复
42
结合国际经验|  楼主 | 2023-12-27 16:08 | 只看该作者
同理,先创建两个文件,即stamachine.c和stamachine.h。

有五个状态,对应一个枚举;

每种状态对应一个函数执行;

需要有一个变量用于状态切换。

使用特权

评论回复
43
结合国际经验|  楼主 | 2023-12-27 16:08 | 只看该作者
stamachine.h
#ifndef _STAMACHINE_H_
#define _STAMACHINE_H_

#include "stdint.h"

//5种状态
typedef enum
{
    STA1 = 1u,
    STA2,
    STA3,
    STA4,
    STA5,
} machineState;

//对应的函数封装
typedef struct
{
    machineState stateLocation;
   
    void (*sta1Func)(void);
    void (*sta2Func)(void);
    void (*sta3Func)(void);
    void (*sta4Func)(void);
    void (*sta5Func)(void);
} state_machine;

//将结构体声明出去
extern state_machine state_machiner;

#endif

使用特权

评论回复
44
结合国际经验|  楼主 | 2023-12-27 16:09 | 只看该作者
stamachine.c
#include "myapplication.h"

static void Sta1Func(void);
static void Sta2Func(void);
static void Sta3Func(void);
static void Sta4Func(void);
static void Sta5Func(void);

state_machine state_machiner =
{
    STA1,
   
    Sta1Func,
    Sta2Func,
    Sta3Func,
    Sta4Func,
    Sta5Func,
};

static void Sta1Func(void)
{
    HAL_Delay(500);
    led_operater.led_extinguish(LED1);
    led_operater.led_extinguish(LED2);
    led_operater.led_extinguish(LED3);
   
    state_machiner.stateLocation = STA2;
}

static void Sta2Func(void)
{
    HAL_Delay(500);
    led_operater.led_light(LED1);
    HAL_Delay(500);
    led_operater.led_extinguish(LED1);
   
    state_machiner.stateLocation = STA3;
}

static void Sta3Func(void)
{
    HAL_Delay(500);
    led_operater.led_light(LED2);
    HAL_Delay(500);
    led_operater.led_extinguish(LED2);
   
    state_machiner.stateLocation = STA4;
}

static void Sta4Func(void)
{
    HAL_Delay(500);
    led_operater.led_light(LED3);
    HAL_Delay(500);
    led_operater.led_extinguish(LED3);
   
    state_machiner.stateLocation = STA5;
}

static void Sta5Func(void)
{
    HAL_Delay(500);
    led_operater.led_light(LED1);
    led_operater.led_light(LED2);
    led_operater.led_light(LED3);
   
    state_machiner.stateLocation = STA1;
}

使用特权

评论回复
45
结合国际经验|  楼主 | 2023-12-27 16:09 | 只看该作者
状态机执行:
static void Run(void)
{
    switch(state_machiner.stateLocation)
    {
        case STA1 :
            state_machiner.sta1Func();
            break;
        case STA2 :
            state_machiner.sta2Func();
            break;
        case STA3 :
            state_machiner.sta3Func();
            break;
        case STA4 :
            state_machiner.sta4Func();
            break;
        case STA5 :
            state_machiner.sta5Func();
            break;
        default :
            state_machiner.stateLocation = STA1;
    }
}   

使用特权

评论回复
46
结合国际经验|  楼主 | 2023-12-27 16:09 | 只看该作者
还是不用动主函数。添加新文件即可。

提示:如果状态过多过于繁杂,可以直接上操作系统比如freertos

使用特权

评论回复
47
结合国际经验|  楼主 | 2023-12-27 16:09 | 只看该作者
重点补充
对于默认使用的HSI,虽然不怎么精准,但是如果只是做一些简单的控制,不需要进行通信,那么用HSI也没什么影响。

使用特权

评论回复
48
结合国际经验|  楼主 | 2023-12-27 16:09 | 只看该作者
CubeMX中这里应该是被用户自定义修改过的意思。


使用特权

评论回复
49
结合国际经验|  楼主 | 2023-12-27 16:09 | 只看该作者
补充

GPIO每个引脚都有一个位来定义,可用于选中

使用特权

评论回复
50
中国龙芯CDX| | 2023-12-28 08:55 | 只看该作者
GPIO最基本的操作

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则