uCOS iii/uCOS Ⅲ系统时钟解释及CAN通信速度的配置

系统在启动时调用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的通信波特率。


原文地址:https://www.cnblogs.com/siahekai/p/11000824.html