stm32 can波特率计算

来源:互联网 发布:javascript var obj 编辑:程序博客网 时间:2024/05/18 03:07

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%


0 0
原创粉丝点击