网易首页 > 网易号 > 正文 申请入驻

STM32之CAN接收

0
分享至

想学习单片机的同学可以关注、私信我或者在评论区回复我要入门。要想使用CAN报文接收模块首先要完成相关的配置。

1 STM32CubeMX配置

使能CAN通讯:PA11配置为CAN_RX;PA12配置为CAN_TX

CAN通讯中断选择:USB low priority or CAN RX0 interrupts

APB1外设时钟设置为36MHz,通过配置CAN Bit Timings Parameters,将波特率设置为1Mbps:

·Prescaler : 4

·Time Quanta in Bit Segment 1 : 5

·Time Quanta in Bit Segment 2 : 3

·ReSynchronization Jump Width : 1

36000000(APB1的时钟)/(4(分频系数)/(5(TQ1)+3(TQ2)+1(同步段时间1tq))=1000k

·Time Triggered Communication选择disable:选择非时间触发通讯模式

·Automatic Bus-Off Management选择disable(可以enable):表示Bus Off后无法自恢复

·Automatic Wake-Up Mode选择disable(可以enable):表示不开启自动唤醒

·No-Automatic Retransmission选择enable:表示允许报文自动重传

·Receive Fifo Locked Mode接收FIFO锁定模式,选择disable,表示报文不锁定,新的覆盖旧的

·Transmit Fifo Priority发送FIFO优先级选择disable,表示优先级由报文标识符决定

Operating Mode选择正常模式

·Normal CAN硬件工作在正常模式

·silent CAN硬件工作在静默模式

·LoopBack环回模式(如果调试配置参数,可以选择环回模式)

·Silent_LoopBack静默环回模式

2建模

CAN报文的接收模型主要包括以下四个模块:

模块

简介

CAN_Filter

CAN报文过滤

CAN_Receive

CAN报文接收

CAN_IT

CAN报文中断

CAN_Read_Data

CAN报文读取

CAN报文接收模型

CAN Data Read SubSystem

can接收时,即使不需要过滤,也需要添加一个过滤器(选择mask模式,32位,MASK ID HIGH LOW,ID HIGH LOW都填0,过滤器选择FIFO0,其他默认就好)。can过滤器,有两种模式,一种mask模式(掩码模式),一种list模式(列表模式),有两种位选择,一种32位,一种16位:

检查 STDID[10:0]、 EXTID[17:0]、 IDE和 RTR位,一共 31位

检查 STDID[10:0]、 RTR、 IDE和 EXTID[17:15],一共 16位

列表模式:32位宽的列表模式,可以精确筛选两个ID(扩展帧和标准帧都可以),对于16位宽的列表模式,可以精确筛选4个标准帧ID,如果将IDE位置1,则可以筛选ID的高11位数据,无法精确筛选扩展帧ID。

掩码模式:类似屏蔽码和验证码,屏蔽码用来指定需要确定的位,验证码用来指定确定的位的值,两者一起用来过滤部分ID。

32位的掩码模式:Filter Id High与Filter Id Low合在一起表示CAN_FxR1寄存器,用来存放验证码,而Filter Mask Id High与Filter Mask Id Low合在一起表示CAN_FxR2寄存器,用来存放屏蔽码

16位的掩码模式:CAN_FxR1的低16位是作为验证码,对应的16位屏蔽码为CAN_FxR1的高16位,同样的,CAN_FxR2的低16位是作为验证码,对应与CAN_FxR2的高16位为屏蔽码

32位的列表模式:

·标准帧:将ID左移5位,然后转化为十进制,填入Filter Mask ID High;Filter Mask ID Low需要把IDE置为标准帧(值为0),数据帧RTR(值为0),所以计算值为0。

·扩展帧:将ID左移3位,再把ID右移16位,和0xffff做与运算,再转换为十进制,得到Filter ID High的值;Filter ID Low需要把先ID左移3位,和0xffff做与运算,再将IDE为置为扩展帧,数据帧RTR(值为0),再转换为十进制值。

对于STM32F103只有一个can,filter slave start bank没有作用,若是两路can,尽量设置为14。filter bank默认即可。

将接收到的报文存入CAN_FIFO0:

在STMCubeMX配置好后,默认选择RX中断:

CAN数据读取模块输出的数据类型可以进行选择:

·输出CAN_MESSAGE类型,CAN_MESSAGE类型数据可以使用CAN Unpack模块进行解析

·输出CAN报文各段信号

CAN结构

简介

Std/Ext(0/1)

标准帧/扩展帧

IDE

CAN ID

D/R(0/1)

数据帧/远程帧

NbD

数据段长度

Data

数据段

3 BugFix

3.1 CAN中断Bug

无法进入CAN接收中断,通过排查发现代码中并未开启中断,原代码如下:

/* Activate CAN Error notifications. */

constuint32_tactiveITs=CAN_IT_ERROR_WARNING|CAN_IT_ERROR_PASSIVE|

CAN_IT_LAST_ERROR_CODE|CAN_IT_ERROR;

if(HAL_CAN_ActivateNotification(&hcan,activeITs)!=HAL_OK){

Error_Handler();

原代码中仅仅使能了CAN Error中断,并没有使能CAN接收中断,因此加入“CAN_IT_RX_FIFO0_MSG_PENDING”更新代码如下:

/* Activate CAN Error notifications. */

const uint32_t activeITs = CAN_IT_ERROR_WARNING|CAN_IT_ERROR_PASSIVE|

CAN_IT_LAST_ERROR_CODE| CAN_IT_ERROR |CAN_IT_RX_FIFO0_MSG_PENDING;

if (HAL_CAN_ActivateNotification(&hcan, activeITs) != HAL_OK) {

Error_Handler();

3.2 CAN接收Bug

CAN接收模块CAN_Receive在运行过程中会进入无限循环的等待:

/* Polling case. *//* Wait for reception, at least something available in FIFO. */while(HAL_CAN_GetRxFifoFillLevel(&hcan,CAN_RX_FIFO0)==0);

为了能够使主逻辑正常运行,需要对无线循环进行限制:

/* Polling case. */

/* Wait for reception, at least something available in FIFO. */

int temp_wait = 1;

while (HAL_CAN_GetRxFifoFillLevel(&hcan, CAN_RX_FIFO0) == 0)

temp_wait++;

if (temp_wait > 100)break;

在Keil5中直接更新代码后,如若simulink代码再次生成代码,手动修改的内容将不会被保存。为了一次性解决问题,需要更新硬件驱动该库文件[2]——tlc文件。需要修改对应的tlc文件(STM32-MAT的安装目录\STM32\blks\mex\tlc_c文件夹)。

另外从网友分享信息中,通过unpack模块进行扩展帧的接收会出现新的问题:

标准帧可以接收到数据,正常转发,而扩展帧中的数据接收不到。通过STlink调试发现,生成的代码中unpack模块判断扩展帧是为1,而接收的ID信息在赋值时,STM32定义的扩展帧表示为4。为了解决问题也需要对can_read_data.tlc进行更新

本期先分享到这里,想要进群学习单片机编程的同学可以私信我,回复“我要入门”,与我们一起成长,喜欢的可以点个赞关注我们!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
東京为何在外国人眼中已成为“性旅游之都”

東京为何在外国人眼中已成为“性旅游之都”

徐静波静说日本
2025-05-17 08:12:13
中方:立即停止一切军事进攻

中方:立即停止一切军事进攻

第一财经资讯
2025-05-16 15:12:00
体检报告中,若4个指标都正常,基本可以放心,身体还算健康

体检报告中,若4个指标都正常,基本可以放心,身体还算健康

诗词中国
2025-05-06 17:08:53
网传董小姐的孩子不是肖飞的!董小姐的老妈接下来肯定要被免职了

网传董小姐的孩子不是肖飞的!董小姐的老妈接下来肯定要被免职了

互联网大观
2025-05-16 15:14:59
印巴停了又打,七国集团急了:再打下去,解放军真正实力将曝光!

印巴停了又打,七国集团急了:再打下去,解放军真正实力将曝光!

明月聊史
2025-05-13 11:56:54
贾玲新片点映遇冷!87座影厅空63引热议,观众:这次不买营销账了

贾玲新片点映遇冷!87座影厅空63引热议,观众:这次不买营销账了

迪迪的娱乐故事
2025-05-16 05:54:12
汪小菲大婚遇闹剧!S妈凌晨突晒大S遗照:遗产全给孙子

汪小菲大婚遇闹剧!S妈凌晨突晒大S遗照:遗产全给孙子

陌辰凌
2025-05-17 12:43:47
女子网球世界排名更新,郑钦文因爆冷输球跌名次。

女子网球世界排名更新,郑钦文因爆冷输球跌名次。

曦言说
2025-05-17 01:38:52
最新!31只主升浪“慢牛”股名单曝光,葛卫东,出手!

最新!31只主升浪“慢牛”股名单曝光,葛卫东,出手!

证券市场周刊市场号
2025-05-17 12:57:59
运行了3年就面临拆解?白白投入几十亿,这一交通方式缺点众多

运行了3年就面临拆解?白白投入几十亿,这一交通方式缺点众多

涵豆说娱
2025-05-17 17:42:19
远华集团总裁赖昌星,在狱中对董文华的描述,听后让人咋舌

远华集团总裁赖昌星,在狱中对董文华的描述,听后让人咋舌

兰姐说故事
2025-02-17 22:00:03
郑州一车主疑忘拉手刹致空车坠河,已被打捞上岸

郑州一车主疑忘拉手刹致空车坠河,已被打捞上岸

潇湘晨报
2025-05-17 14:16:05
黄杨钿甜没问题,是这届牛马们的心态有问题

黄杨钿甜没问题,是这届牛马们的心态有问题

黑噪音
2025-05-17 15:13:26
太丢人,一家9口随800去吃酒席,吃一半就被赶出来 到底谁对谁错?

太丢人,一家9口随800去吃酒席,吃一半就被赶出来 到底谁对谁错?

匹夫来搞笑
2025-05-16 06:12:11
王皓:这次世乒赛,是十年或二十年最困难的一次

王皓:这次世乒赛,是十年或二十年最困难的一次

懂球帝
2025-05-17 17:37:27
收复藏南,不仅仅是9万平方公里 。

收复藏南,不仅仅是9万平方公里 。

老友科普
2025-05-17 13:52:39
“月薪2万舍不得买一个32元的面包”上热搜:你没穷过,你不懂

“月薪2万舍不得买一个32元的面包”上热搜:你没穷过,你不懂

精读君
2025-04-30 18:55:14
根本就没什么大学生就业难,是大学生根本就不想干。

根本就没什么大学生就业难,是大学生根本就不想干。

玉辞心
2025-05-17 09:00:24
乌苏啤酒发力新赛道 功能饮料“电持”在新疆首发

乌苏啤酒发力新赛道 功能饮料“电持”在新疆首发

中国日报网
2025-05-17 15:43:15
扎心!陈梦的这些话,孙颖莎听了得哭出来。

扎心!陈梦的这些话,孙颖莎听了得哭出来。

晓风说
2025-05-15 23:22:02
2025-05-17 20:24:49
小伙单片机编程
小伙单片机编程
想学单片机的看过来,带你入门
75文章数 264关注度
往期回顾 全部

科技要闻

王树国:梁文锋如果读博 还有DeepSeek吗?

头条要闻

四座四合院、七栋别墅 将被强拆的"英之园"已成打卡地

体育要闻

三年过去了,布伦森的打脸还没停

娱乐要闻

汪小菲婚礼在亭子里办仪式好热闹

财经要闻

关键时刻,央妈出手了

汽车要闻

小米汽车回应前保险杠变形 免费取送车和修复

态度原创

家居
旅游
本地
公开课
军事航空

家居要闻

温馨暖调 现代极简空间

旅游要闻

热闻|清明假期将至,热门目的地有哪些?

本地新闻

2025年“5·19中国旅游日”活动启动仪式

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

央视披露歼-10CE为何能击落多架战机