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

📄 sys_main.c

📁 NEC9222参考代码
💻 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"

unsigned short get_Meter_ID(void);

const EVENT_PROC_PTR _sys_evt_proc[]=
{ 
    _on_seconds,    
    _on_key_down,
    _on_key_press,
};


#define MAX_DETECTION_VOLTAGE           10          //2.2V + 10 = 3.2V

unsigned char AD_conv_phase = 0;
unsigned char AD_conv_times = 0;
unsigned long AD_conv_result[AD_MAX_CHANNEL] = {0};
unsigned char report_status = 0; 
unsigned short meter_id = 0;
unsigned char battery_voltage = 0;


unsigned char system_switch = 1;
unsigned char check_dog_timer_flag = 0;
unsigned char start_check_dog_flag = 0;



__directmap const METER_ID_INFO _id_info = {0x0f00};



unsigned char Convert2ProgramMode(void)
{
    unsigned char i = 0;
    do{
        PFS = 0;
        PFCMD = 0xA5;
        FLPMC = 0x01;
        FLPMC = 0xFE;
        FLPMC = 0x01;
        if(i++ > 5)
            return 1;
    }while(PFS & 0x01);

    return 0;
    
}

unsigned char Convert2UserMode(void)
{
    unsigned char i = 0;
    do{
        PFS = 0;
        PFCMD = 0xA5;
        FLPMC = 0x00;
        FLPMC = 0xFF;
        FLPMC = 0x00;
        if(i++ > 5)
            return 1;
    }while(PFS & 0x01);

    return 0;
    
}

unsigned char flash_erase_block(unsigned short addr)
{
    unsigned char i = 0;
    do{
        
        FLCMD = 0x03;
        FLAPH = addr >> 8;
        FLAPL = 0x00;
        FLAPHC = addr >> 8;
        FLAPLC = 0x00;
        PFS = 0;
        HALT();
        if(i++ > 5)
            return 1;
    }while(PFS & 0x06);

    return 0;
    
}

unsigned char flash_program_byte(unsigned short addr, unsigned char value)
{

    FLCMD = 0x05;
    FLAPH = addr >> 8;
    FLAPL = addr & 0xff;
    FLW = value;
    PFS = 0;
    HALT();
    if(PFS & 0x06)
        return 1;
    return 0;
}

unsigned char verify_meter_id()
{
    unsigned short new_id, i = 0, errno = 1;
    meter_id = 0xFFFF;

    if(!ID_10X)
    {
        if(_id_info.rom_meter_id_status == METER_ID_STATUS_WORD)
        {
            meter_id = _id_info.rom_meter_id_value;
            return 0;
        }
    }
    
    if(Convert2ProgramMode())
        return 1;

    
    
    new_id = get_Meter_ID();
    if(new_id == 0xffff)
        new_id = 0x2143;
    while(1)
    {
        if(flash_program_byte( (unsigned short)(&(_id_info.rom_meter_id_status))+1, 0xFE))
            goto fl_err_proc;
        if(flash_program_byte( (unsigned short)(&(_id_info.rom_meter_id_status)), 0xCA))
            goto fl_err_proc;
        if(flash_program_byte( (unsigned short)(&(_id_info.rom_meter_id_value))+1, new_id>>8))
            goto fl_err_proc;
        if(flash_program_byte( (unsigned short)(&(_id_info.rom_meter_id_value)), new_id))
            goto fl_err_proc;
        
        errno = 0;
        break;
        
fl_err_proc:    
        if(flash_erase_block((unsigned short)(&(_id_info.rom_meter_id_status))))
        {
            break;
        }
        else
        {
            if(i++ > 5)
                break;
            continue;
        }
    }
    
    Convert2UserMode();

    if(errno)
        return 1;
    
    meter_id = _id_info.rom_meter_id_value;
    return 0;
}



void test_LCDB(void)
{
    LCD_LIGHT_ON();
    _delay(8000);
    LCD_LIGHT_OFF();
}

unsigned short get_Meter_ID(void)
{
    unsigned short meterID = 0, *ram_start_addr = 0xfe80;
    unsigned char i;
    for(i = 0; i < 64; i++)
    {
        meterID += *ram_start_addr;
        ram_start_addr++;
    }
    return meterID;
    
    
}


