tim_delay.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include "at32f403a_407.h"
  2. #include "tim_delay.h"
  3. static bool tx_enable = false;
  4. //
  5. void mb_helper_tim_init(uint32_t baudrate)
  6. {
  7. float foo;
  8. foo = 1.0/((float)baudrate / 11.0);
  9. foo *= 2000.0; // время в мс (длительность в два символа)
  10. crm_clocks_freq_type crm_clocks_freq_struct = {0};
  11. crm_clocks_freq_get(&crm_clocks_freq_struct);
  12. nvic_irq_disable(TMR6_GLOBAL_IRQn);
  13. crm_periph_clock_enable(CRM_TMR6_PERIPH_CLOCK, TRUE);
  14. tmr_base_init(TMR6, (uint32_t)(foo * 1000) - 1, (crm_clocks_freq_struct.ahb_freq / 1000000) - 1);
  15. tmr_cnt_dir_set(TMR6, TMR_COUNT_UP);
  16. NVIC_ClearPendingIRQ(TMR6_GLOBAL_IRQn);
  17. nvic_irq_enable(TMR6_GLOBAL_IRQn, 5, 0);
  18. }
  19. //
  20. void mb_helper_tim_enable(void)
  21. {
  22. tmr_flag_clear(TMR6, TMR_OVF_FLAG);
  23. tmr_interrupt_enable(TMR6, TMR_OVF_INT, TRUE);
  24. tmr_counter_value_set(TMR6, 0);
  25. tmr_counter_enable(TMR6, TRUE);
  26. }
  27. //
  28. void mb_helper_tim_disable(void)
  29. {
  30. tmr_flag_clear(TMR6, TMR_OVF_FLAG);
  31. tmr_interrupt_enable(TMR6, TMR_OVF_INT, FALSE);
  32. tmr_counter_value_set(TMR6, 0);
  33. tmr_counter_enable(TMR6, FALSE);
  34. }
  35. //
  36. void mb_helper_set_tx_state(bool state)
  37. {
  38. tx_enable = state;
  39. }
  40. //
  41. void TMR6_GLOBAL_IRQHandler(void)
  42. {
  43. if(tmr_flag_get(TMR6, TMR_OVF_FLAG) != RESET)
  44. {
  45. tmr_flag_clear(TMR6, TMR_OVF_FLAG);
  46. if (tx_enable)
  47. usart_interrupt_enable(USART3, USART_TDBE_INT, TRUE);
  48. else
  49. gpio_bits_reset(GPIOD, GPIO_PINS_10);
  50. mb_helper_tim_disable();
  51. }
  52. }