搜档网
当前位置:搜档网 › 基于STM32F407的双CAN总线设计与实现

基于STM32F407的双CAN总线设计与实现

基于STM32F407的双CAN总线设计与实现
基于STM32F407的双CAN总线设计与实现

基于STM32F407的双CAN总线设计与实现

【摘要】本文是基于意法半导体(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,Xi’an 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.

[责任编辑:汤静]

(此文档部分内容来源于网络,如有侵权请告知删除,文档可自行编辑修改内容,

供参考,感谢您的配合和支持)

STM32的can总线实验心得要点

STM32的can总线实验心得 (一) 工业现场总线 CAN 的基本介绍以及 STM32 的 CAN 模块简介 首先通读手册中关于CAN的文档,必须精读。 STM32F10xxx 参考手册Rev7V3.pdf https://www.sodocs.net/doc/5117381035.html,/bbs/redirect.php?tid=255&goto=lastpost#lastpos t 需要精读的部分为 RCC 和 CAN 两个章节。 为什么需要精读 RCC 呢?因为我们将学习 CAN 的波特率的设置,将要使用到RCC 部分的设置,因此推荐大家先复习下这部分中的几个时钟。 关于 STM32 的 can 总线简单介绍 bxCAN 是基本扩展 CAN (Basic Extended CAN) 的缩写,它支持 CAN 协议 2.0A 和 2.0B 。它的设计目标是,以最小的 CPU 负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求(优先级特性可软件配置)。 对于安全紧要的应用,bxCAN 提供所有支持时间触发通信模式所需的硬件功能。 主要特点 · 支持 CAN 协议 2.0A 和 2.0B 主动模式 · 波特率最高可达 1 兆位 / 秒 · 支持时间触发通信功能 发送 · 3 个发送邮箱 · 发送报文的优先级特性可软件配置 · 记录发送 SOF 时刻的时间戳 接收 · 3 级深度的2个接收 FIFO · 14 个位宽可变的过滤器组-由整个 CAN 共享 · 标识符列表 · FIFO 溢出处理方式可配置 · 记录接收 SOF 时刻的时间戳 可支持时间触发通信模式 · 禁止自动重传模式 · 16 位自由运行定时器 · 定时器分辨率可配置 · 可在最后 2 个数据字节发送时间戳 管理 · 中断可屏蔽

STM32的CAN总线中继器设计及应用_潘铜

*基金项目:西安工程大学研究生创新基金资助(chx100813)。 STM32的CAN 总线中继器设计及应用 * 潘铜,叶小荣,张娜,范建峰 (西安工程大学电子信息学院,西安710048) 摘要:CA N 中继器是系统组网的关键,通过中继器可以扩展节点的数量和实现不同波特率之间的通信。本文充分利用ST M 32F105内部集成双bxCAN 控制器的特性,设计出一款基于ST M 32的单芯片CAN 总线中继器,并将其应用到齐玛印花机上。实践证明该方法有效可行,不仅实现了齐玛印花机的改造,还降低了系统设备的成本。关键词:CA N 总线;中继器;ST M 32F105;齐玛印花机中图分类号:T P336 文献标识码:A Design an d Application of CAN Bus Repeater Based on STM32 Pan Tong ,Ye Xiaorong ,Zhang Na ,Fan Jianfeng (Elect ronic Information College ,Xi 'an Polytechnic University ,Xi an 710048,China ) Abstract :CAN repeater is the key to netw orking .The repeater can expand the num ber of nodes and realize communication betw een dif -ferent baud rates .M aking full use of internal integrated dual CAN controllers of S TM 32f105,the paper designs a single -chip CAN bus repeater based on STM32.The repeater can be applied to the Zimmer printing machine .The result proves that the method is effective and feasible ,not only realizing the transformation of Zimmer printing machine but also reducing the cost of system equipment .Key words :CAN bus ;repeater ;STM32F105;Zimmer printing machine 引 言 CAN 总线是一种多主方式的串行通信总线,具有优良的稳定性、实时性、远程通信能力以及超强的硬件CRC 纠错等特性;CAN 总线技术的应用不再仅限于汽车行业,而是扩展到了机械、纺织、控制等行业,并被公认为是最有前途的现场总线之一。然而由于受制于CAN 收发器,CAN 总线通信距离和网络中节点数被分别限制在10km 和110个之内。但是在稍大型的CAN 总线系统中,这往往是不够的,这时就需要用CAN 总线中继器对CAN 总线网络进行扩展。 CAN 中继器是系统组网的关键技术设备之一,使用中继器可以提高网络设计的灵活性,并且通过中继器还可以连接两个不同波特率的CAN 总线网络;在两个网络间进行数据转发,极大地扩展其使用范围。基于此,本文设计出一款基于ST M 32的CA N 总线中继器,并将其应用到齐玛印花机上,完成圆网印花机通信系统的工程改造。 1 系统整体方案及硬件实现 以往的CAN 中继器设计大多采用M CU 加CAN 控制器的双芯片或多芯片解决方案。例如,参考文献[1]使用1片M CU 加2路CAN 控制器的结构实现中继器;参考文献[2]使用双M CU 结构设计CA N 总线中继器;参考文献[3]使用独立双CAN 控制器作为2路CAN 接口的控制器来设计CA N 中继器。上述方案电路复杂,MCU 与CA N 控制器通过外部总线连接,数据吞吐速度慢,整体可靠性也比较差。 意法半导体的STM 32是以A RM Cortex -M 3为内核的32位微处理器,主频可高达72M H z ,内置Flash 和SRAM ,其容量可分别高达512KB 和64K B ;内部集成双bxCA N 控制器。它支持CAN 协议V2.0A 和V2.0B ,波特率最高可达1M b /s ,具有3个发送邮箱和2个3级深度的FIFO ,能够以最小的CPU 负荷来高效处理大量收到的报文。基于此,选用STM 32F105作为主控制器,设计出一款基于STM 32的CAN 总线中继器。其整体方案如图1所示。 由于STM 32F105内部集成了双路CA N 控制器,CA N 中继器的节点电路变得十分简单,其硬件电路如图

基于STM32的CAN通讯,已在实际项目中应用

与本程序代码相关部分的原理图及PCB,基于STM32F103VET6,已在项目中应用。

开头篇:STM32的CAN波特率计算 STM32里的CAN 支持2.0A,2.0B, 带有FIFO,中断等, 这里主要提一下内部的时钟应用。 bxCAN挂接在APB1总线上,采用总线时钟,所以我们需要知道APB1的总线时钟是多少。我们先看看下图,看看APB1总线时钟: APB1时钟取自AHB的分频, 而AHB又取自系统时钟的分频, 系统时钟可选HSI,HSE, PLLCLK, 这个在例程的RC设置里都有的,然后再看看有了APB1的时钟后,如何算CAN的总线速率, 先看下图:

有了上边的这个图,基本就清楚了: 总线时钟MHz (3+TS1+TS2)*(BRP+1) ====================================================================== 下面是我的计算: CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq; 注意//#define CAN_BS1_3tq ((uint8_t)0x02) /*!< 3 time quantum */ CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq; CAN_InitStructure.CAN_Prescaler = 4;//2 nominal bit time(3+5+1)tq=9tq 关于分频系数,查看 system_stm32f10x.c下面的static void SetSysClockTo72(void) 函数:/* HCLK = SYSCLK */ /* PCLK2 = HCLK */ /* PCLK1 = HCLK/2 */ 所以can时钟 72MHZ/2/4=9 Mhz,tq=1/36Mhz 波特率为 1/nominal bit time= 9/9=1MHZ ===================================================================== void CAN_Configuration(void) { CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; /* CAN register init */ CAN_DeInit(); CAN_StructInit(&CAN_InitStructure); /* CAN cell init */ CAN_InitStructure.CAN_TTCM=DISABLE; CAN_InitStructure.CAN_ABOM=DISABLE;

相关主题