Timer.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. #include "Timer.h"
  2. #include "boardinit.h"
  3. #include "../App/public.h"
  4. #include "../App/xspDataOpt.h"
  5. uint32_t g_iDelayfinish;
  6. volatile uint32_t gTimer_tickt = 0;
  7. TimerInfo g_timeInfo;
  8. void TIMER5_IRQHandler(void)
  9. {
  10. if(timer_flag_get(TIMER5,TIMER_FLAG_UP) != RESET){
  11. g_iDelayfinish = 1;
  12. timer_disable(TIMER5);
  13. timer_flag_clear(TIMER5,TIMER_FLAG_UP);/* 定时器更新中断的标识位需要手动清除 */
  14. }
  15. }
  16. void timer5_init(void)
  17. {
  18. timer_parameter_struct timer_initpara;
  19. rcu_periph_clock_enable(RCU_TIMER5);/* 使能TIMER5时钟 */
  20. /* TIMER5 初始化配置 */
  21. timer_deinit(TIMER5);
  22. timer_initpara.prescaler = 7200-1;/* 时钟预分频系数 10KHz*/
  23. timer_initpara.period = 1000-1;/* 自动重装载值 500-500us 1000-1ms */
  24. timer_initpara.counterdirection = TIMER_COUNTER_UP; /* 向上计数模式 */
  25. timer_init(TIMER5,&timer_initpara);
  26. timer_single_pulse_mode_config(TIMER5,TIMER_SP_MODE_SINGLE);
  27. //timer_enable(TIMER5);
  28. nvic_irq_enable(TIMER5_IRQn, 3, 3);/* TIMER5中断设置,抢占优先级3,子优先级3 */
  29. //timer_interrupt_enable(TIMER5,TIMER_INT_UP);/* 使能更新中断 */
  30. timer_flag_clear(TIMER5,TIMER_FLAG_UP);/* 定时器更新中断的标识位需要手动清除 */
  31. timer_interrupt_disable(TIMER5,TIMER_INT_UP);
  32. timer_counter_value_config(TIMER5,0);
  33. timer_disable(TIMER5);
  34. }
  35. void start_delay_ms(uint32_t delayms)
  36. {
  37. g_iDelayfinish = 0;
  38. //timer_prescaler_config(TIMER5,10800-1);
  39. timer_autoreload_value_config(TIMER5,delayms*10-1);
  40. timer_counter_value_config(TIMER5,0);
  41. timer_enable(TIMER5);
  42. timer_interrupt_enable(TIMER5,TIMER_INT_UP);/* 使能更新中断 */
  43. }
  44. void stop_delay_ms(void)
  45. {
  46. timer_disable(TIMER5);
  47. timer_flag_clear(TIMER5,TIMER_FLAG_UP);/* 定时器更新中断的标识位需要手动清除 */
  48. }
  49. static void display_led_status(uint32_t tickt)
  50. {
  51. static volatile uint8_t ledgreen = 0, ledred=0;
  52. static volatile uint8_t num = 0;
  53. if(0 == g_devMsg.ledgreen) { // 绿灯状态不亮
  54. LED_GREEN_SET();// gpio_bit_set(GPIOC, GPIO_PIN_13);
  55. }
  56. else if(1 == g_devMsg.ledgreen){ // 绿灯慢闪
  57. if(tickt%50000==0) {
  58. if(ledgreen==0) LED_GREEN_SET();//gpio_bit_set(GPIOC, GPIO_PIN_13);
  59. else LED_GREEN_RESET();//gpio_bit_reset(GPIOC, GPIO_PIN_13);
  60. ledgreen = !ledgreen;
  61. }
  62. }
  63. else if(2 == g_devMsg.ledgreen) { // 绿灯快闪
  64. if(tickt%20000==0) {
  65. if(ledgreen==0) LED_GREEN_SET();//gpio_bit_set(GPIOC, GPIO_PIN_13);
  66. else LED_GREEN_RESET();//gpio_bit_reset(GPIOC, GPIO_PIN_13);
  67. ledgreen = !ledgreen;
  68. }
  69. }
  70. else if(3 == g_devMsg.ledgreen) { // 绿灯常亮
  71. LED_GREEN_RESET();//gpio_bit_reset(GPIOC, GPIO_PIN_13);
  72. }
  73. else if((4 == g_devMsg.ledgreen) ||(5 == g_devMsg.ledgreen)){
  74. if( g_devMsg.ledgreen == 5){
  75. if((tickt%30002) == 0){
  76. g_devMsg.ledgreen = 6;
  77. return;
  78. }
  79. }
  80. if(tickt%20000==0) {
  81. if(ledgreen==0) {
  82. LED_GREEN_SET();//gpio_bit_set(GPIOC, GPIO_PIN_13);
  83. LED_RED_SET();//gpio_bit_set(GPIOA, GPIO_PIN_0);
  84. }
  85. else {
  86. LED_GREEN_RESET();//gpio_bit_reset(GPIOC, GPIO_PIN_13);
  87. LED_RED_RESET();//gpio_bit_reset(GPIOA, GPIO_PIN_0);
  88. num++;
  89. if(num>g_devMsg.ledred){
  90. g_devMsg.ledgreen = 5;// 上电显示灯已经结束
  91. LED_GREEN_SET();//gpio_bit_set(GPIOC, GPIO_PIN_13);
  92. LED_RED_SET();//gpio_bit_set(GPIOA, GPIO_PIN_0);
  93. ledgreen = 1;
  94. }
  95. }
  96. ledgreen = !ledgreen;
  97. }
  98. return;
  99. }
  100. if(0 == g_devMsg.ledred) { // 红灯状态不亮
  101. LED_RED_SET();//gpio_bit_set(GPIOA, GPIO_PIN_0);
  102. }
  103. else if(1 == g_devMsg.ledred){ // 红灯慢闪
  104. if(tickt%50000==0) {
  105. if(ledred==0) LED_RED_SET();//gpio_bit_set(GPIOA, GPIO_PIN_0);
  106. else LED_RED_RESET();//gpio_bit_reset(GPIOA, GPIO_PIN_0);
  107. ledred = !ledred;
  108. }
  109. }
  110. else if(2 == g_devMsg.ledred) { // 红灯快闪
  111. if(tickt%20000==0) {
  112. if(ledred==0) LED_RED_SET();//gpio_bit_set(GPIOA, GPIO_PIN_0);
  113. else LED_RED_RESET();//gpio_bit_reset(GPIOA, GPIO_PIN_0);
  114. ledred = !ledred;
  115. }
  116. }
  117. else if(3 == g_devMsg.ledred) { // 红灯常亮
  118. LED_RED_RESET();//gpio_bit_reset(GPIOA, GPIO_PIN_0);
  119. }
  120. }
  121. void TIMER4_IRQHandler(void)
  122. {
  123. volatile uint8_t status = 0,i = 0,j=0;
  124. volatile uint16_t status1 = 0,daUp = 0,daDn = 0;
  125. volatile uint8_t count = 0,flag = 0;
  126. volatile static uint32_t lasttick = 0;
  127. if(RESET != timer_flag_get(TIMER4,TIMER_FLAG_UP)){
  128. gTimer_tickt++;
  129. display_led_status(gTimer_tickt);
  130. deal_gun_status(gTimer_tickt);
  131. #if (0) //(SEL_74CH165)
  132. // if((g_timeInfo.bExit == 1) &&((gTimer_tickt-g_timeInfo.exitTick)>=g_timeInfo.delay) ){
  133. // if((0 == g_timeInfo.bRead) && (RESET == gpio_input_bit_get(g_extimsg.csGroup,g_extimsg.extiPin))){
  134. // //exti_interrupt_disable(g_extimsg.extiLine); // 关闭外部中断
  135. // reset_port_pin(PLNALL,USE_PORT_ID);
  136. // delay_ms(3);//延时
  137. // set_port_pin(PLNALL,USE_PORT_ID);
  138. // g_timeInfo.bExit = 0;
  139. // g_timeInfo.bRead = 1;
  140. // }
  141. // }
  142. #else
  143. #if(NO_INIT_COLLECT)
  144. // if(g_testCollDa.bTestCollDa == 0){
  145. // if((g_timeInfo.bExit == 1) &&((gTimer_tickt-g_timeInfo.exitTick)>=g_timeInfo.delay) ){
  146. // exti_interrupt_disable(g_extimsg.extiLine); // 关闭外部中断
  147. // for(count = 0;count<COLLECT_NUM;count++){
  148. // status = gpio_input_bit_get(g_extimsg.extiPort,g_extimsg.extiPin);
  149. // //status1 = (status == 1 ? 0xFFFF : 0x0000);
  150. // if(status == 0x00) {
  151. // flag = 0;
  152. // set_all_cs_port_status(SET); // 所有的片选置高
  153. // for(j=0;j<20;j++);
  154. // for(i=0;i<CS_GROUP_NUM;i++){
  155. // gpio_bit_reset(g_csPortMsg[i].csPort,g_csPortMsg[i].csPin);
  156. // gpio_bit_reset(g_csPortMsg[i+12].csPort,g_csPortMsg[i+12].csPin);
  157. // for(j=0;j<20;j++);
  158. // daDn = (gpio_input_port_get(GPIOE));//(status1)^
  159. // daUp = (gpio_input_port_get(GPIOD));// (status1)^
  160. // g_timeInfo.testsrcDa[count][i] = (daDn>>8)&0xFF;
  161. // g_timeInfo.testsrcDa[count][i+CS_GROUP_NUM] = daUp&0xFF;
  162. // //g_timeInfo.srcDa[i] = (daDn>>8)&0xFF;
  163. // //g_timeInfo.srcDa[i+CS_GROUP_NUM] = daUp&0xFF;
  164. // gpio_bit_set(g_csPortMsg[i].csPort,g_csPortMsg[i].csPin);
  165. // gpio_bit_set(g_csPortMsg[i+12].csPort,g_csPortMsg[i+12].csPin);
  166. // for(j=0;j<20;j++);
  167. // }
  168. // }
  169. // else {
  170. // if((flag++) >3)
  171. // break;
  172. // }
  173. // }
  174. // g_timeInfo.count = count -flag;
  175. // //if(count >=COLLECT_NUM) {
  176. // g_timeInfo.bExit = 0;
  177. // g_timeInfo.bRead = 1;
  178. // // count = 0;
  179. // //}
  180. // }
  181. // }
  182. // else
  183. if((g_testCollDa.bTestCollDa == 1)&&(g_testCollDa.bdealDa == 0)){ // 测试采集数据的电平
  184. if(((gTimer_tickt%g_testCollDa.collTime) == 0) && (gTimer_tickt != lasttick)) {
  185. set_all_cs_port_status(SET); // 所有的片选置高
  186. for(j=0;j<20;j++);
  187. if(g_devMsg.bHYdev == 0x00){
  188. for(i=0;i<CS_GROUP_NUM;i++){
  189. //if(i!=8) continue;
  190. gpio_bit_reset(g_csPortMsg[i].csPort,g_csPortMsg[i].csPin);
  191. gpio_bit_reset(g_csPortMsg[i+12].csPort,g_csPortMsg[i+12].csPin);
  192. for(j=0;j<20;j++);
  193. daDn = (gpio_input_port_get(GPIOE));
  194. g_testCollDa.collDa[g_testCollDa.collNum][i] = (daDn>>8)&0xFF;
  195. daUp = (gpio_input_port_get(GPIOD));
  196. g_testCollDa.collDa[g_testCollDa.collNum][i+CS_GROUP_NUM] = daUp&0xFF;
  197. gpio_bit_set(g_csPortMsg[i].csPort,g_csPortMsg[i].csPin);
  198. gpio_bit_set(g_csPortMsg[i+12].csPort,g_csPortMsg[i+12].csPin);
  199. for(j=0;j<20;j++);
  200. }
  201. }
  202. else {
  203. for(i=0;i<CS_GROUP_NUM;i++){
  204. //if(i!=8) continue;
  205. gpio_bit_reset(g_csPortMsg[i].csPort,g_csPortMsg[i].csPin);
  206. gpio_bit_reset(g_csPortMsg[i+12].csPort,g_csPortMsg[i+12].csPin);
  207. for(j=0;j<5;j++);
  208. daDn = (gpio_input_port_get(GPIOE));
  209. g_testCollDa.collDa[g_testCollDa.collNum][i] = (daDn>>8)&0xFF;
  210. daUp = (gpio_input_port_get(GPIOD));
  211. g_testCollDa.collDa[g_testCollDa.collNum][i+CS_GROUP_NUM] = daUp&0xFF;
  212. gpio_bit_set(g_csPortMsg[i].csPort,g_csPortMsg[i].csPin);
  213. gpio_bit_set(g_csPortMsg[i+12].csPort,g_csPortMsg[i+12].csPin);
  214. for(j=0;j<5;j++);
  215. }
  216. }
  217. //g_testCollDa.timer[g_testCollDa.collNum] = gTimer_tickt;
  218. g_testCollDa.collNum = (g_testCollDa.collNum+1)%TEST_COLL_DA_MAX_NUM;
  219. if(g_testCollDa.collNum == 0) g_testCollDa.bdealDa = 1;
  220. lasttick = gTimer_tickt;
  221. }
  222. }
  223. #endif
  224. #endif
  225. timer_flag_clear(TIMER4,TIMER_FLAG_UP);/* 定时器更新中断的标识位需要手动清除 */
  226. }
  227. }
  228. /*-------------------------------------------------------------------------
  229. * 初始化定时器4
  230. * 10us中断一次
  231. * ------------------------------------------------------------------------*/
  232. void timer4_init(void)
  233. {
  234. timer_parameter_struct timer_initpara;
  235. rcu_periph_clock_enable(RCU_TIMER4);/* 使能TIMER5时钟 */
  236. /* TIMER5 初始化配置 */
  237. timer_deinit(TIMER4);
  238. timer_initpara.prescaler = 71;/* 时钟预分频系数 */
  239. timer_initpara.period = 9;/* 自动重装载值 500-500us 1000-1ms */
  240. timer_init(TIMER4,&timer_initpara);
  241. timer_enable(TIMER4);
  242. nvic_irq_enable(TIMER4_IRQn, 3, 2);/* TIMER5中断设置,抢占优先级3,子优先级3 */
  243. timer_interrupt_enable(TIMER4,TIMER_INT_UP);/* 使能更新中断 */
  244. }