main.c.bak
来自「嵌入式软件构件:TMR计时器管理、CLK实时时钟、KEY键盘扫描、LED数码显示」· BAK 代码 · 共 263 行
BAK
263 行
/********************************************************************************************************
* Filename : main.C
* Programmer : Haven
* 描述:
*********************************************************************************************************
*/
#define USER_MAIN_GLOBALS
#include "..\includes\includes.H"
//DEFINE_THIS_FILE
INT8U *exi = "EXIT:";
INT8U *ent = "ENTRY:";
INT8U *init = "INIT:";
INT8U *tran = "TRAN:";
INT8U *s0 = "S0;";
INT8U *s1 = "S1;";
INT8U *s2 = "S2;";
INT8U *s11 = "S11;";
INT8U *s211 = "S211;";
INT8U *s22 = "S22;";
int main (void)
{
InitialMCU();
ActObjInit();
#if FW_KEY_EN
KeyInit();
#endif
#if FW_TMR_EN
init_timer( TIME_INTERVAL );
enable_timer( 0 );
TmrInit();
TmrInitEvt(0,1,TIMEOUT_SIG);//设定计时器发送什么信号,发给哪个线程
TmrInitEvt(1,2,TIMEOUT_SIG);//(n,prio,sig)
TmrInitEvt(2,3,TIMEOUT_SIG);
#endif
#if FW_DISP_EN
DispInit();
#endif
#if FW_COMM_EN
UARTInitCh1(115200);
UARTInitCh2(115200);
UARTInitCh3(115200);
UARTInitCh4(115200);
CommInit();
#endif
InitialObj();
//WDTInit();
OS_EXIT_CRITICAL();
while(1){
ActObjScheduler();
//ClrWDT();
}
}
void InitialObj(void)
{
ActObjInitTran(1,(STAT_PTR)&COMM1_S0);
ActObjInitTran(2,(STAT_PTR)&COMM2RxTx);
ActObjInitTran(3,(STAT_PTR)&COMM3RxTx);
ActObjInitTran(4,(STAT_PTR)&COMM4RxTx);
ActObjInitTran(7,(STAT_PTR)&ActObj7TmrTick);
}
void PrintCOMM1(INT8U *s)
{
while(*s){
CommPutTxChar (COMM1, *s++);
}
}
STAT_PTR COMM1_S0(SM_STRU *me)//UART0
{
switch (SIG(me)) {
case ENTRY_SIG:
PrintCOMM1(ent);
PrintCOMM1(s0);
return (STAT_PTR)0;
case EXIT_SIG:
PrintCOMM1(exi);
PrintCOMM1(s0);
return (STAT_PTR)0;
case INIT_SIG:
PrintCOMM1(init);
PrintCOMM1(s0);
TRAN(&COMM1_S1);
return (STAT_PTR)0;
case 0x0E:
PrintCOMM1(tran);
PrintCOMM1(s211);
//TRAN(&COMM1_S211);
return (STAT_PTR)0;
}
#if HFSM_EN
return (STAT_PTR)&HfsmTop;
#else
return (STAT_PTR)0;
#endif
}
STAT_PTR COMM1_S1(SM_STRU *me)//UART0
{
switch (SIG(me)) {
case ENTRY_SIG:
PrintCOMM1(ent);
PrintCOMM1(s1);
return (STAT_PTR)0;
case EXIT_SIG:
PrintCOMM1(exi);
PrintCOMM1(s1);
return (STAT_PTR)0;
case INIT_SIG:
PrintCOMM1(init);
PrintCOMM1(s1);
INIT_TRAN(&COMM1_S11);
return (STAT_PTR)0;
case 0x0A:
PrintCOMM1("A-");
PrintCOMM1(tran);
PrintCOMM1(s1);
TRAN(&COMM1_S1);
return (STAT_PTR)0;
}
#if HFSM_EN
return (STAT_PTR)&COMM1_S0;
#else
return (STAT_PTR)0;
#endif
}
STAT_PTR COMM1_S11(SM_STRU *me)//UART0
{
switch (SIG(me)) {
case ENTRY_SIG:
PrintCOMM1(ent);
PrintCOMM1(s11);
return (STAT_PTR)0;
case EXIT_SIG:
PrintCOMM1(exi);
PrintCOMM1(s11);
return (STAT_PTR)0;
case 0x0B:
PrintCOMM1("A-");
PrintCOMM1(s11);
return (STAT_PTR)0;
}
#if HFSM_EN
return (STAT_PTR)&COMM1_S1;
#else
return (STAT_PTR)0;
#endif
}
STAT_PTR COMM2RxTx(SM_STRU *me)//UART1
{
INT8U c,err;
switch (SIG(me)) {
case COMRX_SIG:
while(!CommIsRxEmpty(COMM2)){ //如果接收缓冲区不空
c = CommGetRxChar(COMM2,&err);
//ASSERT(err != COMM_RX_EMPTY);
if (err != COMM_RX_EMPTY){
CommPutTxChar (COMM2, c);
}
}
return (STAT_PTR)0;
}
#if HFSM_EN
return (STAT_PTR)&HfsmTop;
#else
return (STAT_PTR)0;
#endif
}
STAT_PTR COMM3RxTx(SM_STRU *me)//UART2
{
INT8U c,err;
switch (SIG(me)) {
case COMRX_SIG:
EvtQueClr(3);
while(!CommIsRxEmpty(COMM3)){ //如果接收缓冲区不空
c = CommGetRxChar(COMM3,&err);
if (err != COMM_RX_EMPTY){
CommPutTxChar (COMM3, c);
}
}
return (STAT_PTR)0;
}
#if HFSM_EN
return (STAT_PTR)&HfsmTop;
#else
return (STAT_PTR)0;
#endif
}
STAT_PTR COMM4RxTx(SM_STRU *me)//UART3
{
INT8U c,err;
switch (SIG(me)) {
case COMRX_SIG:
while(!CommIsRxEmpty(COMM4)){ //如果接收缓冲区不空
c = CommGetRxChar(COMM4,&err);
if (err != COMM_RX_EMPTY){
CommPutTxChar (COMM4, c);
}
}
return (STAT_PTR)0;
}
#if HFSM_EN
return (STAT_PTR)&HfsmTop;
#else
return (STAT_PTR)0;
#endif
}
STAT_PTR ActObj7TmrTick(SM_STRU *me)
{
switch (SIG(me)) {
case TICK_TIMEOUT_SIG://10ms
Tmr_Tick();
return (STAT_PTR)0;
}
#if HFSM_EN
return (STAT_PTR)&HfsmTop;
#else
return (STAT_PTR)0;
#endif
}
void InitialMCU(void)
{
#if FW_COMM_EN
UART0TxEmpty = 1;
UART1TxEmpty = 1;
UART2TxEmpty = 1;
UART3TxEmpty = 1;
#endif
}
void WDTHandler(void) __irq
{
WDMOD &= ~WDTOF; /* clear the time-out terrupt flag */
VICVectAddr = 0; /* Acknowledge Interrupt */
}
DWORD WDTInit( void )
{
if ( install_irq( WDT_INT, (void *)WDTHandler, HIGHEST_PRIORITY ) == FALSE )
{
return (FALSE);
}
WDTC = 0x003FFFFF;
WDMOD = 0X03;
WDFEED = 0xAA; /* Feeding sequence */
WDFEED = 0x55;
return( TRUE );
}
void ClrWDT(void)
{
WDFEED = 0XAA;
WDFEED = 0X55;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?