bs_bcu_app/drv/drv_sys.c

186 lines
6.0 KiB
C
Raw Normal View History

2024-11-07 17:24:19 +08:00
/**
****************************************************************************************************
* @file bsp_delay.c
* @author
* @version V1.0
* @date 2024-02-10
* @brief
****************************************************************************************************
*/
#include "drv_sys.h"
/**
* @brief
* @param baseaddr:
* @param offset:
* @retval
*/
void sys_nvic_set_vector_table(uint32_t baseaddr, uint32_t offset)
{
/* 设置NVIC的向量表偏移寄存器,VTOR低9位保留,即[8:0]保留 */
SCB->VTOR = baseaddr | (offset & (uint32_t)0xFFFFFE00);
}
/**
* @brief : WFI指令(, )
* @param
* @retval
*/
void sys_wfi_set(void)
{
__ASM volatile("wfi");
}
/**
* @brief (fault和NMI中断)
* @param
* @retval
*/
void sys_intx_disable(void)
{
__ASM volatile("cpsid i");
}
/**
* @brief
* @param
* @retval
*/
void sys_intx_enable(void)
{
__ASM volatile("cpsie i");
}
/**
* @brief
* @note X, MDK误报,
* @param addr:
* @retval
*/
void sys_msr_msp(uint32_t addr)
{
__set_MSP(addr); /* 设置栈顶地址 */
}
/**
* @brief
* @param
* @retval
*/
void sys_standby(void)
{
__HAL_RCC_PWR_CLK_ENABLE(); /* 使能电源时钟 */
SET_BIT(PWR->CR, PWR_CR_PDDS); /* 进入待机模式 */
}
/**
* @brief
* @param
* @retval
*/
void sys_soft_reset(void)
{
NVIC_SystemReset();
}
/**
* @brief
* @param plln: PLL倍频系数(PLL倍频), : 64~432.
* @param pllm: PLL和音频PLL预分频系数(PLL之前的分频), : 2~63.
* @param pllp: PLL的p分频系数(PLL之后的分频), , : 2, 4, 6, 8.(4)
* @param pllq: PLL的q分频系数(PLL之后的分频), : 2~15.
* @note
*
* Fvco: VCO频率
* Fsys: , PLL的p分频输出时钟频率
* Fq: PLL的q分频输出时钟频率
* Fs: PLL输入时钟频率, HSI, HSE等.
* Fvco = Fs * (plln / pllm);
* Fsys = Fvco / pllp = Fs * (plln / (pllm * pllp));
* Fq = Fvco / pllq = Fs * (plln / (pllm * pllq));
*
* 8M的时候, : plln = 336, pllm = 8, pllp = 2, pllq = 7.
* :Fvco = 8 * (336 / 8) = 336Mhz
* Fsys = pll_p_ck = 336 / 2 = 168Mhz
* Fq = pll_q_ck = 336 / 7 = 48Mhz
*
* F407默认需要配置的频率如下:
* CPU频率(HCLK) = pll_p_ck = 168Mhz
* AHB1/2/3(rcc_hclk1/2/3) = 168Mhz
* APB1(rcc_pclk1) = pll_p_ck / 4 = 42Mhz
* APB1(rcc_pclk2) = pll_p_ck / 2 = 84Mhz
*
* @retval : 0, ; 1, ;
*/
uint8_t sys_stm32_clock_init(uint32_t plln, uint32_t pllm, uint32_t pllp, uint32_t pllq)
{
HAL_StatusTypeDef ret = HAL_OK;
RCC_OscInitTypeDef rcc_osc_init = {0};
RCC_ClkInitTypeDef rcc_clk_init = {0};
__HAL_RCC_PWR_CLK_ENABLE(); /* 使能PWR时钟 */
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /* 设置调压器输出电压级别,以便在器件未以最大频率工作 */
/* 使能HSE并选择HSE作为PLL时钟源配置PLL1开启USB时钟 */
rcc_osc_init.OscillatorType = RCC_OSCILLATORTYPE_HSE; /* 时钟源为HSE */
rcc_osc_init.HSEState = RCC_HSE_ON; /* 打开HSE */
rcc_osc_init.PLL.PLLState = RCC_PLL_ON; /* 打开PLL */
rcc_osc_init.PLL.PLLSource = RCC_PLLSOURCE_HSE; /* PLL时钟源选择HSE */
rcc_osc_init.PLL.PLLN = plln;
rcc_osc_init.PLL.PLLM = pllm;
rcc_osc_init.PLL.PLLP = pllp;
rcc_osc_init.PLL.PLLQ = pllq;
ret = HAL_RCC_OscConfig(&rcc_osc_init); /* 初始化RCC */
if(ret != HAL_OK)
{
return 1; /* 时钟初始化失败,可以在这里加入自己的处理 */
}
/* 选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2 */
rcc_clk_init.ClockType = ( RCC_CLOCKTYPE_SYSCLK \
| RCC_CLOCKTYPE_HCLK \
| RCC_CLOCKTYPE_PCLK1 \
| RCC_CLOCKTYPE_PCLK2);
rcc_clk_init.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; /* 设置系统时钟时钟源为PLL */
rcc_clk_init.AHBCLKDivider = RCC_SYSCLK_DIV1; /* AHB分频系数为1 */
rcc_clk_init.APB1CLKDivider = RCC_HCLK_DIV4; /* APB1分频系数为4 */
rcc_clk_init.APB2CLKDivider = RCC_HCLK_DIV2; /* APB2分频系数为2 */
ret = HAL_RCC_ClockConfig(&rcc_clk_init, FLASH_LATENCY_5); /* 同时设置FLASH延时周期为5WS也就是6个CPU周期 */
if(ret != HAL_OK)
{
return 1; /* 时钟初始化失败 */
}
/* STM32F405x/407x/415x/417x Z版本的器件支持预取功能 */
if (HAL_GetREVID() == 0x1001)
{
__HAL_FLASH_PREFETCH_BUFFER_ENABLE(); /* 使能flash预取 */
}
return 0;
}
#ifdef USE_FULL_ASSERT
/**
* @brief
* @param file
* line
* @retval
*/
void assert_failed(uint8_t* file, uint32_t line)
{
while (1)
{
}
}
#endif