
前言 STM32 NUCLEO 开发平台是 ST 最新发布的易用性好、可扩展性佳的低成本平台。开发平台具有 mbed 功能支持 Arduino 接口,同时还提供 ST Morpho 扩展排针,可连接微控制器的所有周边外设,可以利用 Arduino 巨大生态系统优势,便于快速实现STM32 学习和评估! 这儿我们评估它的 CAN 外设功能。 一、环境搭建 1、软件: STM32Cube\Repository\STM32Cube_FW_F1_V1.3.0\Projects\STM3210E_EVAL\Examples\CAN\CAN_Networking\EWARM 2、硬件: NUCLEO-F103RB(STM32F103RBT6) 3、原理图如下: ![]() 上面原理图是针对 SN65HVD230 的, 因为 PB8 是 CAN_TX,是 MCU 端的发送,需要到 CAN transfer 的输入引脚,即引脚 D(Driverinput); 因为 PB9 是 CAN_RX,是 MCU 端的接收,是 CAN transfer 的输出引脚,即引脚 R(Recv output); ![]() 二、Porting 由于参考的是 STM3210E_EVAL 的示例程序,在用到 STM32F103RBT6 的 Nucleo 板子上的时候,需要做一些 porting 的工 作。 1、系统时钟 在 10E 的 EVAL 板子上,使用的是 HSE,而 Nucelo 上默认的是没有焊接 HSE,所以使用到的是 HIS;利用 CubeMX 生成代码:系统时钟为 36MHz; ![]() 供给 CAN 外设的时钟:是 APB1 的时钟 18MHz;
2、CAN 的接收/发送引脚 仍然可以都为 PB8 (TX) 和 PB9 (RX) ,不需要改变; 3、CAN 的波特率 (自己想设置的是 500K): ![]() ![]()
所以,理论上,根据计算公式, NominalBitTime = 1 × tq + tBS1 + tBS2 = (TS1[3:0] + 1 + TS2[2:0] + 1 + 1)* (BRP[9:0] + 1) x tPCLK; 所以,NominalBitTime = 9* 4* tPCLK; = Freq(APB1)/36 = 18/36 = 0.5MHz = 500K; 4、User 部分 程序中设计到:
在 10E-EVAL 板子上,用到的是 PG.08,而在 nucleo 上使用到的是 PC.13
![]() 至此,移植好了; 三、全速运行 1、按下 USER Button,会发出 CAN 报文,CAN 的 PC 端软件能够收到。 ![]() 2、CAN 的 PC 端软件发送报文,软件中的中断函数也会进入中断。 ![]() 说明,CAN 的发送和接收这一基本的操作已经完成了。对于 CAN 的复杂的运用特点,可以在该基础上进一步衍生。 附录: 1、针对现有的 CAN 的总线协议:在数据区域只有固定的 8Byte;也就是说一个 CAN 报文发送的数据只有 8 个,我们的单片机的寄存器也只提供了 8 个寄存器,符合当前的 CAN 的协议;如果客户想发送多个>8 的数据,需要在其上层协议中,用软件去多次发送。也许在下一代的 CAN 总线中,会对这一特点进行改变。 ![]() 2、CanHandle.Init.NART = ENABLE 的说明; 在基于"STM32Cube_FW_F4_V1.10.0 \Projects\STM324x9I_EVAL\Examples\CAN\CAN_Networking" , 如果只用一块 STM32F429-EVAL 调用HAL_CAN_Transmit()的发送函数,会发现 CAN Controller 会不断的发送数据, 这是因为在我们提供的示例中,是需要两块板子互联的,在 CAN 协议中,如果消息没有被正确的接收,它将会 be retransmitted infinitely by the transmitter until it will be acknowledged by the receiver ,而正我们的环境中,只有一块板子,而没有 receiver。 |
【经验分享】stm32g030内部温度计算
【学习必备】每天学习STM32小技巧-1
【管管推荐】STM32经验分享篇(新栏目即将上线)
【学习必备】每天学习STM32小技巧-2
【经验分享】如何用STM32G031开发板设计DDS信号发生器-2022年寒假在家练STM32平台项目分享(二)
【经验分享】STM32G0 复位后死机
STM32固件库分享,超全系列整理
【经验分享】STM32F746ZG USB 驱动不正常
【经验分享】STM32 Bootloader 中 DFU 使用限制
【经验分享】LwIP 内存配置