STM32实战项目-状态机函数应用
创始人
2024-05-29 10:12:49
0

前言:

本章主要介绍一下,状态机在工程中的应用,下面我会通过这种方式点亮LED灯,来演示他的妙用。

目录

1、状态机应用

1.1流水灯函数

1.1.1led.h

1.1.2led.c

1.2状态机函数

1.2.1定义举常量

1.2.2结构体封装


1、状态机应用

有限状态机是一种概念思想,把复杂的控制逻辑分解成有限个稳定状态,组成闭环系统,通过事件触发,让状态机按设定的顺序处理事务;

单片机C语言的状态机编程,是利用条件选择语句(switch -- case)切换状态,通过函数内部指令改变状态机状态,让程序按设定的顺序执行。

如上图所示:五个状态分别对应五个流程分别对应五种状态,我们可以使用结构体封装,保存五个状态的函数的指针。 

1.1流水灯函数

为了方便程序移植,阅读,我们自己定义源文件 LED.C和头文件LED.H头文件中放,流水灯函数的声明和定义,源文件中放函数的实现。 

1.1.1led.h

/¶¨Òåö¾ÙÀàÐÍ
typedef enum
{LED1 = (uint8_t)0x01,LED2 = (uint8_t)0x02,LED3 = (uint8_t)0x03,
}LED_Num_t;//¶¨Òå½á¹¹ÌåÀàÐÍ
typedef struct
{void (*LED_ON)(uint8_t);     //´ò¿ªvoid (*LED_OFF)(uint8_t);    //¹Ø±Õvoid (*LED_Flip)(uint8_t);   //·­×ª
} LED_t;/* extern variables-----------------------------------------------------------*/
extern LED_t  LED;

1.1.2led.c

static void LED_ON(uint8_t); 
static void LED_OFF(uint8_t);
static void LED_Flip(uint8_t);/* Public variables-----------------------------------------------------------*/
LED_t LED = 
{LED_ON,LED_OFF,LED_Flip
};static void LED_ON(uint8_t LED_Num)
{//Ìõ¼þÑ¡ÔñÓï¾äswitch(LED_Num){case LED1: HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); break;case LED2: HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET); break;case LED3: HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,GPIO_PIN_SET); break;default: System.Assert_Failed();}
}
static void LED_OFF(uint8_t LED_Num)
{//Ìõ¼þÑ¡ÔñÓï¾äswitch(LED_Num){case LED1: HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); break;case LED2: HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET); break;case LED3: HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,GPIO_PIN_RESET); break;default: System.Assert_Failed();}
}static void LED_Flip(uint8_t LED_Num)
{//Ìõ¼þÑ¡ÔñÓï¾äswitch(LED_Num){case LED1: HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); break;case LED2: HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin); break;case LED3: HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin); break;default: System.Assert_Failed();}
}

 我们可以看到在led.c函数中,我们封装的三个函数指针分别实现了,led的开、关、和翻转,至于ON,OFF,TogglePin 这些都是HAL库自己定义的我们可以看看他的函数实现,如下图所示:

 至于端口和引脚,这个在我们使用cubemax的时候,配置好参数的时候,已经自动初始化完成了。

1.2状态机函数

1.2.1定义举常量

 首先定义五个枚举常量,不同常量对应不同选择,也就会有不同的状态。

//¶¨Òåö¾ÙÀàÐÍ
typedef enum
{STA1   = (uint8_t)0x01, STA2   = (uint8_t)0x02, STA3   = (uint8_t)0x03, STA4   = (uint8_t)0x04, STA5   = (uint8_t)0x05,
} STA_Machine_Status_t;

1.2.2结构体封装

使用结构体封装五个函数指针,方便在运行函数中进行调用,具体代码如下:

//¶¨Òå½á¹¹ÌåÀàÐÍ
typedef struct
{STA_Machine_Status_t  ucSTA_Machine_Status;  //״̬»ú״̬void (*Fun_STA1)(void); void (*Fun_STA2)(void);void (*Fun_STA3)(void);void (*Fun_STA4)(void);void (*Fun_STA5)(void);
} STA_Machine_t;

 这五个函数指针指向五个函数,分别实现led的亮灭,所以函数内部又调用了led的函数,具体代码如下:

