wm_cpu.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /**
  2. * @file wm_cpu.c
  3. *
  4. * @brief cpu driver module
  5. *
  6. * @author kevin
  7. *
  8. * Copyright (c) 2014 Winner Microelectronics Co., Ltd.
  9. */
  10. #include "wm_regs.h"
  11. #include "wm_cpu.h"
  12. #include "core_804.h"
  13. #include "wm_hal.h"
  14. #define TICK_INT_PRIORITY 7
  15. __IO uint32_t uwTick;
  16. uint32_t uwTickPrio;
  17. static HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */
  18. /**
  19. * @brief This function is used to set cpu clock
  20. *
  21. * @param[in] clk select cpu clock, this parameter can be a value of @ref enum CPU_CLK
  22. *
  23. * @return None
  24. *
  25. * @note None
  26. */
  27. void SystemClock_Config(uint32_t clk)
  28. {
  29. uint32_t RegValue, bus2Fac, wlanDiv, cpuDiv = clk;
  30. if ((clk < 2) || (clk > 240))
  31. {
  32. return;
  33. }
  34. /*Close those not initialized clk. Except uart and gpio. */
  35. RegValue = READ_REG(RCC->CLK_EN);
  36. RegValue &= ~0x3FFFFF;
  37. RegValue |= 0x802;
  38. WRITE_REG(RCC->CLK_EN, RegValue);
  39. /* Close bbp clk */
  40. WRITE_REG(RCC->BBP_CLK, 0x0F);
  41. /* Config clk div */
  42. RegValue = READ_REG(RCC->CLK_DIV);
  43. wlanDiv = (RegValue>>8)&0xFF;
  44. RegValue &= 0xFF000000;
  45. RegValue |= 0x80000000;
  46. if(cpuDiv > 12)
  47. {
  48. bus2Fac = 1;
  49. wlanDiv = cpuDiv/4;
  50. }
  51. else /*wlan can run*/
  52. {
  53. wlanDiv=3;
  54. bus2Fac = (wlanDiv*4/cpuDiv)&0xFF;
  55. }
  56. RegValue |= (bus2Fac<<16) | (wlanDiv<<8) | cpuDiv;
  57. WRITE_REG(RCC->CLK_DIV, RegValue);
  58. HAL_InitTick(TICK_INT_PRIORITY);
  59. return;
  60. }
  61. /**
  62. * @brief This function is used to get cpu clock
  63. *
  64. * @param[out] *sysclk point to the addr for system clk output
  65. *
  66. * @return None
  67. *
  68. * @note None
  69. */
  70. void SystemClock_Get(wm_sys_clk *sysclk)
  71. {
  72. clk_div_reg clk_div;
  73. clk_div.w = READ_REG(RCC->CLK_DIV);
  74. sysclk->cpuclk = W805_PLL_CLK_MHZ/(clk_div.b.CPU);
  75. sysclk->wlanclk = W805_PLL_CLK_MHZ/(clk_div.b.WLAN);
  76. sysclk->apbclk = sysclk->cpuclk / clk_div.b.BUS2;
  77. }
  78. __attribute__((weak)) HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
  79. {
  80. wm_sys_clk sysclk;
  81. SystemClock_Get(&sysclk);
  82. SysTick_Config(sysclk.cpuclk * UNIT_MHZ / uwTickFreq);
  83. HAL_NVIC_SetPriority(SYS_TICK_IRQn, TickPriority);
  84. HAL_NVIC_EnableIRQ(SYS_TICK_IRQn);
  85. uwTickPrio = TickPriority;
  86. return HAL_OK;
  87. }
  88. __attribute__((weak)) void HAL_IncTick(void)
  89. {
  90. uwTick += 1;
  91. }
  92. __attribute__((weak)) uint32_t HAL_GetTick(void)
  93. {
  94. return uwTick;
  95. }
  96. __attribute__((weak)) void HAL_Delay(uint32_t Delay)
  97. {
  98. uint32_t tickstart = HAL_GetTick();
  99. uint32_t wait = Delay;
  100. while ((HAL_GetTick() - tickstart) < wait)
  101. {
  102. }
  103. }
  104. /* Priority: a value between 0 and 15
  105. * A lower priority value indicates a higher priority */
  106. void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t Priority)
  107. {
  108. NVIC_SetPriority(IRQn, Priority);
  109. }
  110. void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
  111. {
  112. /* Check the parameters */
  113. assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
  114. /* Enable interrupt */
  115. NVIC_EnableIRQ(IRQn);
  116. }
  117. void HAL_NVIC_DisableIRQ(IRQn_Type IRQn)
  118. {
  119. /* Check the parameters */
  120. assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
  121. /* Disable interrupt */
  122. NVIC_DisableIRQ(IRQn);
  123. }