系统在启动时调用BSP_Init();该函数会初始化系统的各部分时钟。
void BSP_Init (void)
{
BSP_RCC_Configuration();//初始化系统时钟
BSP_LED_Init(); /* Initialize the I/Os for the LED controls. */
}
所以分析BSP_RCC_Configuration()函数如下:
static void BSP_RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();//复位RCC模块的寄存器,复位成缺省值
RCC_HSEConfig(RCC_HSE_ON);//开启 External High Speed oscillator (HSE)时钟,用HSE的时钟作为PLL的时钟源
HSEStartUpStatus=RCC_WaitForHSEStartUp();//获取HSE启动状态
if(HSEStartUpStatus==SUCCESS)//如果HSE启动成功
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//配置PLL倍频源为HSE,不分频,倍频倍数为9,所以系统时钟8M*9=72M
RCC_PLLCmd(ENABLE); //启动PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系统时钟
//while(RCC_GetSYSCLKSource()!=0x80);
while(RCC_GetSYSCLKSource() != 0x08);//检查是否将HSE 9倍频后作为系统时钟
RCC_ClockSecuritySystemCmd(ENABLE);
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
}
这样完成了系统72M时钟的配置,然后根据时钟树如下
可知系统时钟,SYSCLK可由三个设备提供,分别为高速内部时钟HSI,PLLCLK,HSE(外部晶振),PCLK1该函数RCC_PCLK1Config(RCC_HCLK_Div2);可知将其配置为了系统时钟2分频,即36MHz。那么挂接在PCLK1上的设备的时钟就是36MHz。
由寄存器应该可知系统那些外设挂接在APB1上,例如我们要对CAN进行初始化,则已经知道APB1的外设36MHz,则如果设置如下
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
//BTR-SJW 重新同步跳跃宽度 1个时间单元
CAN_InitStructure.CAN_BS1=CAN_BS1_2tq; //BTR-TS1 时间段1 占用了2个时间单元
CAN_InitStructure.CAN_BS2=CAN_BS2_3tq; //BTR-TS1 时间段2 占用了3个时间单元
CAN_InitStructure.CAN_Prescaler =6;
则有
定义了时间单元的时间长度 36/(1+2+3)/6=1Mbps,即为CAN的通信波特率。