教程:如何用STM32-CubeMX-实现CAN通讯

发布者:心有归属最新更新时间:2024-04-10 来源: elecfans关键字:CAN通讯  编程软件 手机看文章 扫描二维码
随时随地手机看文章

首先要安装cubemx跟Keil5两个编程软件,然后打开cubemx软件,新建一个工程项目:

输入CPU型号:

在右下角双击CPU具体型号:

稍等片刻会打开如下对话框:

首先要配置系统的调试方式:我们选择SW方式,

然后配置晶振源,这里选择的是外部晶振,8M,

使能看门狗

使能CAN,

使能TIM2时钟源,采用内部时钟,

配置完成后可以看到单片机管脚已经做了配置。


切换到Clock Configuration选项卡,配置时钟周期,这里配置为8M

切换到Configuration选项卡,进入CAN配置选项配置波特率如下为500Kbps。

配置接收中断。

配置定时器如下为1ms定时器。

配置定时器中断

配置完成后点击保存,然后点击如下按钮,生成代码

填写工程名称,路径,编程软件等等

选择生成代码的方式

等待……

之后点击打开项目。代码生成部分完成。

添加一些特殊配置和逻辑代码,添加CAN的配置信息函数。

void Can_Config(void){ hcan.pTxMsg = &TxMessage; hcan.pRxMsg = &RxMessage; /*##-1- Configure CAN1 Transmission Massage #####################################*/ hcan.pTxMsg->StdId = 0x123; hcan.pTxMsg->RTR = CAN_RTR_DATA; hcan.pTxMsg->IDE = CAN_ID_STD; hcan.pTxMsg->DLC = 8; /*##-2- Configure the CAN1 Filter ###########################################*/ sFilterConfig.FilterNumber = 0; sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT; sFilterConfig.FilterIdHigh = 0; sFilterConfig.FilterIdLow = 0; sFilterConfig.FilterMaskIdHigh = 0; sFilterConfig.FilterMaskIdLow = 0; sFilterConfig.FilterFIFOAssignment = CAN_FIFO0; sFilterConfig.FilterActivation = ENABLE; sFilterConfig.BankNumber = 14; HAL_CAN_ConfigFilter(&hcan, &sFilterConfig);}

在Main函数中while(1)之前调用一下即可,添加定时器启动函数:

HAL_TIM_Base_Start_IT(&htim2);

CAN接收中断启动函数:

HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);/* USER CODE BEGIN 2 */ Can_Config(); //Can配置信息HAL_TIM_Base_Start_IT(&htim2); //定时器启动HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);//使能Can接收中断 /* USER CODE END 2 */

打开stm32f1xx_it.c文件,找到如下函数,添加接收中断启动函数:

HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);

注意:接收中断启动函数使能一次只进一次中断,所以中断退出前要再次使能。

void USB_LP_CAN1_RX0_IRQHandler(void){ /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 0 */ /* USER CODE END USB_LP_CAN1_RX0_IRQn 0 */ HAL_CAN_IRQHandler(&hcan); /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 1 */ HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);//ʹÄÜCAN½ÓÊÕ /* USER CODE END USB_LP_CAN1_RX0_IRQn 1 */}

添加CAN接收服务函数:

HAL_CAN_RxCpltCallback

说明:该函数在stm32f1xx_hal_can.c文件中已经有定义,它的定义方式如下:

__weak void HAL_CAN_TxCpltCallback(CAN_HandleTypeDef* hcan)

函数前面的__weak关键字意思是如果有同样的定义,先执行没有__weak关键字的函数,所以当我们定义了HAL_CAN_RxCpltCallback函数后,编译器会先编译我们定义的函数,而忽略系统定义的该函数。当我们没有定义该函数时,系统会编译带有__weak关键字的函数。

