pit.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: pit.c
  4. 文件版本: 01.01
  5. 创建作者: sunxi
  6. 创建日期: 2008-06-25
  7. 功能说明: 可编程中断定时器程序。
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "bsp.h"
  14. #include "rt.h"
  15. #include "head.h"
  16. /*------------------------------- 宏定义 --------------------------------------
  17. */
  18. /*------------------------------ 全局变量 -------------------------------------
  19. */
  20. unsigned int g_count_156us;
  21. FN_PIT_CALLBACK g_pit_callback_5ms;
  22. FN_PIT_CALLBACK g_pit_callback_156us;
  23. struct rt_stat g_stat_156us;
  24. struct rt_stat g_stat_5ms;
  25. extern struct rt_stat g_stat_periodus_5ms;
  26. void pit_156us_isr(void);
  27. void pit_5ms_isr(void);
  28. //void pit_250us_isr(void); // sunxi 20190425 added
  29. int pit_500us_isr(int irq, void *data);
  30. /*------------------------------ 外部函数 -------------------------------------
  31. */
  32. /******************************************************************************
  33. 函数名称: pit_init
  34. 函数版本: 01.01
  35. 创建作者: sunxi
  36. 创建日期: 2008-06-25
  37. 函数说明: pit初始化。目前使用PIT0产生1ms中断。
  38. 参数说明: 无
  39. 返回值: 无
  40. 修改记录:
  41. */
  42. int pit_init(void)
  43. {
  44. pit_stat_reset();
  45. return 0;
  46. }
  47. int pit_exit(void)
  48. {
  49. rt_free_irq(CFG_PIT_VECTOR_BEGIN+CFG_PIT_5MS); // 释放5ms中断
  50. rt_free_irq(CFG_PIT_VECTOR_BEGIN+CFG_PIT_SAMPLE); // 释放156us中断
  51. return 0;
  52. }
  53. /******************************************************************************
  54. 函数名称: pit_regester_callback
  55. 函数版本: 01.01
  56. 创建作者: sunxi
  57. 创建日期: 2011-04-22
  58. 函数说明: 登记PIT的定时回调函数。
  59. 参数说明:
  60. period_us: 定时周期,以us为单位。
  61. fn: 回调函数。
  62. 返回值: 成功返回0,失败返回负数。
  63. 修改记录:
  64. */
  65. int pit_regester_callback(int period_us,FN_PIT_CALLBACK fn)
  66. {
  67. switch(period_us)
  68. {
  69. case 5000:
  70. g_pit_callback_5ms = fn;
  71. break;
  72. case 156:
  73. g_pit_callback_156us = fn;
  74. break;
  75. default:
  76. return -1;
  77. }
  78. return 0;
  79. }
  80. /******************************************************************************
  81. 函数名称: pit_156us_period_set
  82. 函数版本: 01.01
  83. 创建作者: sunxi
  84. 创建日期: 2012-12-05
  85. 函数说明: 通过测得的线路频率,修改采样周期。
  86. 参数说明:
  87. hz: 通过测频电路测得的线路频率。Q16定点数。
  88. 返回值: 成功返回0,失败返回负数。
  89. 修改记录:
  90. */
  91. int pit_156us_period_set(float hz)
  92. {
  93. unsigned short pmr;
  94. hz *= CFG_ADC_DOTS_PER_PERIOD*4;// 128点采样
  95. // 根据公式计算pmr。
  96. pmr = (unsigned short)rt_round((CFG_CPU_CLK/2)/hz);
  97. pmr -= 2;
  98. //设置定时周期。
  99. // MCF_PIT3_PMR = pmr;
  100. //rt_printf("pit_156us_period:hz=%s,pmr=0x%04x\r\n",q16_to_str(hz/128),pmr);
  101. return 0;
  102. }
  103. /******************************************************************************
  104. 函数名称: pit_5ms_isr
  105. 函数版本: 01.01
  106. 创建作者: sunxi
  107. 创建日期: 2008-06-25
  108. 函数说明: pit0中断服务程序。
  109. 参数说明: 无
  110. 返回值: 无
  111. 修改记录:
  112. */
  113. void pit_5ms_isr(void)
  114. {
  115. // 统计中断延时
  116. // rt_stat_in(&g_stat_5ms,(uint32_t)(PIT_PERIOD_5MS - MCF_PIT2_PCNTR));
  117. // 先清除中断
  118. // MCF_PIT2_PCSR |= MCF_PIT_PCSR_PIF;
  119. //5ms主回调函数
  120. if(g_pit_callback_5ms)
  121. {
  122. g_pit_callback_5ms(0);
  123. }
  124. //软件狗喂狗
  125. watchdog_feed_protect();
  126. }
  127. /******************************************************************************
  128. 函数名称: pit_156us_isr
  129. 函数版本: 01.01
  130. 创建作者: sunxi
  131. 创建日期: 2011-04-22
  132. 函数说明: pit1中断服务程序。
  133. 参数说明: 无
  134. 返回值: 无
  135. 修改记录:
  136. */
  137. //extern struct rt_irq_node g_rt_irq_list[RT_IRQS_NUM];
  138. void dido_soe_gen(void);
  139. void pit_156us_isr(void)
  140. {
  141. #if 0
  142. int mod;
  143. uint32_t count;
  144. uint32_t us0;
  145. count = (uint32_t)(MCF_PIT3_PMR - MCF_PIT3_PCNTR);
  146. rt_stat_in(&g_stat_156us,count);
  147. us0 = ustimer_get_origin();
  148. // 先清除中断。
  149. MCF_PIT3_PCSR |= MCF_PIT_PCSR_PIF;
  150. //根据g_count_156us统一计算mod和is625us,保证两者的同步。
  151. mod = (int)(g_count_156us &0x03);
  152. // is625us = (mod == 0x03) ? 1:0;
  153. //调用ADC中断处理函数
  154. adc_isr(mod);
  155. // SOE发生器
  156. dido_soe_gen();
  157. // 遥信扫描
  158. dido_di_poll();
  159. //回调156us应用处理函数
  160. if (g_pit_callback_156us != NULL)
  161. {
  162. g_pit_callback_156us(mod);
  163. }
  164. //计数器加一。
  165. g_count_156us++;
  166. // 喂ADC看门狗
  167. watchdog_feed_adc();
  168. // 由于针对采样中断的入口进行了优化,所以将时间统计放在这儿。
  169. rt_stat_in(&g_rt_irq_list[CFG_PIT_VECTOR_BEGIN+3].stat,ustimer_get_duration(us0));
  170. #endif
  171. }
  172. int pit_stat_reset(void)
  173. {
  174. rt_stat_init(&g_stat_156us,"pit_156us_isr(8ns)");
  175. rt_stat_init(&g_stat_5ms,"pit_5ms_isr(128ns)");
  176. rt_stat_init(&g_stat_periodus_5ms, "pit_5ms_priod(1us)");
  177. return 0;
  178. }
  179. int pit_stat_printf(void)
  180. {
  181. rt_printf("\r\n[实时中断延时统计(单位:见各行)]\r\n");
  182. rt_stat_printf(&g_stat_156us);
  183. rt_stat_printf(&g_stat_5ms);
  184. rt_stat_printf(&g_stat_periodus_5ms);
  185. return 0;
  186. }
  187. int pit_500us_isr(int irq, void *data)
  188. {
  189. // 清除中断标志
  190. //MCF_PIT1_PCSR |= MCF_PIT_PCSR_PIF;
  191. //goose_timer_handle();
  192. return 0;
  193. }
  194. /*------------------------------ 测试函数 -------------------------------------
  195. */
  196. //#ifdef CFG_BSP_DEBUG
  197. #if 0
  198. #include "ustimer.h"
  199. int pit_test(void)
  200. {
  201. uint32_t t,t0;
  202. t=0;
  203. t0 = ustimer_get_origin();
  204. sti(0);
  205. while(1)
  206. {
  207. rt_printf("pit(t=%04d):5ms:%06d,156us:%08d,[156us-t*6400:%d],[5ms-t*200:%d]!\r\n",
  208. t,
  209. g_count_5ms,
  210. g_count_156us,
  211. g_count_156us -t*6400,
  212. g_count_5ms -t*200);
  213. watchdog_feed_software_5s();
  214. t++;
  215. ustimer_delay_origin(t0,t*USTIMER_SEC);
  216. }
  217. }
  218. #endif
  219. /*------------------------------ 文件结束 -------------------------------------
  220. */