⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 嵌入式软件构件:TMR计时器管理、CLK实时时钟、KEY键盘扫描、LED数码显示、LCD显示、COMM串口通信
💻 C
字号:
/********************************************************************************************************
* Filename   : main.C
* Programmer : Haven 
* 描述: 
*********************************************************************************************************
*/
#define USER_MAIN_GLOBALS
#include "..\includes\includes.H"
//DEFINE_THIS_FILE


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,5,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
#if FW_CAN_EN
    CAN_Init( BITRATE100K24MHZ );
    CAN_SetACCF( ACCF_ON );
#endif    
    TmrStart(1,200);
    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);//因为CAN用的IO和COMM3冲突
    //ActObjInitTran(4,(STAT_PTR)&COMM4RxTx);
    ActObjInitTran(5,(STAT_PTR)&CanRxTxData);
    ActObjInitTran(7,(STAT_PTR)&ActObj7TmrTick);
}
void PrintCOMM(INT8U ch,INT8U *s)
{
    while(*s){ 
        CommPutTxChar (ch, *s++);
    }
}
   
    
STAT_PTR COMM1_S0(HFSM *me)
{
    switch (SIG(me)) {
        case ENTRY_SIG:
            PrintCOMM(COMM1,"HFSM TEST:please input  0A,0B,0C,0D,0E,0F,10;     ");
            PrintCOMM(COMM1,"S0-ENTRY;");
            TmrStart(0,5000);
            return (STAT_PTR)0;
        case EXIT_SIG:
            PrintCOMM(COMM1,"S0-EXIT;");
            return (STAT_PTR)0;
        case INIT_SIG:
            PrintCOMM(COMM1,"S0-INIT;");
            TRAN(&COMM1_S1);
            return (STAT_PTR)0;
        case 0x0E:
            PrintCOMM(COMM1,"S0--0E;");
            TRAN(&COMM1_S211);
            return (STAT_PTR)0;
	    case  TIMEOUT_SIG:
			TmrStartISR(0,5000);
			PrintCOMM(COMM1,"HFSM TEST:please input  0A,0B,0C,0D,0E,0F,10;      ");
			return (STAT_PTR)0;
    }
	return  (STAT_PTR)&HfsmTop;
}

STAT_PTR COMM1_S1(HFSM *me)
{
    switch (SIG(me)) {
        case ENTRY_SIG:
            PrintCOMM(COMM1,"S1-ENTRY;");
            return (STAT_PTR)0;
        case EXIT_SIG:
            PrintCOMM(COMM1,"S1-EXIT;");
            return (STAT_PTR)0;
        case INIT_SIG:
            PrintCOMM(COMM1,"S1-INIT;");
            INIT_TRAN(&COMM1_S11);
            return (STAT_PTR)0;
        case 0x0A:
            PrintCOMM(COMM1,"S1--0A;");
            TRAN(&COMM1_S1);
            return (STAT_PTR)0;
        case 0x0B:
            PrintCOMM(COMM1,"S1--0B;");
            TRAN(&COMM1_S11);
            return (STAT_PTR)0;
        case 0x0C:
            PrintCOMM(COMM1,"S1--0C;");
            TRAN(&COMM1_S2);
            return (STAT_PTR)0;
        case 0x0D:
            PrintCOMM(COMM1,"S1--0D;");
            TRAN(&COMM1_S0);
            return (STAT_PTR)0;
        case 0x0F:
            PrintCOMM(COMM1,"S1--0F;");
            TRAN(&COMM1_S211);
            return (STAT_PTR)0;
    }
	return  (STAT_PTR)&COMM1_S0;
}

STAT_PTR COMM1_S11(HFSM *me)
{
    switch (SIG(me)) {
        case ENTRY_SIG:
            PrintCOMM(COMM1,"S11-ENTRY;");
            return (STAT_PTR)0;
        case EXIT_SIG:
            PrintCOMM(COMM1,"S11-EXIT;");
            return (STAT_PTR)0;
        case 0x10:
            PrintCOMM(COMM1,"S11-10;");
            TRAN(&COMM1_S211);
            return (STAT_PTR)0;
    }
	return  (STAT_PTR)&COMM1_S1;
}

STAT_PTR COMM1_S2(HFSM *me)
{
    switch (SIG(me)) {
        case ENTRY_SIG:
            PrintCOMM(COMM1,"S2-ENTRY;");
            return (STAT_PTR)0;
        case EXIT_SIG:
            PrintCOMM(COMM1,"S2-EXIT;");
            return (STAT_PTR)0;
        case INIT_SIG:
            PrintCOMM(COMM1,"S2-INIT;");
            INIT_TRAN(&COMM1_S21);
            return (STAT_PTR)0;
        case 0x0C:
            PrintCOMM(COMM1,"S2--0C;");
            TRAN(&COMM1_S1);
            return (STAT_PTR)0;
        case 0x0F:
            PrintCOMM(COMM1,"S2--0F;");
            TRAN(&COMM1_S11);
            return (STAT_PTR)0;
            
    }
	return  (STAT_PTR)&COMM1_S0;
}

STAT_PTR COMM1_S21(HFSM *me)
{
    switch (SIG(me)) {
        case ENTRY_SIG:
            PrintCOMM(COMM1,"S21-ENTRY;");
            return (STAT_PTR)0;
        case EXIT_SIG:
            PrintCOMM(COMM1,"S21-EXIT;");
            return (STAT_PTR)0;
        case INIT_SIG:
            PrintCOMM(COMM1,"S21-INIT;");
            INIT_TRAN(&COMM1_S211);
            return (STAT_PTR)0;
        case 0x0B:
            PrintCOMM(COMM1,"S21--0B;");
            TRAN(&COMM1_S211);
            return (STAT_PTR)0;
    }
	return  (STAT_PTR)&COMM1_S2;
}

STAT_PTR COMM1_S211(HFSM *me)
{
    switch (SIG(me)) {
        case ENTRY_SIG:
            PrintCOMM(COMM1,"S211-ENTRY;");
            return (STAT_PTR)0;
        case EXIT_SIG:
            PrintCOMM(COMM1,"S211-EXIT;");
            return (STAT_PTR)0;
        case 0x0D:
            PrintCOMM(COMM1,"S211--0D;");
            TRAN(&COMM1_S21);
            return (STAT_PTR)0;
        //case 0x0c:
            //PrintCOMM(COMM1,"12345678;");
            //return (STAT_PTR)0;
        case 0x10:
            PrintCOMM(COMM1,"S211--10;");
            TRAN(&COMM1_S0);
            return (STAT_PTR)0;
    }
	return  (STAT_PTR)&COMM1_S21;
}


STAT_PTR COMM2RxTx(HFSM *me)//UART1
{
    INT8U c,err;
    switch (SIG(me)) {
        case COMRX_SIG:
            while(!CommIsRxEmpty(COMM2)){           //如果接收缓冲区不空
                c = CommGetRxChar(COMM2,&err);
                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(HFSM *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;
    }
	return  (STAT_PTR)&HfsmTop;
}
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;
    }
	return  (STAT_PTR)&HfsmTop;
}

STAT_PTR ActObj7TmrTick(SM_STRU *me)
{
     switch (SIG(me)) {
        case TICK_TIMEOUT_SIG://10ms
            Tmr_Tick();
            return (STAT_PTR)0;
    }
	return  (STAT_PTR)&HfsmTop;
}


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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -