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

📄 sys_main.c

📁 单相 CPU卡表复费率电能表,内部有提供I2C驱动,CPU卡驱动,NEC单片机0513等
💻 C
字号:
/****************************************************************************************************************
 **  IIII  NN     NN  VV       VV  EEEEEE  NN     NN  TTTTTTTT  RRRRRR     OOOOO    NN     NN  IIII    CCCCCC  **
 **   II   NN N   NN   VV     VV   EE      NN N   NN     TT     RR   RR   OO   OO   NN N   NN   II    CC       **
 **   II   NN  N  NN    VV   VV    EEEEEE  NN  N  NN     TT     RRRRRR   OO     OO  NN  N  NN   II   CCC       **
 **   II   NN   N NN     VV VV     EE      NN   N NN     TT     RR  RR    OO   OO   NN   N NN   II    CC       **
 **  IIII  NN     NN      VVV      EEEEEE  NN     NN     TT     RR   RR    OOOOO    NN     NN  IIII    CCCCCC  **
 ****************************************************************************************************************/
#include "includes.h"

void _mcu_io_init(void)
{
    WDTE = 0xAC;
    PM12 = 0;
    P12 = 0;	
    PU12 = 0;
	
    PM7 = 0;	
    PU7 = 0;	
    P7 = 0x0E;   

    PM6 = 0;
    P6 = 0;

    PM4 = 0;
    PU4 = 0;	
    P4 = 0;

    PM3 = 0;
    P3 = 0;
    PU3 = 0;
	
    ClrIORBit( ADM, 0x81 );
    SetIORBit( ADPC, 0x08 );
    PM2 = 0xCE;
    SetIORBit( P2, MODULE_DSR );
    ClrIORBit( P2, MODULE_CTS );

    PM1 = 0;
    SetIORBit( PM1, RS232_RXD );
    SetIORBit( PM1, MODULE_TXD );
    P1 |= RS232_TXD;
    P1 |= MODULE_RXD;
	
    PM0 = 0;
    P0 = 0;      
    delay( 0x1FFF );
}

void _mcu_clock_init(void)
{
    unsigned char i;
    unsigned char temp_stabset, temp_stabwait;
	
    SetIORBit( PM12, 0x06 );
    ClrIORBit( OSCCTL, 0x80 );
    SetIORBit( OSCCTL, 0x40 );
    ClrIORBit( MOC, 0x80 );    	
	
    temp_stabset = CG_X1STAB_STA;
    do
    {
        clr_wdt();
        temp_stabwait = OSTC;
        temp_stabwait &= temp_stabset;
    }while( temp_stabwait != temp_stabset );
    OSTS = CG_X1STAB_SEL;

    for( i = 0; i <= 50; i++ )	NOP();
    ClrIORBit( OSCCTL, 0x01 );
    SetIORBit( MCM, 0x05 );
    SetIORBit( PM12, 0x18 );
    ClrIORBit( OSCCTL, 0x20 );
    SetIORBit( OSCCTL, 0x10 );	
    SetIORBit( RCM, 0x01 );	
    PCC = CG_CPU_CLOCKSEL;	
}

void _mcu_init(void)
{
    _disable_interrupt();
    _mcu_clock_init();
    _mcu_io_init();
    _enable_interrupt();
}

const unsigned char _mcu_sw_ver[] = { MCU_SW_VER_DATE,MCU_SW_VER_MON, MCU_SW_VER_YEAR };

