191 lines
4.5 KiB
C++
191 lines
4.5 KiB
C++
#include "hardware_init.h"
|
|
#include "config.h"
|
|
#include "gd32f4xx.h"
|
|
#include "gd32f4xx_fmc.h"
|
|
|
|
namespace HardwareInit {
|
|
|
|
RetCode init()
|
|
{
|
|
systemClockConfig();
|
|
peripheralClockEnable();
|
|
gpioInit();
|
|
nvicConfig();
|
|
mpuConfig();
|
|
return RET_OK;
|
|
}
|
|
|
|
void systemClockConfig()
|
|
{
|
|
uint32_t timeout = 0U;
|
|
|
|
if ((RCU_CTL & RCU_CTL_PLLEN) && (RCU_CFG0 & RCU_SCSS_PLLP)) {
|
|
uint32_t pll_val = RCU_PLL;
|
|
uint32_t pll_n = (pll_val >> 6) & 0x1FF;
|
|
uint32_t pll_psc = pll_val & 0x3F;
|
|
|
|
if (pll_n == 336 && pll_psc == 25) {
|
|
SystemCoreClock = 168000000U;
|
|
return;
|
|
}
|
|
}
|
|
|
|
fmc_wscnt_set(WS_WSCNT_7);
|
|
|
|
RCU_CTL |= RCU_CTL_HXTALEN;
|
|
timeout = 0xFFFFFF;
|
|
while ((0U == (RCU_CTL & RCU_CTL_HXTALSTB)) && (timeout > 0)) {
|
|
timeout--;
|
|
}
|
|
|
|
if (0U == (RCU_CTL & RCU_CTL_HXTALSTB)) {
|
|
RCU_CTL |= RCU_CTL_IRC16MEN;
|
|
timeout = 0xFFFF;
|
|
while (0U == (RCU_CTL & RCU_CTL_IRC16MSTB) && timeout > 0) {
|
|
timeout--;
|
|
}
|
|
if (0U == (RCU_CTL & RCU_CTL_IRC16MSTB)) {
|
|
while (1) { }
|
|
}
|
|
RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;
|
|
RCU_CFG0 |= RCU_APB2_CKAHB_DIV2;
|
|
RCU_CFG0 |= RCU_APB1_CKAHB_DIV4;
|
|
RCU_CFG0 &= ~RCU_CFG0_SCS;
|
|
RCU_CFG0 |= RCU_CKSYSSRC_IRC16M;
|
|
timeout = 0xFFFF;
|
|
while (0U == (RCU_CFG0 & RCU_SCSS_IRC16M) && timeout > 0) {
|
|
timeout--;
|
|
}
|
|
SystemCoreClock = 16000000U;
|
|
return;
|
|
}
|
|
|
|
RCU_APB1EN |= RCU_APB1EN_PMUEN;
|
|
PMU_CTL |= PMU_CTL_LDOVS;
|
|
|
|
RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;
|
|
RCU_CFG0 |= RCU_APB2_CKAHB_DIV2;
|
|
RCU_CFG0 |= RCU_APB1_CKAHB_DIV4;
|
|
|
|
RCU_PLL = (25U | (336 << 6U) | (((2 >> 1U) - 1U) << 16U) |
|
|
(RCU_PLLSRC_HXTAL) | (7 << 24U));
|
|
|
|
RCU_CTL |= RCU_CTL_PLLEN;
|
|
timeout = 0xFFFF;
|
|
while (0U == (RCU_CTL & RCU_CTL_PLLSTB) && timeout > 0) {
|
|
timeout--;
|
|
}
|
|
|
|
if (0U == (RCU_CTL & RCU_CTL_PLLSTB)) {
|
|
RCU_CFG0 &= ~RCU_CFG0_SCS;
|
|
RCU_CFG0 |= RCU_CKSYSSRC_HXTAL;
|
|
timeout = 0xFFFF;
|
|
while (0U == (RCU_CFG0 & RCU_SCSS_HXTAL) && timeout > 0) {
|
|
timeout--;
|
|
}
|
|
SystemCoreClock = 25000000U;
|
|
return;
|
|
}
|
|
|
|
PMU_CTL |= PMU_CTL_HDEN;
|
|
timeout = 0xFFFF;
|
|
while (0U == (PMU_CS & PMU_CS_HDRF) && timeout > 0) {
|
|
timeout--;
|
|
}
|
|
PMU_CTL |= PMU_CTL_HDS;
|
|
timeout = 0xFFFF;
|
|
while (0U == (PMU_CS & PMU_CS_HDSRF) && timeout > 0) {
|
|
timeout--;
|
|
}
|
|
|
|
RCU_CFG0 &= ~RCU_CFG0_SCS;
|
|
RCU_CFG0 |= RCU_CKSYSSRC_PLLP;
|
|
timeout = 0xFFFF;
|
|
while (0U == (RCU_CFG0 & RCU_SCSS_PLLP) && timeout > 0) {
|
|
timeout--;
|
|
}
|
|
|
|
SystemCoreClock = 168000000U;
|
|
}
|
|
|
|
void peripheralClockEnable()
|
|
{
|
|
rcu_periph_clock_enable(RCU_GPIOA);
|
|
rcu_periph_clock_enable(RCU_GPIOB);
|
|
rcu_periph_clock_enable(RCU_GPIOC);
|
|
rcu_periph_clock_enable(RCU_GPIOD);
|
|
rcu_periph_clock_enable(RCU_GPIOE);
|
|
rcu_periph_clock_enable(RCU_GPIOF);
|
|
rcu_periph_clock_enable(RCU_GPIOG);
|
|
|
|
rcu_periph_clock_enable(RCU_USART1);
|
|
|
|
rcu_periph_clock_enable(RCU_I2C1);
|
|
|
|
rcu_periph_clock_enable(RCU_SPI1);
|
|
|
|
rcu_periph_clock_enable(RCU_ADC0);
|
|
|
|
rcu_periph_clock_enable(RCU_TIMER2);
|
|
|
|
rcu_periph_clock_enable(RCU_EXMC);
|
|
}
|
|
|
|
void gpioInit()
|
|
{
|
|
}
|
|
|
|
void nvicConfig()
|
|
{
|
|
}
|
|
|
|
void mpuConfig()
|
|
{
|
|
MPU->CTRL = 0U;
|
|
|
|
__DSB();
|
|
__ISB();
|
|
|
|
MPU->RNR = 0U;
|
|
MPU->RBAR = (0xC0000000U & MPU_RBAR_ADDR_Msk)
|
|
| (1UL << MPU_RBAR_VALID_Pos)
|
|
| (0UL << MPU_RBAR_REGION_Pos);
|
|
|
|
MPU->RASR = (1UL << MPU_RASR_XN_Pos)
|
|
| (3UL << MPU_RASR_AP_Pos)
|
|
| (1UL << MPU_RASR_TEX_Pos)
|
|
| (0UL << MPU_RASR_S_Pos)
|
|
| (0UL << MPU_RASR_C_Pos)
|
|
| (0UL << MPU_RASR_B_Pos)
|
|
| (0UL << MPU_RASR_SRD_Pos)
|
|
| (27UL << MPU_RASR_SIZE_Pos)
|
|
| (1UL << MPU_RASR_ENABLE_Pos);
|
|
|
|
__DSB();
|
|
__ISB();
|
|
|
|
MPU->RNR = 1U;
|
|
MPU->RBAR = (0x6C000000U & MPU_RBAR_ADDR_Msk)
|
|
| (1UL << MPU_RBAR_VALID_Pos)
|
|
| (1UL << MPU_RBAR_REGION_Pos);
|
|
|
|
MPU->RASR = (3UL << MPU_RASR_AP_Pos)
|
|
| (0UL << MPU_RASR_TEX_Pos)
|
|
| (0UL << MPU_RASR_S_Pos)
|
|
| (0UL << MPU_RASR_C_Pos)
|
|
| (1UL << MPU_RASR_B_Pos)
|
|
| (0UL << MPU_RASR_SRD_Pos)
|
|
| (25UL << MPU_RASR_SIZE_Pos)
|
|
| (1UL << MPU_RASR_ENABLE_Pos);
|
|
|
|
__DSB();
|
|
__ISB();
|
|
|
|
MPU->CTRL = MPU_CTRL_ENABLE_Msk | MPU_CTRL_PRIVDEFENA_Msk;
|
|
|
|
__DSB();
|
|
__ISB();
|
|
}
|
|
|
|
}
|