void Fun_STA1()
{HAL_Delay(500);      //ÑÓʱ500msLED.LED_Flip(LED1);  //·­×ªLED1,ÃðµÆLED.LED_Flip(LED2);  //·­×ªLED2,ÃðµÆLED.LED_Flip(LED3);  //·­×ªLED3,ÃðµÆ//״̬»úÇл»ÖÁ״̬2STA_Machine.ucSTA_Machine_Status = STA2;
}void Fun_STA2()
{HAL_Delay(500);      //ÑÓʱ500msLED.LED_ON(LED1);    //LED1ÁÁµÆLED.LED_OFF(LED2);   //LED2ÃðµÆLED.LED_OFF(LED3);   //LED3ÃðµÆ//״̬»úÇл»ÖÁ״̬3STA_Machine.ucSTA_Machine_Status = STA3;
}void Fun_STA3()
{HAL_Delay(500);      //ÑÓʱ500msLED.LED_OFF(LED1);   //LED1ÃðµÆLED.LED_ON(LED2);    //LED2ÁÁµÆLED.LED_OFF(LED3);   //LED3ÃðµÆ//״̬»úÇл»ÖÁ״̬4STA_Machine.ucSTA_Machine_Status = STA4;
}void Fun_STA4()
{HAL_Delay(500);      //ÑÓʱ500msLED.LED_OFF(LED1);   //LED1ÃðµÆLED.LED_OFF(LED2);   //LED2ÃðµÆLED.LED_ON(LED3);    //LED3ÁÁµÆ//״̬»úÇл»ÖÁ״̬5STA_Machine.ucSTA_Machine_Status = STA5;
}void Fun_STA5()
{HAL_Delay(500);      //ÑÓʱ500msLED.LED_ON(LED1);    //LED1ÁÁµÆLED.LED_ON(LED2);    //LED2ÁÁµÆLED.LED_ON(LED3);    //LED3ÁÁµÆ//״̬»úÇл»ÖÁ³õʼ״̬1STA_Machine.ucSTA_Machine_Status = STA1;
}

这样的话一个完整的状态机就完成了,我们软件框架并没有改变,只是将调用的run函数内部进行了修改。整体的框架如下图所示:

 

相关内容

热门资讯

这个周末邂逅人艺之友 一起“再... 【这个周末#邂逅人艺之友# 一起“再造时光”】5月10日至11日,北京人民艺术剧院联合东城区委区政府...
它博会纳新采购节成交额破350... 转自:上观新闻如何通过创新项目为参展商开辟增量新渠道,是TOPS它博会始终关注的核心问题之一。去年T...
龙江交投:助力龙江旅游经济由“... 新华信用杭州5月11日电(王思凝)作为2025世界品牌莫干山大会的重要组成部分,以“促消费 树品牌 ...
女演员陷“辱华”争议,疑被新剧... 5月10日,女演员李凯馨相关话题连上热搜。日前,一名自称是李凯馨前助理的网友在微博爆料。在其曝光的录...
《三餐四季》广东篇今晚开播:食... 每当人们谈到广东,总有一个绕不开的话题——粤菜。在这个美食天堂里,藏着无数让人念念不忘的老味道。央视...
既当“护企卫士” 也做“贴心管... 转自:中国警察网从精准打击民营企业内部“蛀虫”到出台相关政策打通惠企服务“最后一公里”,近年来,上海...
当事人回应上门做饭月薪2万质疑... 转自:JSTV荔枝视频 【#当事人回应上门做饭月薪2万质...
今年秋天,中国将隆重纪念中国人... 来源:新华社2025年5月7日至10日,国家主席习近平应邀对俄罗斯进行国事访问并出席纪念苏联伟大卫国...
“下辈子还要做妈妈的女儿” “今天是母亲节,让我们一同重温江西革命史上的那些无私伟大的“革命母亲”。”作者 | 何丹凤题图 | ...
政商学界共话中欧合作前景:探索... 经济观察报 记者 陈姗5月9日,在“中欧建交50周年论坛”上,来自中国和欧盟的政治家、商界领袖、名师...
王涵:资本市场改革要为创新企业...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! 兴业证券股份有限公司...
美股巨震后迎来5月魔咒,特朗普...   4月是美股近5年来最动荡的月份。  刚过去的4月是美股近5年来最动荡的月份。华尔街股谚有“卖在五...
为什么选出美国籍教皇?梵蒂冈消... ► 文 观察者网 陈思佳当地时间5月8日,来自美国的枢机主教罗伯特·普雷沃斯特当选第267任天主教罗...
母亲节 | 有爱莫迟 转自:人民政协报母亲节又到了!想想母亲离开我已经五年了,思念之情油然而生。母亲犹如一朵永远不败的鲜花...
他们围在一起给特朗普打电话,随... 乌克兰外交部长瑟比加10日下午在社交媒体发文说,乌方准备自12日起实施至少30天的全面无条件停火。瑟...
山西鹏飞集团有限公司等13家企... 新华信用杭州5月11日电(徐淑明)作为2025世界品牌莫干山大会的重要组成部分,以“促消费 树品牌 ...
再官宣丨飞天之夜黄小西音乐盛典... 惊喜不断 “乐”享不停!继「黄小西」T次方音乐与艺术节及首批阵容官宣后,我们再次带来重磅消息:由总台...
中芯国际:指引大“翻车”,“国... 中芯国际(0981.HK/688981.SH)北京时间2025年5月8日晚,港股盘后发布2025年度...
平谷快递小哥听到微弱呼救声,被... 转自:北京日报客户端“大姐,您别怕,我马上报警救您出来!”5月5日下午3点40分,顺丰快递小哥高海在...
男子得物买52瓶古驰香水包装是... 转自:河南商报 【#男子得物买52瓶古驰香水包装是假的#...