1.首先要确定can时钟,即
/* CAN1 Periph clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
该时钟为pclk1 ,我们去system_stm32f10x.c或system_stm32f4xx.c文件里确认pclk1是主时钟的多少分频
/* PCLK1 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;//主时钟2分频,若主时钟为72M则pclk1=36M,
或者
/* PCLK1 = HCLK / 4*/ RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;//主时钟4分频,若主时钟为180M则pclk1=45M,
2.由can的配置计算当前的波特率:
如: ca时钟为36M,
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_12tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;CAN_InitStructure.CAN_Prescaler = 2;
则can的波特率为:36M/((1+12+5)*2)=1M
3.采样点问题(该问题有人设计了专门的软件计算,以下内容取自其他博客,暂未验证)
另外尽可能的把采样点设置为 CiA 推荐的值: 75% when 波特率 > 800K 80% when 波特率 > 500K 87.5% when 波特率 <= 500K 所以对于 100K 的波特率(假定使用 8MHz 时钟) 可以修改该BS1 BS2 为: CAN_InitStructure.CAN_Prescaler=5; CAN_InitStructure.CAN_BS1=CAN_BS1_13tq; CAN_InitStructure.CAN_BS2=CAN_BS2_2tq; (1+13) / (1+13+2) = 87.5%