bsp_timer.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #include "include.h"
  2. #if 0
  3. ///软件timer capture示例
  4. #define TMR3_RCLK (1000*cfg_bt_tws_tick_freq)
  5. //timer3 capture
  6. AT(.com_text.tmr.isr)
  7. void timer3_isr(void)
  8. {
  9. u32 tmrcnt;
  10. if (TMR3CON & BIT(10)) { //timer3 capture interrupt
  11. TMR3CNT = TMR3CNT - TMR3CPT;
  12. tmrcnt = TMR3CPT; //capture value
  13. TMR3CPND = BIT(10);
  14. tmrcnt /= TMR3_RCLK; //convert to ms
  15. } else if (TMR3CON & BIT(9)) { //timer3 overflow interrupt
  16. TMR3CPND = BIT(9);
  17. tmrcnt = 110; //110ms overflow
  18. } else {
  19. return;
  20. }
  21. // irrx_sw_isr(tmrcnt);
  22. }
  23. #define IR_CAPTURE_PORT() {GPIOEDE |= BIT(4); GPIOEPU |= BIT(4); GPIOEDIR |= BIT(4);}
  24. #define TMR3CAP_MAPPING TMR3MAP_PE4
  25. AT(.text.tmr.init)
  26. void timer3_init(void)
  27. {
  28. IR_CAPTURE_PORT();
  29. FUNCMCON2 = TMR3CAP_MAPPING;
  30. sys_irq_init(IRQ_TMR3_VECTOR, 0, timer3_isr);
  31. TMR3CNT = 0;
  32. TMR3PR = TMR3_RCLK*110 - 1; //110ms Timer overflow interrupt
  33. TMR3CON = BIT(8) | BIT(7) | BIT(5) | BIT(3)| BIT(2) | BIT(1) | BIT(0); //capture & overflow interrupt enable, falling edge, Capture Mode
  34. }
  35. #endif
  36. //软件timer timer-mode示例:timer3 time-mode
  37. //AT(.com_rodata.isr)
  38. //const char str_t3[] = " -------------- T3 --------------\n";
  39. //
  40. //AT(.com_text.isr)
  41. //void timer3_isr(void) //timer3中断函数
  42. //{
  43. // if (TMR3CON & BIT(9)) { //overflow Pending
  44. // TMR3CPND = BIT(9);
  45. // my_printf(str_t3);
  46. // }
  47. //}
  48. //
  49. ///*****************************************************************************
  50. // * 功能 : 配置timer3计时模式
  51. // * 注意 : TMRCON3 bit[6:4]为分频系数, 001:div2, 010:div4,..., 110:div64 至少配1;
  52. // TMRCON3 bit7:计数模式, 触发计数中断; bit8:捕捉模式,触发捕捉中断;
  53. // 中断触发函数timer3_isr, 整个函数都要放在公共区;
  54. // * 返回 : 无
  55. // *****************************************************************************/
  56. //void timer3_init(void)
  57. //{
  58. // CLKGAT0 |= BIT(3); //timer3 clkgat 要放在最前面
  59. // asm("nop");asm("nop");
  60. // asm("nop");asm("nop");
  61. //
  62. // u8 div_sel = 2; //对应BIT4
  63. // u32 tim3pr_1s = 24000000 / div_sel - 1; //1s对应的CNT
  64. // TMR3CON = 0;
  65. // TMR3CON |= BIT(4) | BIT(2); //BIT2:Timer clk select xosc24mhz; BIT(4):prepare clk div2
  66. //
  67. // TMR3CNT = 0;
  68. // TMR3PR = tim3pr_1s / 2; //示例500ms
  69. // TMR3CON |= BIT(7); //Timer works in Timer Mode,Timer overflow interrupt enable
  70. // TMR3CON |= BIT(0); //Timer enable
  71. // sys_irq_init(IRQ_TMR3_VECTOR, 0, timer3_isr);
  72. //}
  73. ///PWM 呼吸灯示例
  74. //void timer5_pwm2_g2_pb4(void)
  75. //{
  76. // printf("timer5_pwm2_g2_pb4\n");
  77. // //初始化io
  78. // GPIOBDIR &= ~BIT(4);
  79. // GPIOBDE |= BIT(4);
  80. // GPIOBFEN |= BIT(4);
  81. // //选择功能映射io
  82. // FUNCMCON1 = (2 << 16);
  83. //
  84. // //开启时钟源
  85. // CLKGAT0 |= BIT(5);
  86. // asm("nop");asm("nop");
  87. // asm("nop");asm("nop");
  88. // TMR5CON = BIT(20);
  89. // TMR5CON |= (1 << 4) | BIT(2);
  90. //
  91. // //填写timer的pr值;此示例选择的是24mhz时钟源,即1s内 timer_cnt会自增 23999999次;
  92. // //当timer_cnt自增值达到pr时,则timer_cnt会重新置1,再继续自增;
  93. // //当pr填 24000000 / 500 - 1,意味着timer_cnt 自增到该pr值,则恢复1,即1s内会进行500次循环 =>500hz
  94. // u32 tim5pr = 24000000 / 500 - 1;
  95. // TMR5PR = tim5pr/2; //500hz
  96. // TMR5CNT = 1;
  97. // //开启timer和pwm2,1s内,500次去读占空比和推出占空比的高电平
  98. // TMR5CON |= BIT(0);
  99. // //初始化占空比为0,在5ms中断里,会继续修改此占空比
  100. //// TMR5DUTY2 = 0;
  101. // TMR5DUTY2 = tim5pr/4; //示例:50%占空比
  102. //}
  103. //
  104. //#define DUTY_STEP (48000 /200) //调整呼吸灯步进,分子固定 (24000000 / 500),增大分母,占空比则步进增大
  105. //AT(.com_text.timer)
  106. //void breath_led_scan(void) //调整呼吸灯频率,放到5ms中断就跑的更快,20ms中断就慢一些,和步进配合决定效果
  107. //{
  108. // static bool dir_up = true; //判断呼还是吸
  109. // static u32 duty = 0; //当前输出高平的带宽
  110. //
  111. // if (dir_up) { //开始吸
  112. // duty += DUTY_STEP;
  113. // if (duty > 48000) {
  114. // dir_up = false;
  115. // duty = 48000;
  116. // }
  117. // } else {
  118. // if (duty > DUTY_STEP) { //开始呼
  119. // duty -= DUTY_STEP;
  120. // } else {
  121. // duty = 0;
  122. // dir_up = true;
  123. // }
  124. // }
  125. // TMR5DUTY2 = duty;
  126. //}