timer.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include <stdint.h>
  2. #include "system.h"
  3. static uint32_t master_clock = 0;
  4. /** Use TIM4_CH4, which is linked to PD15 AF1 **/
  5. int pwm_init(uint32_t clock, uint32_t threshold)
  6. {
  7. uint32_t val = (clock / 100000); /* Frequency is 100 KHz */
  8. uint32_t lvl;
  9. master_clock = clock;
  10. if (threshold > 100)
  11. return -1;
  12. lvl = (val * threshold) / 100;
  13. if (lvl != 0)
  14. lvl--;
  15. APB1_CLOCK_RST |= TIM4_APB1_CLOCK_ER_VAL;
  16. __asm__ volatile ("dmb");
  17. APB1_CLOCK_RST &= ~TIM4_APB1_CLOCK_ER_VAL;
  18. APB1_CLOCK_ER |= TIM4_APB1_CLOCK_ER_VAL;
  19. /* disable CC */
  20. TIM4_CCER &= ~TIM_CCER_CC4_ENABLE;
  21. TIM4_CR1 = 0;
  22. TIM4_PSC = 0;
  23. TIM4_ARR = val - 1;
  24. TIM4_CCR4 = lvl;
  25. TIM4_CCMR1 &= ~(0x03 << 0);
  26. TIM4_CCMR1 &= ~(0x07 << 4);
  27. TIM4_CCMR1 |= TIM_CCMR1_OC1M_PWM1;
  28. TIM4_CCMR2 &= ~(0x03 << 8);
  29. TIM4_CCMR2 &= ~(0x07 << 12);
  30. TIM4_CCMR2 |= TIM_CCMR2_OC4M_PWM1;
  31. TIM4_CCER |= TIM_CCER_CC4_ENABLE;
  32. TIM4_CR1 |= TIM_CR1_CLOCK_ENABLE | TIM_CR1_ARPE;
  33. __asm__ volatile ("dmb");
  34. return 0;
  35. }
  36. /* Timer 2: Use val 60000 with PSC 1400 for 1s tick (84 Mhz) */
  37. /* Timer 2: Use val 52500 with PSC 200 for 1/8 s tick (84 Mhz) */
  38. #define TMR2_INIT_VAL 52500
  39. #define TMR2_INIT_PSC 200
  40. void timer_init(void)
  41. {
  42. uint32_t val = 0;
  43. uint32_t psc = 1;
  44. uint32_t err = 0;
  45. nvic_irq_enable(NVIC_TIM2_IRQN);
  46. nvic_irq_setprio(NVIC_TIM2_IRQN, 0);
  47. APB1_CLOCK_RST |= TIM2_APB1_CLOCK_ER_VAL;
  48. __asm__ volatile ("dmb");
  49. APB1_CLOCK_RST &= ~TIM2_APB1_CLOCK_ER_VAL;
  50. APB1_CLOCK_ER |= TIM2_APB1_CLOCK_ER_VAL;
  51. TIM2_CR1 = 0;
  52. __asm__ volatile ("dmb");
  53. TIM2_PSC = TMR2_INIT_PSC;
  54. TIM2_ARR = TMR2_INIT_VAL;
  55. TIM2_CR1 |= TIM_CR1_CLOCK_ENABLE;
  56. TIM2_DIER |= TIM_DIER_UIE;
  57. __asm__ volatile ("dmb");
  58. }
  59. static volatile uint32_t tim2_ticks = 0;
  60. void isr_tim2(void)
  61. {
  62. TIM2_SR &= ~TIM_SR_UIF;
  63. tim2_ticks++;
  64. }
  65. void gettime(uint32_t *seconds, uint32_t *microseconds)
  66. {
  67. *microseconds = ((TIM2_CNT * TMR2_INIT_PSC) / 84) + (tim2_ticks & 0x07) * 125000;
  68. *seconds = (tim2_ticks >> 3);
  69. }