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

📄 sys_main.c

📁 小区巡检系统,MSPF437,里面主要参考的内容为TI单片机的低功耗处理,仅供参考,不能用于商业.
💻 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 "rf256_drv.h"
#include "indication.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();

    // init rf
    rf_off();

    IND_ON();
    _delay(0x1FFF);
    IND_OFF();
}

/* table of event handler
*/
const EVENT_PROC_PTR _sys_evt_proc[]=
{ 
    _on_comm,
    _on_card,
    _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();

    load_record_count(_record_cnt);
    //if(load_record_count(_record_cnt)==OK)
    {
        _load_data(ADDR_PERSON_ID,_person_id,LEN_PERSON_ID);
        _person_id[4]=sys_do_checksum(_person_id,LEN_PERSON_ID);
        _load_data(ADDR_LINE_NUM,(unsigned char *)&_line_num[0],LEN_LINE_NUM);
        _line_num[1]=_line_num[0];
        _record_cnt[0]=(_record_cnt[0]+MAX_RECORD_COUNT-1)%MAX_RECORD_COUNT;
        _record_cnt[0]=ADDR_RECORD+_record_cnt[0]*(LEN_RECORD+OFFSET_CHKSUM);
        _load_data(_record_cnt[0],(unsigned char *)&_NewRecord.person_id[0],LEN_RECORD);
        _record_cnt[0]=_record_cnt[1];
    }

#ifdef TEST_RFCARD
    while(1)
    {
        _on_card();
    }
#endif

#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 + -