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
80% when 波特率 > 500K
87.5% when 波特率 <= 500K
所以对于 100K 的波特率(假定使用 8MHz 时钟)
可以修改该BS1 BS2 为:
可以修改该BS1 BS2 为:
CAN_InitStructure.CAN_Prescaler=5;
CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;
CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;
(1+13) / (1+13+2) = 87.5%