board.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /*
  2. * Copyright (C) 2021, lizhengyang
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-09-02 lizhengyang first version
  9. */
  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #include "board.h"
  13. void rt_os_tick_callback(void)
  14. {
  15. rt_interrupt_enter();
  16. rt_tick_increase();
  17. rt_interrupt_leave();
  18. }
  19. void SysClkConfig(void)
  20. {
  21. stc_clk_sysclk_cfg_t stcSysClkCfg;
  22. stc_clk_xtal_cfg_t stcXtalCfg;
  23. stc_clk_mpll_cfg_t stcMpllCfg;
  24. stc_sram_config_t stcSramConfig;
  25. MEM_ZERO_STRUCT(stcSysClkCfg);
  26. MEM_ZERO_STRUCT(stcXtalCfg);
  27. MEM_ZERO_STRUCT(stcMpllCfg);
  28. /* Set bus clk div. */
  29. stcSysClkCfg.enHclkDiv = ClkSysclkDiv1;
  30. stcSysClkCfg.enExclkDiv = ClkSysclkDiv2;
  31. stcSysClkCfg.enPclk0Div = ClkSysclkDiv1;
  32. stcSysClkCfg.enPclk1Div = ClkSysclkDiv2;
  33. stcSysClkCfg.enPclk2Div = ClkSysclkDiv4;
  34. stcSysClkCfg.enPclk3Div = ClkSysclkDiv4;
  35. stcSysClkCfg.enPclk4Div = ClkSysclkDiv2;
  36. CLK_SysClkConfig(&stcSysClkCfg);
  37. /* Switch system clock source to MPLL. */
  38. /* Use Xtal as MPLL source. */
  39. stcXtalCfg.enMode = ClkXtalModeOsc;
  40. stcXtalCfg.enDrv = ClkXtalLowDrv;
  41. stcXtalCfg.enFastStartup = Enable;
  42. CLK_XtalConfig(&stcXtalCfg);
  43. CLK_XtalCmd(Enable);
  44. while (Set != CLK_GetFlagStatus(ClkFlagXTALRdy))
  45. {
  46. ;
  47. }
  48. /* MPLL config. */
  49. stcMpllCfg.pllmDiv = 1ul;
  50. stcMpllCfg.plln = 50ul;
  51. stcMpllCfg.PllpDiv = 4ul;
  52. stcMpllCfg.PllqDiv = 4ul;
  53. stcMpllCfg.PllrDiv = 4ul;
  54. CLK_SetPllSource(ClkPllSrcXTAL);
  55. CLK_MpllConfig(&stcMpllCfg);
  56. /* flash read wait cycle setting */
  57. EFM_Unlock();
  58. EFM_SetLatency(5ul);
  59. EFM_Lock();
  60. /* sram init include read/write wait cycle setting */
  61. stcSramConfig.u8SramIdx = Sram12Idx | Sram3Idx | SramHsIdx | SramRetIdx;
  62. stcSramConfig.enSramRC = SramCycle2;
  63. stcSramConfig.enSramWC = SramCycle2;
  64. stcSramConfig.enSramEccMode = EccMode3;
  65. stcSramConfig.enSramEccOp = SramNmi;
  66. stcSramConfig.enSramPyOp = SramNmi;
  67. SRAM_Init(&stcSramConfig);
  68. /* Enable MPLL. */
  69. CLK_MpllCmd(Enable);
  70. /* Wait MPLL ready. */
  71. while (Set != CLK_GetFlagStatus(ClkFlagMPLLRdy))
  72. {
  73. ;
  74. }
  75. /* Switch system clock source to MPLL. */
  76. CLK_SetSysClkSource(CLKSysSrcMPLL);
  77. }
  78. void SysTick_Handler(void)
  79. {
  80. rt_os_tick_callback();
  81. }
  82. /**
  83. * This function will initial your board.
  84. */
  85. void rt_hw_board_init(void)
  86. {
  87. SysClkConfig();
  88. SysTick_Init(RT_TICK_PER_SECOND);
  89. /* Call components board initial (use INIT_BOARD_EXPORT()) */
  90. #ifdef RT_USING_COMPONENTS_INIT
  91. rt_components_board_init();
  92. #endif
  93. #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
  94. rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
  95. #endif
  96. #if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
  97. rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
  98. #endif
  99. }
  100. void rt_hw_us_delay(rt_uint32_t us)
  101. {
  102. uint32_t start, now, delta, reload, us_tick;
  103. start = SysTick->VAL;
  104. reload = SysTick->LOAD;
  105. us_tick = SystemCoreClock / 1000000UL;
  106. do
  107. {
  108. now = SysTick->VAL;
  109. delta = start > now ? start - now : reload + start - now;
  110. }
  111. while (delta < us_tick * us);
  112. }