144 lines
2.9 KiB
C
Raw Normal View History

2022-02-18 11:27:58 +08:00
/**
* @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);
}