刘鹏
【摘 要】本文是基于意法半导体(ST)新推出的一款高性能CortexTM-M4内核的ARM 芯片STM32F407ZGT6,进行的双CAN总线设计。在开发过程中采用了ST提供的可视化图形界面开发工具STM32Cube进行底层驱动的配置,简化了设计工作。但由于该工具链接的固件库函数存在传递参数错误,使得CAN总线无法接收数据,本文对该库函数进行了更正。
【关键词】STM32F407;CAN;STM32Cube
Design and Realization of Double CAN Buses on STM32F407
LIU Peng
(Chinese Electron Scientific and Technological Company 20th Institute, Xian Shaanxi 710068, China)
【Abstract】Based on a high-performance ARM with CortexTM-M4 core which launched by STMicroelectronics (ST)--STM32F407ZGT6, the double CAN bus is designed in this paper. A visual graphical interface-STM32cube which is provided by ST, is used to configure the underlying driver in this development process. It simplifies the design work. However, one of its library functions makes the CAN bus does not work, because of its error in transferring parameter. This paper makes some changes to this function.
【Key words】STM32F407; CAN; STM32Cube
0 前言
CAN 是一种多主机局域网,它是由博世公司为现代汽车应用率先推出的,凭借着良好的可靠性以及卓越的灵活性,已被广泛应用于工业自动化领域、建筑、环境控制等众多领域[1]。近年来,在航空机载设备上使用CAN总线传输各模块的BIT、日志等信息,可以更有效地管理模块状态;使用成熟的CAN总线协议,保证了信息传输的安全可靠。
为了提高系统处理信息的性能,本文使用了基于高性能ARM Cortex-M4系列的32位RISC内核设计的STM32F407ZGT6芯片,最高工作频率可达168MHz。
1 CAN总线原理
CAN总线结构属于多主竞争方式,具有多主站运行和分散仲裁的串行总线以及广播通信的特点,不同节点之间可自由通信,CAN总线以报文为单位进行数据传送,报文的优先级由标识符决定,最低二进制数的标识符有最高的优先级。
2 CAN总线通信设计
2.1 硬件设计
本文采用了意法半导体高性能处理器STM32F407ZGT6,提高了处理速度,其内置的CAN控制器简化了硬件电路的设计,外置的CAN电平转换芯片采用的是SN65HVD230。系统中有若干个CAN模块进行通信,为了统一匹配CAN总线的阻抗,要求每个模块上无需添加匹配电阻,由系统统一在最远的两端节点处添加120欧匹配电阻。
2.2 基于可视化图形界面的底层驱动配置
STM32CubeMX是ST的主动原创,可以减少开发工作的时间和费用。STM32Cube覆盖了STM32系列所有芯片,STM32Cube中的STM32CubeMX是一款图形化软件设置工具,允许使用图形化向导来生成C语言代码。
首先,根据模块的功能对STM32的IO口进行初始化,需实现的外设有两路CAN、一路UART、一路I2C,还有若干GPIO(实现对模块状态的监控)。接下来,需对系统时钟进行配置,STM32cube极大的简化了开发人员的工作,使用更形象的图形界面表示时钟的配置关系,如图1。本文中由于外部空间的限制,无法使用外部晶振,故本文中采用的是内部时钟HSI(16MHz),通过相应配置使得处理器主时钟达到最大值168MHz,相应的外设时钟也达到最大的42MHz。最后,对CAN控制器进行配置,将CAN的波特率设置为1Mb/s,CAN控制器工作在正常模式,采用双路CAN总线互为备份,在该ARM芯片中内置的两个CAN控制器是主从关系,对于用户使用而言,只有过滤器的设计需注意,其他方面无任何差别。
2.3 软件设计
在STM32cube完成初始化之后,需开发人员编写相应的应用程序,实现系统对该模块CAN协议的要求,软件流程图如图2所示,CAN的接收和发送均采用中断方式。
使用STM32cube的好处显而易见,但也存在弊端。例如由于可视化界面使得开发人员几乎无需了解底层寄存器的调用情况,而一旦出现问题需要查看寄存器定位故障时将很难查找到原因。
在本设计中遇到CAN无法接收数据的故障,为查找故障原因,作者在熟悉各寄存器功能后,通过单步调试发现CAN的接收数据函数CAN_Receive_IT()无法读取硬件FIFO中的数据,最后通过添加一个结构体变量User_recieve_IT,先将FIFO的值赋给该结构体变量,再将该结构体直接赋给hcan->pRxMsg,使得CAN接收数据成功。
3 结果与分析
使用CANALYST-Ⅱ分析仪对模块进行了测试,连续多次发送CAN命令100条、间隔时间1ms,全部得到正确回复。同时,PC机串口接收的模块返回数据与CAN测试结果同步。人为使得CAN_H对地短路导致总线关闭,再取消短路后,总线自动恢复,证明CAN总线的可靠性很高。
本文中使用图形化软件设置工具STM32cube对ARM芯片进行底层驱动的配置,大大提高了开发人员的工作效率,降低错误出现的概率。同时,作者也解决了CAN接收函数中传递参数出现的错误。
图3 CAN调试结果和UART输出数据
【参考文献】
[1]佟国香.基于CAN总线的STM32应用编程及实现[J].上海:信息技术,2015,10:49.
[责任编辑:汤静]