void _mcu_sw_ver_init(void)
{   
    unsigned char temp[3],i,Sflag;
	
    for( i = 0; i < 3; i++ )
    {
        E2promRead( MCU_SW_VER, (unsigned  char *)&temp[0], 3 );        
        if( is_equal( ( unsigned char * )&temp[0], (unsigned char *)&_mcu_sw_ver[0], 3 ) == OK )
        {
            break;
        }
    }    
	
    if( i == 3 )
    {  
        // 初始化MCU 软件版本号    
        E2promWrite( MCU_SW_VER, (unsigned char *)&_mcu_sw_ver[0], 3 );   

        // 打开安全开关		
        _memset0xff_and_write_E2prom( MANUFACTURER_SOFT_SWITCH, 3 );

        // 运行在厂家设置状态
        Sflag = MaderConfig;
        E2promWrite( CONFIG_GRADE, &Sflag, 1 ); 

        // 清厂家默认IP 地址		
        E2promWrite( CLIENT_DEFAULT_IP_ADDRESS, (unsigned char *)&_NO_IP_ADDR2[0], LEN_IP_ADDRESS );

        // 清客户默认IP 地址		 
        E2promWrite( MANUFACTURER_DEFAULT_IP_ADDRESS, (unsigned char *)&_NO_IP_ADDR2[0], LEN_IP_ADDRESS );	 

        // AT 命令初始化
        ClrE2prom( ADDR_ATCOMMAND_START, 50, 10 );

        // 自动上线时间间隔60 分钟
        temp[0] = 12;
        E2promWrite( MANUFACTURER_AUTOLOAD_TIME, (unsigned char *)&temp[0], 1 );
        E2promWrite( CLIENT_AUTOLOAD_TIME, (unsigned char *)&temp[0], 1 );

        // 波特率为9600
        temp[0] = 5;
        E2promWrite( MANUFACTURER_BAUD_RATE, (unsigned char *)&temp[0], 1 );
        E2promWrite( CLIENT_BAUD_RATE, (unsigned char *)&temp[0], 1 );

    }

    E2promRead( CONFIG_GRADE, &Sflag, 1 );
    if( Sflag == MaderConfig )
    {
        soft_switch |= SOFT_SWITCH_GRADE;
        E2promRead( MANUFACTURER_SOFT_SWITCH, &Sflag, 1 );        
    }
    else
    {
        soft_switch &=~ SOFT_SWITCH_GRADE;
        E2promRead( CLIENT_SOFT_SWITCH, &Sflag, 1 );
    }
	
    if( ( Sflag & SWITCH_SET_CALL_LOAD_BIT ) != 0 )
    {
        soft_switch |= SOFT_SWITCH_CALL_LOAD;
    }        		    

    if( ( Sflag & SWITCH_SET_AUTO_LOAD_BIT ) != 0 )
    {
        soft_switch |= SOFT_SWITCH_AUTO_LOAD;
    } 
}

void _device_init(void)
{
    TM51_Init();		
    modem_uart_init();
    mcu_uart_init();
    TimerCounter[TIMER_PROC_MODEM_INIT] = 1;	
}

const EVENT_PROC_PTR _sys_evt_proc[]=
{
    on_tick,
    on_frmmcu_frame,
    on_frmmodem_frame, 
    on_second,
    on_minute,
    on_modem_uart_init,
    on_mcu_uart_init    
};

#define SYS_EVENT_MAX     (sizeof(_sys_evt_proc) / sizeof(EVENT_PROC_PTR))
#define SYS_EVENT_MASK   ((1 << SYS_EVENT_MAX) - 1)
#define SYS_EVT_PROC(pos)  _sys_evt_proc[pos]()

void main(void)
{
    unsigned char pos;
    _sys_evt_word_t int_event_mask;

    _mcu_init();              
    _mcu_sw_ver_init();    	
    _device_init();

test_evt:
    int_event_mask = 1;
    for( pos=0; pos<SYS_EVENT_MAX; pos++ )
    {
        if( int_event_mask & SYS_EVT_VAR )
        {
            SYS_EVT_PROC(pos);
            sys_evt_del(int_event_mask);
            clr_wdt();
            goto test_evt;
        }
        
        if( ( SYS_EVT_VAR & SYS_EVENT_MASK ) == 0 )
        {
            break;
        }
        
        int_event_mask <<= 1;
    }
    goto test_evt;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -