timer.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /**************************************************************************
  2. * TIMER使用例程
  3. * 1. 只能使用timer2, timer3,其它timer已经被系统使用
  4. * 2. timer2只有counter功能,timer3有counter/capture/pwm功能
  5. *
  6. **************************************************************************/
  7. #include "include.h"
  8. /*
  9. ///高优先级中断(一定要加FIQ属性)
  10. AT(.com_text.timer2) FIQ
  11. void timer2_isr(void)
  12. {
  13. TMR2CPND = BIT(9); //clear timer2 overflow pending
  14. }
  15. ///这里只是示例怎么用高优先级中断,最好使用低优先级中断。
  16. void timer2_init(void)
  17. {
  18. sys_irq_init(IRQ_TMR2_VECTOR, 1, timer2_isr); //注册高优先级中断
  19. TMR2CON = BIT(7); //Timer overflow interrupt enable
  20. TMR2CNT = 0;
  21. TMR2PR = 50000 - 1; //50ms period
  22. TMR2CON |= BIT(2) | BIT(0); //Timer works in Counter Mode
  23. }
  24. ///低优先级中断(不用加FIQ属性)
  25. AT(.com_text.timer3)
  26. void timer3_isr(void)
  27. {
  28. if (TMR3CON & BIT(16)) { //timer3 overflow pending
  29. TMR3CPND = BIT(16); //clear timer3 overflow pending
  30. }
  31. }
  32. void timer3_counter_init(void)
  33. {
  34. sys_irq_init(IRQ_TMR3_VECTOR, 0, timer3_isr); //注册低优先级中断
  35. TMR3CON = BIT(7); //Timer overflow interrupt enable
  36. TMR3CNT = 0;
  37. TMR3PR = 5000 - 1; //5ms period
  38. TMR3CON |= BIT(2) | BIT(0); //Timer works in Counter Mode
  39. }
  40. //timer3 pwm(pwm0: PA6, pwm1: PA7, pwm2: PB3)
  41. void timer3_pwm_init(void)
  42. {
  43. GPIOADE |= BIT(6) | BIT(7);
  44. GPIOADIR &= ~(BIT(6) | BIT(7));
  45. GPIOBDE |= BIT(3);
  46. GPIOBDIR &= ~BIT(3);
  47. FUNCMCON2 = (1 << 8);
  48. TMR3CNT = 0;
  49. TMR3PR = (1000*3)-1;
  50. TMR3DUTY0 = 1000 - 1; //pwm0 duty, low level: TMR3DUTY0 + 1, high level: TMR3PR-TMR3DUTY0+1
  51. TMR3DUTY1 = 2000 - 1; //pwm1 duty
  52. TMR3DUTY2 = 500 - 1; //pwm2 duty
  53. TMR3CON = BIT(9) | BIT(10) | BIT(11); //timer3 pwm0(bit9), pwm1(bit10), pwm2 enable(bit11)
  54. TMR3CON |= BIT(2); //timer increase clk, 1:select xosc26_div 1MHz, 0:select sysclk 26MHz
  55. TMR3CON |= BIT(0); //Timer enable
  56. }
  57. */