You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
2.8 KiB

1 year ago
1 year ago
  1. #include "clock.hpp"
  2. #include "chip_helper.hpp"
  3. extern "C" {
  4. static zchip_tim_t* m_usdleaytim;
  5. uint32_t zchip_clock_init(zchip_clock_cfg_t* cfg) {
  6. m_usdleaytim = cfg->usdleaytim;
  7. uint32_t freq = chip_get_timer_clock_sorce_freq(cfg->usdleaytim);
  8. uint32_t prescaler = freq / 1000000 - 1; // 1us
  9. uint32_t autoreload = 65535;
  10. HAL_TIM_Base_DeInit(cfg->usdleaytim);
  11. cfg->usdleaytim->Init.Prescaler = prescaler;
  12. cfg->usdleaytim->Init.CounterMode = TIM_COUNTERMODE_UP;
  13. cfg->usdleaytim->Init.Period = autoreload;
  14. cfg->usdleaytim->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  15. HAL_TIM_Base_Init(cfg->usdleaytim);
  16. return 0;
  17. }
  18. //
  19. uint32_t zchip_clock_get_ticket(void) { return HAL_GetTick(); }
  20. uint32_t zchip_clock_hasspassed(uint32_t ticket) {
  21. uint32_t nowticket = HAL_GetTick();
  22. if (nowticket >= ticket) {
  23. return nowticket - ticket;
  24. }
  25. return UINT32_MAX - ticket + nowticket;
  26. }
  27. static HAL_StatusTypeDef _HAL_TIM_Base_Start(TIM_HandleTypeDef* htim) __attribute__((optimize("O2")));
  28. static HAL_StatusTypeDef _HAL_TIM_Base_Stop(TIM_HandleTypeDef* htim) __attribute__((optimize("O2")));
  29. static HAL_StatusTypeDef _HAL_TIM_Base_Start(TIM_HandleTypeDef* htim) {
  30. uint32_t tmpsmcr;
  31. /* Check the TIM state */
  32. if (htim->State != HAL_TIM_STATE_READY) {
  33. return HAL_ERROR;
  34. }
  35. htim->State = HAL_TIM_STATE_BUSY;
  36. if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) {
  37. tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
  38. if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) {
  39. __HAL_TIM_ENABLE(htim);
  40. }
  41. } else {
  42. __HAL_TIM_ENABLE(htim);
  43. }
  44. return HAL_OK;
  45. }
  46. static HAL_StatusTypeDef _HAL_TIM_Base_Stop(TIM_HandleTypeDef* htim) {
  47. /* Disable the Peripheral */
  48. __HAL_TIM_DISABLE(htim);
  49. /* Set the TIM state */
  50. htim->State = HAL_TIM_STATE_READY;
  51. /* Return function status */
  52. return HAL_OK;
  53. }
  54. void __zchip_clock_early_delayus(uint32_t n) {
  55. volatile uint32_t counter = 0;
  56. __HAL_TIM_SET_COUNTER(m_usdleaytim, 0);
  57. _HAL_TIM_Base_Start(m_usdleaytim);
  58. while (counter < n) {
  59. counter = __HAL_TIM_GET_COUNTER(m_usdleaytim);
  60. }
  61. _HAL_TIM_Base_Stop(m_usdleaytim);
  62. }
  63. void zchip_clock_early_delayus(uint32_t n) {
  64. uint32_t us = n % 1000;
  65. uint32_t ms = n / 1000;
  66. if (us > 0) {
  67. __zchip_clock_early_delayus(us);
  68. }
  69. for (uint32_t i = 0; i < ms; i++) {
  70. __zchip_clock_early_delayus(1000);
  71. }
  72. }
  73. }
  74. void zchip_clock_early_delayus2(uint32_t us) { __zchip_clock_early_delayus(us); }
  75. void zchip_clock_early_delayus_timer_start() {
  76. __HAL_TIM_SET_COUNTER(m_usdleaytim, 0);
  77. _HAL_TIM_Base_Start(m_usdleaytim);
  78. }
  79. uint32_t zchip_clock_early_delayus_timer_haspassed() {
  80. uint32_t counter = __HAL_TIM_GET_COUNTER(m_usdleaytim);
  81. return counter;
  82. }
  83. void zchip_clock_early_delayus_timer_stop() { _HAL_TIM_Base_Stop(m_usdleaytim); }