123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- #include "public.h"
- pvFunction pUserTaskCb=NULL;
- uint16 UserTaskCbTime=0;
- volatile uint32_t sys_timer_run_ms=0;
- volatile uint32_t sys_timer_run_sec=0;
- __near_func __interrupt void t3_irq(void);
- __near_func __interrupt void t4_irq(void);
- __near_func __interrupt void P1INT_Exti_ISR(void);
- //32MHZ us延时函数;
- #pragma optimize=none
- void system_delay_us(unsigned int n)
- {
- n>>=1;
- while(n--)
- {
- asm("NOP");
- asm("NOP");
- asm("NOP");
- asm("NOP");
- asm("NOP");
- asm("NOP");
- asm("NOP");
- asm("NOP");
- asm("NOP");
- asm("NOP");
- asm("NOP");
- asm("NOP");
- asm("NOP");
- asm("NOP");
- asm("NOP");
- }
- }
- void system_delay_ms(unsigned int n)
- {
- while(n--)
- {
- system_delay_us(1000);
- }
- }
- void SYSTEM_TICK_Init(pvFunction user_time_cb,uint16 time)
- {
- InitTimer4();//初始化定时器4 作为系统时基
- if(user_time_cb!=NULL&&time>0)
- {
- pUserTaskCb = user_time_cb;
- UserTaskCbTime = time;
- }
- }
- /****************************************************************************
- * 名 称: InitTimer3()
- * 功 能: 定时器初始化,系统不配置工作时钟时默认是2分频,即16MHz
- * 入口参数: 无
- * 出口参数: 无
- ****************************************************************************/
- void InitTimer3(void)
- {
- T3IE = 1; //开总中断和T3中断
- //T3CTL (0xCB)–定时器 3 控制 bit7:5 -->111: 标记频率/128
- T3CTL |= 0xE0; //128分频,F=16M/128=125000HZ T=1/F=8us 计数一次8us 计满溢出
- T3CTL |= 0x08 ; //开溢出中断 bit3 溢出中断屏蔽 0:中断禁止 1:中断使能
- // T3CTL &= ~0x03; // 自动重装 00->0xff bit1:0--->00: 自由运行,从0x00到0xFF反复计数
- T3CTL &= ~0x01; // //设置为 模模式 从0x00到T3CC0重复计数 bit1:0 -->10
- T3CC0 = 250; //设置最大计数值 这里设置250 2ms触发一次中断
- T3CCTL0 = 0x04;// bit2 选择定时器3通道0捕获或者比较模式 比较模式
- T3CTL |= 0x10; // bit4 启动定时器。正常运行时设置,暂停时清除
- //T3CTL bit2 清除计数器。写1到CLR复位计数器到0x00,并初始化相关通道所有的输出引脚。总是读作0。
- EA = 1; //开总中断
- //T3CNT (0xEA) – 定时器 3 计数器 定时器计数字节。包括8位计数器当前值。
- P1DIR=0xff;
-
- }
- /****************************/
- //定时器3中断函数
- /****************************/
- #pragma vector=T3_VECTOR
- __near_func __interrupt void t3_irq(void)
- {
- //T3STAT &= ~0x01;
- IRCON &= ~0x04; //T3IF clear //清除定时器3通道0中断标志
-
- }
- /****************************************************************************
- * 名 称: InitTimer4()
- * 功 能: 定时器初始化,系统不配置工作时钟时默认是2分频,即16MHz
- * 入口参数: 无
- * 出口参数: 无
- ****************************************************************************/
- void InitTimer4(void)
- {
- T4IE = 1; //开总中断和T4中断
- //T3CTL (0xCB)–定时器 3 控制 bit7:5 -->111: 标记频率/128
- T4CTL |= 0xE0; //128分频,F=16M/128=125000HZ T=1/F=8us 计数一次8us 计满溢出
- T4CTL |= 0x08 ; //开溢出中断 bit3 溢出中断屏蔽 0:中断禁止 1:中断使能
- // T3CTL &= ~0x03; // 自动重装 00->0xff bit1:0--->00: 自由运行,从0x00到0xFF反复计数
- T4CTL &= ~0x01; // //设置为 模模式 从0x00到T4CC0重复计数 bit1:0 -->10
- T4CC0 = 250; //设置最大计数值 这里设置250 2ms触发一次中断
- T4CCTL0 = 0x04;// bit2 选择定时器3通道0捕获或者比较模式 比较模式
- T4CTL |= 0x10; // bit4 启动定时器。正常运行时设置,暂停时清除
- //T3CTL bit2 清除计数器。写1到CLR复位计数器到0x00,并初始化相关通道所有的输出引脚。总是读作0。
- EA = 1; //开总中断
- //T3CNT (0xEA) – 定时器 3 计数器 定时器计数字节。包括8位计数器当前值。
- }
- /****************************/
- //定时器4中断函数
- /****************************/
- #pragma vector=T4_VECTOR
- __near_func __interrupt void t4_irq(void)
- {
- //T4STAT &= ~0x01;
- static uint16 user_cnt=0;
- IRCON &= ~0x08; //T4IF clear //清除定时器4通道0中断标志
- if(++user_cnt>UserTaskCbTime)
- {
- user_cnt=0;
- if(pUserTaskCb!=NULL)
- {
- (*pUserTaskCb)();
- }
- }
- sys_timer_run_ms+=2;
- if(sys_timer_run_ms%1000==0)
- {
- sys_timer_run_sec++;
- }
-
- //
- // if(++cnt>500)
- // {
- // cnt=0;
- // P1^=0xff;
- // }
- }
- uint32_t get_sys_timer_run_ms(void)
- {
- return sys_timer_run_ms;
- }
- uint32_t get_sys_timer_run_sec(void)
- {
- return sys_timer_run_sec;
- }
- /*===============P1端口外部中断初始化函数==================*/
- void Init_P1Prot_Exti(void)
- {
- IEN2 |= 0x10; //端口1中断使能
- P1IEN |= 0x04; //端口P1_2外部中断使能 端口P1.7到P1.0中断使能
- PICTL |= 0x02; //端口P1_0到P1_3下降沿触发 3到0输入模式下的中断配置。该位为所有端口1的输入选择中断请求条件0: 输入的上升沿引起中断1: 输入的下降沿引起中断
- EA = 1; //使能总中断
- }
- /*================外部中断1服务函数====================*/
- #pragma vector = P1INT_VECTOR //外部中断1的向量入口
- __near_func __interrupt void P1INT_Exti_ISR(void)
- {
- /*先清除引脚标志位,再清除端口标志位,否则会不断进入中断*/
- P1IFG &= ~ 0x04; //软件清除P1_2引脚的标志位
- P1IF = 0; //软件清除P1端口组的标志位
- }
|