void get_Battery_Voltage(void)
{
    unsigned short int_flag = 0, j;
    unsigned short test_voltage = (RF_TIME_CALIBR + 3);
    unsigned char intStatus = PMK1,test_flag = 1;

    PMK1 = 1;
    P12.1 = 1;
    
#ifndef RF_MCU_DELAY
    RFXX_WRT_CMD(0xD000);
#endif
    RFXX_WRT_CMD(test_voltage);
    RFXX_WRT_CMD(0xC007);
    
    j = 0;
    //LED = 0;
    

    while(test_flag)
    {
        if(j++ > 500)
        {
            if((test_voltage & 0x1f) < MAX_DETECTION_VOLTAGE)
            {
                test_voltage++;
                RFXX_WRT_CMD(test_voltage);
                _clr_wdt();
                _delay(100);
                j = 0;
            }
            else
                break;
        }
                                
        while(!RF_IRQ)
        {
            int_flag = RFXX_WRT_CMD(0xcc00);    
            _clr_wdt();
            if(int_flag & 0x04)
            {            
                test_flag = 0;
                break;
            }            
        }
        _clr_wdt();
    }

    RFXX_WRT_CMD(RF_TIME_CALIBR);
    //RFXX_WRT_CMD(0xC220);
    RFXX_WRT_CMD(RF_TIME_SET);
    
    battery_voltage = test_voltage & 0x1f;  
    
    //LED = 1;
    //RFXX_WRT_CMD(0xFE00);
    //RF_init();
#if 0    
    RFXX_WRT_CMD(0xC001);
    RFXX_WRT_CMD(0xC2A0);    
    RFXX_WRT_CMD(0xE219);
    RFXX_WRT_CMD(0xC003);
#endif

    PMK1 = intStatus;

#ifndef RF_MCU_DELAY
    RFXX_WRT_CMD(0xD040);
#endif

    P12.1 = 0;
               
}


/* mcu power up or reboot
*/
void _mcu_init(void)
{
    unsigned char temp_stabset, temp_stabwait;
    
    _disable_interrupt();

    //Cpu clock and Fxp are Fx/2
    PCC = 0;
    PPCC = 0;

    PMC2=0x0F;      //AD input mode
    PM2 = 0xFf;
    ADM = 0x10;  //2.8~4V: 15us

    PM3=P3DIR_VAL;
    P3=P3OUT_VAL;
    //PU3 = BIT0;

    PM4= BIT3; //P4DIR_VAL;
    P4=P4OUT_VAL;
    //PU4 = BIT1|BIT3|BIT5;

    PM12=P12DIR_VAL;
    P12=P12OUT_VAL;

    P13.0 = 0;
    
    LSRSTOP = 0;
    WDTM = 0x67;            
}

void _device_init(void)
{
    unsigned char i;
    _disable_interrupt();
    
    if(verify_meter_id())
    {        
        while(1)
        {
            LED = 0;
            _delay(2000);
            _clr_wdt(); 
            LED = 1;
            _delay(2000);
        }        
    }    
    
    _clr_wdt(); 
    RF_init();
    get_Battery_Voltage();
    memset(AD_conv_result, 0, AD_MAX_CHANNEL*sizeof(unsigned long));
    AD_conv_phase = AD_MAX_CHANNEL;
    _sys_time.seconds = 0;
    _clr_wdt();

    //enable H1 Timer to clear watchdog period
    TMHMD1 = 0x50;
    CMP01 = 234;        //125ms //234
    
    _enable_interrupt();
        
}

void init_check_watch_dog_time()
{
    //unsigned char old_dog_value, new_dog_value;
    
    TMC00 = 0;
    CRC00 = 0xffff;
    PRM00 = 0x02;       // 8MHz/256
    start_check_dog_flag = 1;
    //check_dog_timer_flag = 1;
       
}

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

    
    _mcu_init();
    _device_init();
    init_check_watch_dog_time();

    PMK0 = 0;
    //PMK1 = 0;
    TMMKH1 = 0;
    TMHE1 = 1;  //start watch timer


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;    
    }
    _clr_wdt(); 

    if((AD_conv_phase < AD_MAX_CHANNEL) || _key_flag || check_dog_timer_flag)
    {
        HALT();
    }
    else     
    {
        STOP();
    }
    
 

    goto test_evt;
    
    return 0;
}

void AD_start()
{
    //P12.3 = 1;    
    ADCE = 1;    
    AD_conv_phase = 0;
    AD_conv_times = 0;
    ADS = AD_conv_phase;
    NOP();
    NOP();
    ADCS = 1;       //Start convert
    ADMK = 0;       //Enable interrupt
}

⌨️ 快捷键说明

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