一直想精简这家伙了, 啰嗦一大堆!
把预处理中没用的, 都去掉了, 新代码可直接替换原文件!!
/*******************************************************************************
* @file system_stm32f4xx.c
* @version V1.3.2
* @date 13-November-2015
* @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File.
*
* * 此处删掉 啰嗦一堆 *
*****************************************************************************/
#include "stm32f4xx.h"
#if !defined (HSE_VALUE)
#define HSE_VALUE ((uint32_t)8000000) // 设置外部晶振值 <-- 重要 !!!
#endif
#if !defined (HSI_VALUE)
#define HSI_VALUE ((uint32_t)16000000) // 设置内部晶振值
#endif
// 原句定位
/************************* Miscellaneous Configuration ************************/
/* 此处删掉一堆无用SDRAM声明, 用于初始化外挂内存用的, 一般另开文件设置, 删!! */
/* 向量表基偏移字段, 此值必须是0x200的倍数. 非高人不会用, 也不一定用, 用0值吧*/
#define VECT_TAB_OFFSET 0x00
uint32_t SystemCoreClock = 25000000; // 这句自己加的, 和FreeRTOS有关
__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
void SystemInit(void)
{
// FPU 功能设置 /
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); // 设置 CP10 and CP11 完全访问
#endif
// 复位RCC时钟配置 到 复位状态
RCC->CR |= (uint32_t)0x00000001; // 设置 HSION 置位
RCC->CFGR = 0x00000000; // 复位 CFGR 寄存器
RCC->CR &= (uint32_t)0xFEF6FFFF; // 复位 HSEON, CSSON 和PLLON 位
RCC->PLLCFGR = 0x24003010; // 复位 PLLCFGR 寄存器
RCC->CR &= (uint32_t)0xFFFBFFFF; // 复位 HSEBYP 位
RCC->CIR = 0x00000000; // 失能 中断
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; // 配置矢量表位置添加偏移地址, 内部闪存中的向量表重定位
}
/* 30行注释,浓缩: 使用 HSE 必须修改 HSE_VALUE 的值, 等于外部晶振值 */
void SystemCoreClockUpdate(void)
{
uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
tmp = RCC->CFGR & RCC_CFGR_SWS; // 获取系统时钟来源
switch (tmp)
{
case 0x00: // HSI 作系统时钟源
SystemCoreClock = HSI_VALUE;
break;
case 0x04: // HSE 作系统时钟源
SystemCoreClock = HSE_VALUE;
break;
case 0x08: // PLL 作系统时钟源
// SYSCLK = PLL_VCO/PLL_P = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N / PLL_P
pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
if (pllsource != 0)
// HSE 作 PLL 时钟源
pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
else
// HSI 作 PLL 时钟源
pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
SystemCoreClock = pllvco/pllp;
break;
default:
SystemCoreClock = HSI_VALUE;
break;
}
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; // 计算HCLK频率, 获取HCLK预分频器
SystemCoreClock >>= tmp; // HCLK频率
}
// 原句定位
/* #if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) */
/* 几百行灰色代码, 用于初始化外挂内存, 一般另行初始化, 删! */