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 + -
显示快捷键?