1、一般设置 CAN_SJW = 1,总结程序发现!can 时钟是 RCC_APB1PeriphClock(APB1 从 APB2 而来,分频系数不同,导致 APB1 不同,mini 版中一般是 APB2 为 72Mhz,APB1是 36MHz),你要注意 CAN 时钟频率 CAN 波特率 = RCC_APB1PeriphClock/(1+CAN_BS1+CAN_BS2)/CAN_Prescaler; 另外尽可能的把采样点设置为 CiA 推荐的值:75% when 波特率 800K80% when 波特率 500K87.5% when 波特率 BTR = (u32)(u32)CAN_InitStr
2、uct-CAN_Mode CAN_SJW CAN_BS1 CAN_BS2 CAN_Prescaler - 1); 总结一下 Fpclk=36M 时 can 波特率为 250k 的配置为 /* CAN cell init */ CAN_InitStructure.CAN_TTCM=DISABLE; CAN_InitStructure.CAN_ABOM=DISABLE; CAN_InitStructure.CAN_AWUM=DISABLE; CAN_InitStructure.CAN_NART=DISABLE; CAN_InitStructure.CAN_RFLM=DISABLE; CAN_Ini
3、tStructure.CAN_TXFP=DISABLE; CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=9; CAN_Init( 250k =的:将 can 总线波特率设置为 250k 在官方的 can 例程上 给出了 100k 查询 和 500k 中断方
4、式的例子 分别设置如下: CAN_Polling: /* CAN cell init */ CAN_InitStructure.CAN_TTCM=DISABLE; CAN_InitStructure.CAN_ABOM=DISABLE; CAN_InitStructure.CAN_AWUM=DISABLE; CAN_InitStructure.CAN_NART=DISABLE; CAN_InitStructure.CAN_RFLM=DISABLE; CAN_InitStructure.CAN_TXFP=DISABLE; CAN_InitStructure.CAN_Mode=CAN_Mode_Lo
5、opBack; CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=5; CAN_Init( 100k /* CAN cell init */ CAN_Interrupt CAN_InitStructure.CAN_TTCM=DISABLE; CAN_InitStructure.CAN_ABOM=DISABLE; CAN_InitStructure.C
6、AN_AWUM=DISABLE; CAN_InitStructure.CAN_NART=DISABLE; CAN_InitStructure.CAN_RFLM=DISABLE; CAN_InitStructure.CAN_TXFP=DISABLE; CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStru
7、cture.CAN_Prescaler=1; CAN_Init( /500k 一般设置 CAN_SJW = 1,总结程序发现!can 时钟是 RCC_APB1PeriphClock(APB1 从 APB2 而来,分频系数不同,导致 APB1 不同,mini 版中一般是 APB2 为 72Mhz,APB1是 36MHz),你要注意 CAN 时钟频率 CAN 波特率 = RCC_APB1PeriphClock/(1+CAN_BS1+CAN_BS2)/CAN_Prescaler; 如果 CAN 时钟为 8M, CAN_SJW = 1,CAN_BS1 = 8,CAN_BS2 = 7, CAN_Pres
8、caler = 2 那么波特率就是=8M/(1+8+7)/2=250K =得到 500Kb/s 的波特率CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;CAN_InitStructure.CAN_Prescaler=1;每一位的 Tq 数目 = 1 (固定 SYNC_SEG) + 8 (BS1) + 7 (BS2) = 16如果 CAN 时钟是 8 MHz : (8M / 1 ) / 16 = 500K其中:1 为分
9、频系数16 为每一位的 Tq 数目为了设置为 100K, 把分频系数改为 5 即可, BS1 BS2 不变每一位的 Tq 数目 = 1 (固定) + 8 (BS1) + 7 (BS2) = 16如果 CAN 时钟是 8 MHz : (8M / 5 ) / 16 = 100K如果想得到 1M 的波特率, CAN 时钟仍然是 8 MHz 的情况下, 分频系数不变应该改变 BS1 BS2CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;每一位的 Tq 数目 = 1 (固定) + 5 (BS1) +
10、2 (BS2) = 8如果 CAN 时钟是 8 MHz : (8M / 1 ) / 8 = 1000K另外尽可能的把采样点设置为 CiA 推荐的值:75% when 波特率 800K80% when 波特率 500K87.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+
11、2) = 87.5%所以对于 500K 的波特率(假定使用 8MHz 时钟) 可以修改该 BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=1;CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+13) / (1+13+2) = 87.5%所以对于 1000K 的波特率(假定使用 8MHz 时钟) 可以修改该 BS1 BS2 为:CAN_InitStructure.CAN_Prescaler=1;CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;(1+5) / (1+5+2) = 75%个人见解, 仅供参考。 上边这个公式算出来的就是 CAN 的速率了