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

📄 sys_main.c

📁 单相多功能代码,计量芯片采用ADE7737做为计量,SPI通讯,仅供参考,不得用于商业
💻 C
字号:
#include "sys_main.h"
#include "sys_event.h"
#include "hal.h"
#include "pub_func.h"
#include "uart.h"
#include "storage.h"
#include "data_flash.h"
#include "measure.h"

/* mcu power up or reboot
*/
void _mcu_init(void)
{
    // Init WDT timer
    WDTCTL=WDT_ADLY_250;
    IE1|=WDTIE;
    
    // init port 1
    P1SEL=P1SEL_VAL;
    P1DIR=P1DIR_VAL;
    P1OUT=P1OUT_VAL;
    P1IES=P1IES_VAL;
    P1IFG=0;
    P1IE=P1IE_VAL;

    // init port 2
    P2SEL=P2SEL_VAL;
    P2DIR=P2DIR_VAL;
    P2OUT=P2OUT_VAL;
    P2IES=P2IES_VAL;
    P2IFG=0;
    P2IE=P2IE_VAL;
    
    // init port 3
    P3SEL=P3SEL_VAL;
    P3DIR=P3DIR_VAL;
    P3OUT=P3OUT_VAL;
    //P3IES=P3IES_VAL;
    //P3IFG=0;
    //P3IE=P3IE_VAL;

    // init uart
    uart_start_to_rx();

    _delay(0x1FFF);
}

void _device_init(void)
{
}

void _system_init(void)
{
    EnsurePeriodOfTime();
}

/* table of event handler
*/
const EVENT_PROC_PTR _sys_evt_proc[]=
{ 
    _on_comm,
    _on_days,
    _on_hours,
    _on_minutes,
    _on_seconds,
    _on_key_down,
};

#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]()

/* system entry point
*/
void main(void)
{
    unsigned char pos;
    _sys_evt_word_t int_event_mask;

#ifdef TEST_DATAFLASH
    unsigned long addr=0;
    unsigned char tst[16];
#endif
#ifdef TEST_UART
    unsigned char ii,jj=0;
#endif

    /*disable interrupt
    */
    _disable_interrupt();
    /* power up init
    */
    _mcu_init();
    /* enable interrupt
    */
    _enable_interrupt();

    _device_init();
    _system_init();

#ifdef TEST_UART
    while(1)
    {
        _frm_buf.len=FRAME_BUFFER_LEN;
        for(ii=0;ii<FRAME_BUFFER_LEN;ii++)
        {
            _frm_buf.buffer[ii]=jj++;
        }
        uart_start_to_tx();
    }
#endif

#ifdef TEST_DATAFLASH
    while(1)
    {
        _data_flash_read(addr,tst,16);
        for(pos=0;pos<16;pos++)
        {
           tst[pos]=pos;
        }
        _data_flash_write(addr,tst,16);
        memset(tst,0x0,16);
        _data_flash_read(addr,tst,16);
        addr+=16;
    }
#endif

test_evt:

    int_event_mask = 1;
    for(pos=0; pos<SYS_EVENT_MAX; pos++)
    {
        if(int_event_mask & SYS_EVT_VAR)
        {  
            //call event handler
            SYS_EVT_PROC(pos);

            //clear the event after process, this disables re-trigger
            _sys_evt_del(int_event_mask);
        }
        
        /* we may miss event, just a remind
        */
        if((SYS_EVT_VAR & SYS_EVENT_MASK) == 0) {
            break;
        }
        
        //next
        int_event_mask <<= 1;        
    }

    //some other events happened
    if(SYS_EVT_VAR) {
        goto test_evt;
    }

    //do check sum. 
    //So that we may check memory consistancy upon wake up
    //clear WDT before sleep
    _clr_wdt();
    /*sleep*/
    _BIS_SR(LPM3_bits+GIE);
    //clear WDT after sleep
    _clr_wdt();

    /*new event*/
    goto test_evt;
    
}

⌨️ 快捷键说明

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