board.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*
  2. *
  3. * SPDX-License-Identifier: Apache-2.0
  4. *
  5. * Change Logs:
  6. * Date Author Notes
  7. * 2020-10-30 DongBowen first version
  8. */
  9. #include <rthw.h>
  10. #include <rtthread.h>
  11. #include "board.h"
  12. #include "hc32l196_sysctrl.h"
  13. #include "hc32l196_flash.h"
  14. /**
  15. * @brief BSP clock initialize.
  16. * Set board system clock to PLL@48MHz by RCH
  17. * @param None
  18. * @retval None
  19. */
  20. void rt_hw_board_clock_init(void)
  21. {
  22. stc_sysctrl_pll_cfg_t stcPLLCfg;
  23. Sysctrl_SetHCLKDiv(SysctrlHclkDiv1);
  24. Sysctrl_SetPCLKDiv(SysctrlPclkDiv1);
  25. /* switch clock to RCL before changing RCH */
  26. Sysctrl_SetRCLTrim(SysctrlRclFreq32768);
  27. Sysctrl_SetRCLStableTime(SysctrlRclStableCycle64);
  28. Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
  29. Sysctrl_SysClkSwitch(SysctrlClkRCL);
  30. /* set RCH to 4MHz */
  31. Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz);
  32. Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE);
  33. stcPLLCfg.enInFreq = SysctrlPllInFreq4_6MHz;
  34. stcPLLCfg.enOutFreq = SysctrlPllOutFreq36_48MHz;
  35. stcPLLCfg.enPllClkSrc = SysctrlPllRch; /* input clock: RCH */
  36. stcPLLCfg.enPllMul = SysctrlPllMul12; /* 4MHz x 12 = 48MHz */
  37. Sysctrl_SetPLLFreq(&stcPLLCfg);
  38. /*
  39. * When the used clock source HCLK is greater than 24M,
  40. * set the FLASH read wait cycle to 1 cycle.
  41. */
  42. Flash_WaitCycle(FlashWaitCycle1);
  43. /* enable PLL */
  44. Sysctrl_ClkSourceEnable(SysctrlClkPLL, TRUE);
  45. /* switch clock to PLL */
  46. Sysctrl_SysClkSwitch(SysctrlClkPLL);
  47. }
  48. /*******************************************************************************
  49. * Function Name : SysTick_Configuration
  50. * Description : Configures the SysTick for OS tick.
  51. * Input : None
  52. * Output : None
  53. * Return : None
  54. *******************************************************************************/
  55. void SysTick_Configuration(void)
  56. {
  57. rt_uint32_t cnts;
  58. cnts = Sysctrl_GetHClkFreq() / RT_TICK_PER_SECOND;
  59. SysTick_Config(cnts);
  60. }
  61. /**
  62. * This is the timer interrupt service routine.
  63. *
  64. */
  65. void SysTick_Handler(void)
  66. {
  67. /* enter interrupt */
  68. rt_interrupt_enter();
  69. rt_tick_increase();
  70. /* leave interrupt */
  71. rt_interrupt_leave();
  72. }
  73. /**
  74. * This function will initialize HC32 board.
  75. */
  76. void rt_hw_board_init()
  77. {
  78. /* Configure the System clock */
  79. rt_hw_board_clock_init();
  80. /* Configure the SysTick */
  81. SysTick_Configuration();
  82. #ifdef RT_USING_HEAP
  83. rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
  84. #endif
  85. #ifdef RT_USING_COMPONENTS_INIT
  86. rt_components_board_init();
  87. #endif
  88. #if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
  89. rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
  90. #endif
  91. }
  92. void rt_hw_us_delay(rt_uint32_t us)
  93. {
  94. uint32_t start, now, delta, reload, us_tick;
  95. start = SysTick->VAL;
  96. reload = SysTick->LOAD;
  97. us_tick = SystemCoreClock / 1000000UL;
  98. do
  99. {
  100. now = SysTick->VAL;
  101. delta = start > now ? start - now : reload + start - now;
  102. }
  103. while (delta < us_tick * us);
  104. }