| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- /**
- * @file wm_cpu.c
- *
- * @brief cpu driver module
- *
- * @author kevin
- *
- * Copyright (c) 2014 Winner Microelectronics Co., Ltd.
- */
- #include "wm_regs.h"
- #include "wm_cpu.h"
- #include "core_804.h"
- #include "wm_hal.h"
- #define TICK_INT_PRIORITY 7
- __IO uint32_t uwTick;
- uint32_t uwTickPrio;
- static HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */
- /**
- * @brief This function is used to set cpu clock
- *
- * @param[in] clk select cpu clock, this parameter can be a value of @ref enum CPU_CLK
- *
- * @return None
- *
- * @note None
- */
- void SystemClock_Config(uint32_t clk)
- {
- uint32_t RegValue, bus2Fac, wlanDiv, cpuDiv = clk;
- if ((clk < 2) || (clk > 240))
- {
- return;
- }
- /*Close those not initialized clk. Except uart and gpio. */
- RegValue = READ_REG(RCC->CLK_EN);
- RegValue &= ~0x3FFFFF;
- RegValue |= 0x802;
- WRITE_REG(RCC->CLK_EN, RegValue);
- /* Close bbp clk */
- WRITE_REG(RCC->BBP_CLK, 0x0F);
-
- /* Config clk div */
- RegValue = READ_REG(RCC->CLK_DIV);
- wlanDiv = (RegValue>>8)&0xFF;
- RegValue &= 0xFF000000;
- RegValue |= 0x80000000;
- if(cpuDiv > 12)
- {
- bus2Fac = 1;
- wlanDiv = cpuDiv/4;
- }
- else /*wlan can run*/
- {
- wlanDiv=3;
- bus2Fac = (wlanDiv*4/cpuDiv)&0xFF;
- }
- RegValue |= (bus2Fac<<16) | (wlanDiv<<8) | cpuDiv;
- WRITE_REG(RCC->CLK_DIV, RegValue);
-
- HAL_InitTick(TICK_INT_PRIORITY);
- return;
- }
- /**
- * @brief This function is used to get cpu clock
- *
- * @param[out] *sysclk point to the addr for system clk output
- *
- * @return None
- *
- * @note None
- */
- void SystemClock_Get(wm_sys_clk *sysclk)
- {
- clk_div_reg clk_div;
- clk_div.w = READ_REG(RCC->CLK_DIV);
- sysclk->cpuclk = W805_PLL_CLK_MHZ/(clk_div.b.CPU);
- sysclk->wlanclk = W805_PLL_CLK_MHZ/(clk_div.b.WLAN);
- sysclk->apbclk = sysclk->cpuclk / clk_div.b.BUS2;
- }
- __attribute__((weak)) HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
- {
- wm_sys_clk sysclk;
-
- SystemClock_Get(&sysclk);
- SysTick_Config(sysclk.cpuclk * UNIT_MHZ / uwTickFreq);
- HAL_NVIC_SetPriority(SYS_TICK_IRQn, TickPriority);
- HAL_NVIC_EnableIRQ(SYS_TICK_IRQn);
- uwTickPrio = TickPriority;
- return HAL_OK;
- }
- __attribute__((weak)) void HAL_IncTick(void)
- {
- uwTick += 1;
- }
- __attribute__((weak)) uint32_t HAL_GetTick(void)
- {
- return uwTick;
- }
- __attribute__((weak)) void HAL_Delay(uint32_t Delay)
- {
- uint32_t tickstart = HAL_GetTick();
- uint32_t wait = Delay;
- while ((HAL_GetTick() - tickstart) < wait)
- {
- }
- }
- /* Priority: a value between 0 and 15
- * A lower priority value indicates a higher priority */
- void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t Priority)
- {
- NVIC_SetPriority(IRQn, Priority);
- }
- void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
- {
- /* Check the parameters */
- assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
- /* Enable interrupt */
- NVIC_EnableIRQ(IRQn);
- }
- void HAL_NVIC_DisableIRQ(IRQn_Type IRQn)
- {
- /* Check the parameters */
- assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
- /* Disable interrupt */
- NVIC_DisableIRQ(IRQn);
- }
|