📄 sys_main.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 + -