msp430开发平台,msp430常用开发工具
chanong
|“这个周末我很无聊,我翻了翻抽屉,惊喜地发现了一套MSP430F5529开发板,是实验室老师送给我的。毕业后,我找到了一份电源硬件方面的工作。当时,我以为我以后可能不会涉足微机开发了,但是又舍不得扔掉,所以就留着了,不过当时我其实给了弟弟几块微机核心板,我已经继承了我觉得它很紧凑,便于携带,所以我把它当作大学的纪念品。然后我把它塞进抽屉里,然后就忘记了。
今天既然有缘再见面,那就写个程序喂它吧。然而事实证明,我写程序已经有四五年了,C语言的语法我已经忘记了大部分,更不用说这个单片机的寄存器结构了。我进行了IO 端口的配置,并使用C 语言方法和一些简单的语法创建了一个简单的“状态机”来运行LED 跑灯。
首先,什么是状态机?状态机有四个主要元素:状态、事件、动作和转换。
一个常见的例子是走廊中的音频激活照明。
状态有两种类型:—— 打开和关闭。
触发事件对应的指令,灯状态,是事件——中是否有声音。
无论灯亮还是灭,都执行操作。
当灯从开变为关或从关变为开时,状态转换即为状态转换。
下面我来分享一下这个“状态机”的设计过程。有很多缺点。兄弟姐妹们,看热闹吧。
首先介绍一下开发板上用到的资源。
4 个机械按钮——S1、S2、S3、S4。
6 LED——L1、L2、L3、L4、L5、L6。
状态机程序实现的功能有:
按不同的按钮可更改六个LED 的整体开/关状态。
设计状态转移图如下。
其中,各种条件对应的LED灯会亮或灭,如下:
开始编程。代码的重要部分是:
首先,让我们定义上述状态机的四个主要元素。使用枚举和结构使您的代码更紧凑且更易于理解。以后有事件功能会更方便,更容易维护。
/********事件ID************/typedef enum{event_1=1,event_2,event_3,event_4}事件ID;/********* *状态* *** *****/typedef enum{ state_1=1, state_2, state_3, state_4}StateID;typedef struct{ EventID Event; StateID CurState; void (*EventActFun)(); StateID NextState;}StateTable; typedef struct { StateID CurState; StateTable *StateTable; int Size;}fsmType; 以及状态机的相关函数:
/********************状态注册******************************** ***/void fsmRegist(fsmType * pfsm, StateTable* pTable){ pfsm-StateTable=pTable;}/****************状态转移******** ******** * ********/void fsmStateTransfer(fsmType* pfsm, StateID 状态){ pfsm-CurState=状态;}/**************** *事件处理***** * *****************/void fsmEventHandle(fsmType* pfsm, EventID Event){ StateTable* pActTable=pfsm-StateTable; StateID CurState=pfsm-CurState; void (*pEventActFun) ( )=NULL; StateID NextState; int maxNum=pfsm-Size; uint i; /*获取当前动作函数*/for (i=0; i maxNum; i++) {//仅当指定事件发生时执行当前状态if (Event==pActTable[i].Event CurState==pActTable[i].CurState) { pEventActFun=pActTable[i].EventActFun; NextState=pActTable[i].NextState; pEventActFun( ) ; //执行事件fsmStateTransfer(pfsm, NextState); Break;} }}将所有事件、状态和动作(时间状态)迁移到状态列表中,以便于管理。如果以后有可能添加其他事件函数,只需将它们添加到数组列表中即可。
StateTable pTable[]={ {event_1,state_1,L123,state_2}, {event_2,state_2,L456,state_3}, {event_3,state_3,L135,state_4}, {event_4,state_4,L246,state_1}}; 最后,Main功能代码:
void main(void){WDTCTL=WDTPW | WDTHOLD;//停止看门狗定时器init();fsmType Led;fsmRegist(Led, pTable);//注册状态列表Led.CurState=state_1;//第一个状态赋值当前状态Led .Size=sizeof(pTable)/sizeof(StateTable);while(1){ switch((EventID)GetEventID()) { caseevent_1: fsmEventHandle(Led,event_1);break;caseevent_2:fsmEventHandle(Led,event_2) ); Break; caseevent_3: fsmEventHandle (Led,event_3);break;caseevent_4:fsmEventHandle(Led,event_4);break;default:off();break; }}}请发视频看看运行效果
正在加载视频.








