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.

56 lines
1.6 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years 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. HAL_NVIC_SetPriority(chip_tim_get_irq(cfg->usdleaytim), IFLYTOP_PREEMPTPRIORITY_DEFAULT, 0);
  17. HAL_NVIC_EnableIRQ(chip_tim_get_irq(cfg->usdleaytim));
  18. return 0;
  19. }
  20. //
  21. uint32_t zchip_clock_get_ticket(void) { return HAL_GetTick(); }
  22. uint32_t zchip_clock_hasspassed(uint32_t ticket) {
  23. uint32_t nowticket = HAL_GetTick();
  24. if (nowticket >= ticket) {
  25. return nowticket - ticket;
  26. }
  27. return UINT32_MAX - ticket + nowticket;
  28. }
  29. void __zchip_clock_early_delayus(uint32_t n) {
  30. volatile uint32_t counter = 0;
  31. __HAL_TIM_SET_COUNTER(m_usdleaytim, 0);
  32. HAL_TIM_Base_Start(m_usdleaytim);
  33. while (counter < n) {
  34. counter = __HAL_TIM_GET_COUNTER(m_usdleaytim);
  35. }
  36. HAL_TIM_Base_Stop(m_usdleaytim);
  37. }
  38. void zchip_clock_early_delayus(uint32_t n) {
  39. uint32_t us = n % 1000;
  40. uint32_t ms = n / 1000;
  41. if (us > 0) {
  42. __zchip_clock_early_delayus(us);
  43. }
  44. for (uint32_t i = 0; i < ms; i++) {
  45. __zchip_clock_early_delayus(1000);
  46. }
  47. }
  48. }