void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan){ unsigned short int speed; switch(hcan->pRxMsg->StdId) {//根据ID处理数据 case 0x123:// /*在此添加数据处理逻辑*/ break; default: break; }}

添加CAN发送函数:

/* USER CODE BEGIN WHILE */ while (1) { HAL_IWDG_Refresh(&hiwdg); //喂狗函数 if(Can_Trans_Timer == 0) {//每100ms发送一次数据 Can_Trans_Timer = 100; hcan.pTxMsg->StdId = 0x123; hcan.pTxMsg->Data[0] = 'C'; hcan.pTxMsg->Data[1] = 'A'; hcan.pTxMsg->Data[2] = 'N'; hcan.pTxMsg->Data[3] = ' '; hcan.pTxMsg->Data[4] = 'T'; hcan.pTxMsg->Data[5] = 'E'; hcan.pTxMsg->Data[6] = 'S'; hcan.pTxMsg->Data[7] = 'T'; HAL_CAN_Transmit(&hcan, 200);//发送一帧数据 } } /* USER CODE END WHILE */

在定时器函数中添加定时器代码:

void TIM2_IRQHandler(void){ /* USER CODE BEGIN TIM2_IRQn 0 */ if(Can_Trans_Timer > 0) Can_Trans_Timer--; /* USER CODE END TIM2_IRQn 0 */ HAL_TIM_IRQHandler(&htim2); /* USER CODE BEGIN TIM2_IRQn 1 */ /* USER CODE END TIM2_IRQn 1 */}

说明:在往工程中添加代码时要注意,不要任意往里面添加代码,要在注释着USER CODE BEGIN的地方添加代码,这样在重新生成代码时才不至于将已经写好的代码覆盖掉,如下

/* USER CODE BEGIN Includes */


关键字:CAN通讯  编程软件 引用地址:教程:如何用STM32-CubeMX-实现CAN通讯

上一篇:使用STM32和RFID连接的读卡器系统设计
下一篇:基于STM32的正交编码器驱动电机设计

推荐阅读最新更新时间:2026-03-22 04:35

如何检测can通讯电路的好坏
CAN(Controller Area Network)是一种基于总线通信的局域网技术,广泛应用于汽车电子、工业控制等领域。在实际应用中,CAN通讯电路的好坏对整个系统的稳定性和可靠性具有重要影响。本文将详细介绍如何检测CAN通讯电路的好坏,包括检测方法、检测工具、检测流程以及常见问题处理等方面的内容。 一、检测方法 视觉检查 在进行CAN通讯电路的检测之前,首先要进行视觉检查。检查电路板是否有烧毁、破损、腐蚀等现象,检查连接器是否松动或损坏,检查线缆是否有断裂、磨损等问题。 电阻检测 使用万用表测量CAN通讯电路中的电阻值,包括总线电阻、终端电阻等。正常情况下,CAN总线的电阻值应在60-120Ω之间,终端电阻值应
[嵌入式]
Profinet转Can协议网关和西门子PLC和直流伺服驱动器通讯案例
深圳某自动化有限公司在国内的一个运行项目中,项目要求控制中心系统通过向直流伺服驱动器,发送不同的命令报文控制驱动器的启停和运行速度,进而控制驱动器下端连接的四台伺服电机的转动速度。控制中心系统使用的是西门子 S7-1200 PLC,支持 Profinet 总线协议,直流伺服驱动器支持 CAN 协议 解决方案: 由于直流伺服驱动器正常工作时支持 CAN 协议通讯,控制中心系统西门子 S7-1200 PLC 支持 Profinet总线协议通讯,作为 Profinet 主站,两种协议不同,不能直接连接实现数据交换,需通过第三方协议转换模块才能实现不同协议间的数据交换。 北京倍讯科技自主研发生产的Profinet转Can网关能够实现
[嵌入式]
Profinet转<font color='red'>Can</font>协议网关和西门子PLC和直流伺服驱动器<font color='red'>通讯</font>案例
基于STM32实现简单的CAN通讯过程
CAN通讯在车辆工程中用的非常广泛,本文将基于stm32实现简单的can通讯过程。 首先了解一下CAN通讯的主要特点: 1、 数据通信没有主从之分,任意一个节点可以向任何其他(一个或多个)节点发起数据通信,靠各个节点信息优先级先后顺序来决定通信次序。 2、 支持时间触发通信功能, 发送报文的优先级可软件配置。多个节点同时发起通信时,优先级低的避让优先级高的,不会对通信线路造成拥塞。 3、 CAN 是一种多主总线,通信介质可以是双绞线、同轴电缆或光导纤维。通信距离最远可达10KM(速率低于5Kbps),速率可达到1Mbps(通信距离小于40M)。 4、 CAN 总线采用了多主竞争式总线结构,具有多主站运行和分散仲
[单片机]
基于STM32实现简单的<font color='red'>CAN</font><font color='red'>通讯</font>过程
STM32CubeMX 之 CAN通讯
一、CAN总线简介 CAN是控制器局域网络(Controller Area Network,CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,是国际上应用最广泛的现场总线之一。 CAN控制器通过组成总线的2根线(CAN-H和CAN-L)的电位差来确定总线的电平,信号是以两线之间的“差分”电压形式出现,这点与RS485类似,但两者电平值不同。CAN总线电平分为显性电平和隐性电平。 CAN总线采用两种互补的逻辑数值“显性”和“隐性”。其中,“显性”数值表示逻辑“0”,而“隐性”表示逻辑“1”。 当总线上同时出现“显性”位和“隐性”位时,最终呈现在总线上的是“显性”位。 在“隐性”状态下,VCAN_
[单片机]
【MPC5744P】Bootloader上位机开发(CAN通讯
此处上位机采用C#编写,界面框架为WPF。 为保证烧录过程不出现错误,上下位机采用一问一答模式,上位机发送一帧数据后,下位机接收处理完毕再回馈给上位机,上位机再决定下一步动作。 核心代码逻辑部分,将命令分成EntryBootloader, Reset, Data, DataEnd, CheckBootloader, Erase, ERR几个部分。 烧录时会先检查是否处于Bootloader,,然后执行擦写操作(擦写地址范围由上位机发送),再发送数据(地址+数据为一帧),最后发送结束命令。 注意,由于CAN长度为8字节,而32位地址已经占用4字节,Flash地址从0x800000开始,所以所有地址减去0x800000
[单片机]
【MPC5744P】Bootloader上位机开发(<font color='red'>CAN</font><font color='red'>通讯</font>)
PIC18F**K80的CAN通讯程序
单片机: PIC18F45K80 关于帧ID的设置 CAN的帧ID分为标志帧和扩展帧,配置寄存器如下(这里仅贴上发送ID的寄存器(TXBnSIDH)配置,接收帧ID寄存器(RXBnSIDH)配置相同): CAN通讯代码实现: #include pic18fxx8x.h //芯片型号 //该程序实现发送缓冲器0向接收缓冲器0发送数据的自测试模式,其中接收采用中断方式 //发送采用查询方式 void GPIO_Init(); int CAN_FLAG; //定义标志寄存器 /*---------------------------------------------------------------------
[单片机]
PIC18F**K80的<font color='red'>CAN</font><font color='red'>通讯</font>程序
CAN FD升级会缩短通讯距离?
CAN FD允许最大64字节数据帧,并且数据段部分的传输速率高达5Mbit/s。那么,CAN FD升级之后,通讯距离是否会缩短呢?本文带你一起探讨。 CAN FD继承了CAN总线的主要特性,提高了CAN总线的网络通信带宽,改善了错误帧漏检率,同时可以保持网络系统大部分软硬件特别是物理层不变。CAN FD采用了两种方式来提高通信的效率: ● 可变以及更高的数据传输速率: 从控制场中的BRS位到ACK场之前(含CRC分界符)为可变速率。CAN FD数据段的传输速率最大可达5Mbit/s,但为了保证总线的健壮可靠,仲裁段(ID和ACK)保持不变,采用原CAN总线用的速率(最高1Mbit/s)。注意:两种速率各有一套位时间定义寄存
[网络通信]
<font color='red'>CAN</font> FD升级会缩短<font color='red'>通讯</font>距离?
技术文章:CAN采用了隔离依旧通讯异常怎么办?
各位工程师对于CAN总线隔离方案想必都极为熟悉,但可能会遇到CAN总线采用了隔离方案依旧通讯异常的情况。这一类问题应该怎么解决呢?本文将对各类方案电路原理为大家分析原因并提供相应解决方案。 1、常见主流收发器芯片 随着汽车电子和工业的迅猛发展,CAN总线被广泛的应用各行各业的总线通信上。半导体行业的不断更新,早期的CAN收发器已经不能满足现在的需求,世界上CAN收发器的生产公司,也在不断地进行技术更新,推出性能更好的CAN收发器。 目前主流的CAN收发器是PCA82C250/251,TJA1040/1050T/1051以及ZLG的CTM系列与SC系列隔离CAN模块等。PCA82C250/251是最早期的CAN收发器,采
[汽车电子]
技术文章:<font color='red'>CAN</font>采用了隔离依旧<font color='red'>通讯</font>异常怎么办?
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved