在学习stm32 之前,编程风格可以说是非常烂的,大量的使用全局变量,函数即没返回也没输入,注释混乱,命名无根据。在它的固件库中有着许多规范的命名,调用等方式,已经很多C语言巧妙的使用。
毕竟自己做了款学习板所以程序也要亲力亲为了,思前想后的,最后决定不能像市场的货那样,一款一个单,一个模块一个程序,实在是只能让人知道怎么读读数据而已。要为我后面的设计打基础,必须要有像样点的小规模级别上的程序才能训练我,最后还决定,把模块程序一个一个的集合到一起,形成一个大集合,像操作系统一样,给一个命令就做那事情,不需要,要那个功能就烦人的又烧一次程序。
关于功能实现先与状态机模式实现,并行的情况后面深入了之后必须要再做一次研究,以超级终端为上位机做控制,当然没有超级终端的win7 可以用SecureCRT 这个软件,同样的终端功能,设置好串口相应设置后即可做通讯。单片机与其的通讯只能采用字符的形式出现,不支持直接看8位数据。
现在构造了两级菜单,总体感觉还行,但对这控制模式还说不清,毕竟自己设计的很难说缺点,查错误。
主级控制:
第二级控制菜单1:
第二级控制菜单1:
在非循环型工作中也并非要做到一个大循环体中,如主页和时钟选择,只要等待接收缓存发生变化后检查缓存值便可以做先关动作了。
int main(void) { ………………// 省略初始化数据 和寄存器 while (1) { switch(Sys_State)
{ /*------进入时钟选择-----------*/ case '1': TempState='\0'; Receive_buffer='\0'; RCCUart_Display(); while(Receive_buffer!='0') { if(TempState!='\0') { RCC_ConfigControl(TempState);RCCUart_Display();Receive_buffer='\0'; } /*---------动作后再做缓存检查----------------------*/ TempState=Receive_buffer; } break; /*************************************************************/ case '2': TempState='0'; LedState='1'; Receive_buffer='1'; // LEDUart_Display(LedState); while(Receive_buffer!='0') { LedState=Receive_buffer; if(TempState!=LedState) {TempState=LedState;LEDUart_Display(LedState);} //数据变化,每次循环变化一次,实现跑马灯移动 LED_Display(LedState,&LedData); GPIO_Write(GPIOE,LedData); delay_MS(1000); } break; /*************************************************************/ case '3': break; /*************************************************************/ default : MAIN_Display(); while(Receive_buffer=='0') {} break; } Sys_State=Receive_buffer; }
两个菜单均以状态机模式循环,并检查到退出控制命令符才得以跳出至上一级菜单。如果要做多级,还真有点复杂,判断太多了,得抽个时间看看操作系统的思路
2024年1月16日 19:25
Nice post. I was checking constantly this blog and I am impressed! Extremely helpful information specially the last part I care for such info a lot. I was seeking this particular information for a very long time.