public.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #include "public.h"
  2. pvFunction pUserTaskCb=NULL;
  3. uint16 UserTaskCbTime=0;
  4. volatile uint32_t sys_timer_run_ms=0;
  5. volatile uint32_t sys_timer_run_sec=0;
  6. __near_func __interrupt void t3_irq(void);
  7. __near_func __interrupt void t4_irq(void);
  8. __near_func __interrupt void P1INT_Exti_ISR(void);
  9. //32MHZ us延时函数;
  10. #pragma optimize=none
  11. void system_delay_us(unsigned int n)
  12. {
  13. n>>=1;
  14. while(n--)
  15. {
  16. asm("NOP");
  17. asm("NOP");
  18. asm("NOP");
  19. asm("NOP");
  20. asm("NOP");
  21. asm("NOP");
  22. asm("NOP");
  23. asm("NOP");
  24. asm("NOP");
  25. asm("NOP");
  26. asm("NOP");
  27. asm("NOP");
  28. asm("NOP");
  29. asm("NOP");
  30. asm("NOP");
  31. }
  32. }
  33. void system_delay_ms(unsigned int n)
  34. {
  35. while(n--)
  36. {
  37. system_delay_us(1000);
  38. }
  39. }
  40. void SYSTEM_TICK_Init(pvFunction user_time_cb,uint16 time)
  41. {
  42. InitTimer4();//初始化定时器4 作为系统时基
  43. if(user_time_cb!=NULL&&time>0)
  44. {
  45. pUserTaskCb = user_time_cb;
  46. UserTaskCbTime = time;
  47. }
  48. }
  49. /****************************************************************************
  50. * 名 称: InitTimer3()
  51. * 功 能: 定时器初始化,系统不配置工作时钟时默认是2分频,即16MHz
  52. * 入口参数: 无
  53. * 出口参数: 无
  54. ****************************************************************************/
  55. void InitTimer3(void)
  56. {
  57. T3IE = 1; //开总中断和T3中断
  58. //T3CTL (0xCB)–定时器 3 控制 bit7:5 -->111: 标记频率/128
  59. T3CTL |= 0xE0; //128分频,F=16M/128=125000HZ T=1/F=8us 计数一次8us 计满溢出
  60. T3CTL |= 0x08 ; //开溢出中断 bit3 溢出中断屏蔽 0:中断禁止 1:中断使能
  61. // T3CTL &= ~0x03; // 自动重装 00->0xff bit1:0--->00: 自由运行,从0x00到0xFF反复计数
  62. T3CTL &= ~0x01; // //设置为 模模式 从0x00到T3CC0重复计数 bit1:0 -->10
  63. T3CC0 = 250; //设置最大计数值 这里设置250 2ms触发一次中断
  64. T3CCTL0 = 0x04;// bit2 选择定时器3通道0捕获或者比较模式 比较模式
  65. T3CTL |= 0x10; // bit4 启动定时器。正常运行时设置,暂停时清除
  66. //T3CTL bit2 清除计数器。写1到CLR复位计数器到0x00,并初始化相关通道所有的输出引脚。总是读作0。
  67. EA = 1; //开总中断
  68. //T3CNT (0xEA) – 定时器 3 计数器 定时器计数字节。包括8位计数器当前值。
  69. P1DIR=0xff;
  70. }
  71. /****************************/
  72. //定时器3中断函数
  73. /****************************/
  74. #pragma vector=T3_VECTOR
  75. __near_func __interrupt void t3_irq(void)
  76. {
  77. //T3STAT &= ~0x01;
  78. IRCON &= ~0x04; //T3IF clear //清除定时器3通道0中断标志
  79. }
  80. /****************************************************************************
  81. * 名 称: InitTimer4()
  82. * 功 能: 定时器初始化,系统不配置工作时钟时默认是2分频,即16MHz
  83. * 入口参数: 无
  84. * 出口参数: 无
  85. ****************************************************************************/
  86. void InitTimer4(void)
  87. {
  88. T4IE = 1; //开总中断和T4中断
  89. //T3CTL (0xCB)–定时器 3 控制 bit7:5 -->111: 标记频率/128
  90. T4CTL |= 0xE0; //128分频,F=16M/128=125000HZ T=1/F=8us 计数一次8us 计满溢出
  91. T4CTL |= 0x08 ; //开溢出中断 bit3 溢出中断屏蔽 0:中断禁止 1:中断使能
  92. // T3CTL &= ~0x03; // 自动重装 00->0xff bit1:0--->00: 自由运行,从0x00到0xFF反复计数
  93. T4CTL &= ~0x01; // //设置为 模模式 从0x00到T4CC0重复计数 bit1:0 -->10
  94. T4CC0 = 250; //设置最大计数值 这里设置250 2ms触发一次中断
  95. T4CCTL0 = 0x04;// bit2 选择定时器3通道0捕获或者比较模式 比较模式
  96. T4CTL |= 0x10; // bit4 启动定时器。正常运行时设置,暂停时清除
  97. //T3CTL bit2 清除计数器。写1到CLR复位计数器到0x00,并初始化相关通道所有的输出引脚。总是读作0。
  98. EA = 1; //开总中断
  99. //T3CNT (0xEA) – 定时器 3 计数器 定时器计数字节。包括8位计数器当前值。
  100. }
  101. /****************************/
  102. //定时器4中断函数
  103. /****************************/
  104. #pragma vector=T4_VECTOR
  105. __near_func __interrupt void t4_irq(void)
  106. {
  107. //T4STAT &= ~0x01;
  108. static uint16 user_cnt=0;
  109. IRCON &= ~0x08; //T4IF clear //清除定时器4通道0中断标志
  110. if(++user_cnt>UserTaskCbTime)
  111. {
  112. user_cnt=0;
  113. if(pUserTaskCb!=NULL)
  114. {
  115. (*pUserTaskCb)();
  116. }
  117. }
  118. sys_timer_run_ms+=2;
  119. if(sys_timer_run_ms%1000==0)
  120. {
  121. sys_timer_run_sec++;
  122. }
  123. //
  124. // if(++cnt>500)
  125. // {
  126. // cnt=0;
  127. // P1^=0xff;
  128. // }
  129. }
  130. uint32_t get_sys_timer_run_ms(void)
  131. {
  132. return sys_timer_run_ms;
  133. }
  134. uint32_t get_sys_timer_run_sec(void)
  135. {
  136. return sys_timer_run_sec;
  137. }
  138. /*===============P1端口外部中断初始化函数==================*/
  139. void Init_P1Prot_Exti(void)
  140. {
  141. IEN2 |= 0x10; //端口1中断使能
  142. P1IEN |= 0x04; //端口P1_2外部中断使能 端口P1.7到P1.0中断使能
  143. PICTL |= 0x02; //端口P1_0到P1_3下降沿触发 3到0输入模式下的中断配置。该位为所有端口1的输入选择中断请求条件0: 输入的上升沿引起中断1: 输入的下降沿引起中断
  144. EA = 1; //使能总中断
  145. }
  146. /*================外部中断1服务函数====================*/
  147. #pragma vector = P1INT_VECTOR //外部中断1的向量入口
  148. __near_func __interrupt void P1INT_Exti_ISR(void)
  149. {
  150. /*先清除引脚标志位,再清除端口标志位,否则会不断进入中断*/
  151. P1IFG &= ~ 0x04; //软件清除P1_2引脚的标志位
  152. P1IF = 0; //软件清除P1端口组的标志位
  153. }