mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-22 17:12:55 +08:00
144 lines
2.9 KiB
C
144 lines
2.9 KiB
C
|
/**
|
||
|
* @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);
|
||
|
}
|