STMCU小助手
发布时间:2022-2-12 18:48
|
前言 STM32 NUCLEO 开发平台是 ST 最新发布的易用性好、可扩展性佳的低成本平台。开发平台具有 mbed 功能支持 Arduino 接口,同时还提供 ST Morpho 扩展排针,可连接微控制器的所有周边外设,可以利用 Arduino 巨大生态系统优势,便于快速实现STM32 学习和评估! 这儿我们评估它的 CAN 外设功能。 一、环境搭建% t. n2 y; I' ?7 B" ~ 1、软件: STM32Cube\Repository\STM32Cube_FW_F1_V1.3.0\Projects\STM3210E_EVAL\Examples\CAN\CAN_Networking\EWARM 2、硬件: NUCLEO-F103RB(STM32F103RBT6); Z3 P, G+ `7 j Z' }- y 3、原理图如下: # V' F8 g' {2 \7 a# n0 q4 C
1 [( v! o8 p# N5 j 上面原理图是针对 SN65HVD230 的,- M2 x/ K8 U* ?/ ~ 因为 PB8 是 CAN_TX,是 MCU 端的发送,需要到 CAN transfer 的输入引脚,即引脚 D(Driverinput);" p+ G6 |0 X! ]4 a/ \/ L 因为 PB9 是 CAN_RX,是 MCU 端的接收,是 CAN transfer 的输出引脚,即引脚 R(Recv output);
3 e: x" _9 b |. B1 o 二、Porting9 l1 [: o9 S9 d8 V 由于参考的是 STM3210E_EVAL 的示例程序,在用到 STM32F103RBT6 的 Nucleo 板子上的时候,需要做一些 porting 的工 作。" }- f+ s5 n6 \- R) s z8 L 1、系统时钟 在 10E 的 EVAL 板子上,使用的是 HSE,而 Nucelo 上默认的是没有焊接 HSE,所以使用到的是 HIS;利用 CubeMX 生成代码:系统时钟为 36MHz;; \7 A0 e' _$ f1 I% R3 a 5 _/ }. K, ^* d" z
3 w+ N4 i# A# H. A$ R+ R3 y 供给 CAN 外设的时钟:是 APB1 的时钟 18MHz;" O: C: E: W5 ^
2、CAN 的接收/发送引脚 仍然可以都为 PB8 (TX) 和 PB9 (RX) ,不需要改变;& {9 G& }: F+ g5 c4 T! @$ M: ? 3、CAN 的波特率 (自己想设置的是 500K):) ]8 @* _- N m N# l5 l " ]+ g3 b) I* u d2 ~5 w
( }: N6 [! F) u/ v
所以,理论上,根据计算公式,/ ~. b$ A$ b {. \2 x" X NominalBitTime = 1 × tq + tBS1 + tBS2 = (TS1[3:0] + 1 + TS2[2:0] + 1 + 1)* (BRP[9:0] + 1) x tPCLK;* C# ?5 V5 |# \/ Q 所以,NominalBitTime = 9* 4* tPCLK; = Freq(APB1)/36 = 18/36 = 0.5MHz = 500K;' X$ m6 C {* i* z: n' m5 E 4、User 部分! R* C4 J; A$ } 程序中设计到:, w) @0 ~# d8 d5 {
在 10E-EVAL 板子上,用到的是 PG.08,而在 nucleo 上使用到的是 PC.13
' k! g" ^/ C" G5 [ 至此,移植好了; ( D @" g P' K$ Q' U8 g 三、全速运行) w# k* S* z% g. ]7 w+ J5 g+ Y 1、按下 USER Button,会发出 CAN 报文,CAN 的 PC 端软件能够收到。
2、CAN 的 PC 端软件发送报文,软件中的中断函数也会进入中断。5 y5 Y+ ~# A+ d
& N1 N+ x8 {1 t: i+ {! s# c 说明,CAN 的发送和接收这一基本的操作已经完成了。对于 CAN 的复杂的运用特点,可以在该基础上进一步衍生。- r6 [8 d" i+ y) k3 T! _ 附录: I8 Z5 _6 P. u 1、针对现有的 CAN 的总线协议:在数据区域只有固定的 8Byte;也就是说一个 CAN 报文发送的数据只有 8 个,我们的单片机的寄存器也只提供了 8 个寄存器,符合当前的 CAN 的协议;如果客户想发送多个>8 的数据,需要在其上层协议中,用软件去多次发送。也许在下一代的 CAN 总线中,会对这一特点进行改变。
$ } y" C/ F2 ^+ A" B) h 2、CanHandle.Init.NART = ENABLE 的说明; ~1 I1 y6 D8 s3 u D9 A 在基于"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。1 _4 x8 J9 q& e$ c' |" H% D |
实战经验 | 基于STM32G0B1的全桥移相+同步整流PWM解决方案
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:逢7发帖赢大礼】8、基于STM32G070板子的Ymodem串口协议IAP Bootloader开发
【福利三:逢7发帖赢大礼】7、基于STM32G070板子TF卡的FATFS移植
【福利三:逢7发帖赢大礼】6、基于STM32G070板子spiflash的FATFS移植
【福利三:逢7发帖赢大礼】5、基于STM32G070板子IRDA红外遥控接收解码
【福利三:逢7发帖赢大礼】4、基于STM32G070板子SPI flash 移植SFUD库
【福利三:逢7发帖赢大礼】基于STM32G070板子的uart shell移植设计
【福利三:逢7发帖赢大礼】3、基于STM32G070板子的YModem串口协议通信
【福利三:逢7发帖赢大礼】2、基于STM32G070板子的OLED移植U8G2库
微信公众号
手机版