STM32CAN外设使用
测试单片机是STM32F427ZGT6,CAN外设的主频是45MHz
Can外设配置
- TTCM(Time triggered communication mode)时间触发模式,用于生成时间戳,可以实现分时同步功能
- ABOM(Automatic bus-off management) 自动离线管理,当节点检测到它发送错误或接收错误超过一定值时,会自动进入离线状态
- AWUM(Automatic bus-off management),自动唤醒功能,CAN 外设可以使用软件进入低功耗的睡眠模式,如果使能了这个自动唤醒功能,当 CAN 检测到总线活动的时候,会自动唤醒
- NART(No automatic retransmission)报文自动重传功能,设置这个功能后,当报文发送失败时会自动重传至成功为止
- RFLM(Receive FIFO locked mode)FIFO 锁定模式,该功能用于锁定接收 FIFO。锁定后,当接收 FIFO 溢出时,会丢弃下一个接收的报文。若不锁定,则下一个接收到的报文会覆盖原报文
- TXFP(Transmit FIFO priority)报文发送优先级的判定方法,ID 优先级还是报文存进邮箱的顺序来发送
使能接收中断
CAN外设使用步骤:
1. 配置CAN总线设备(以上2步,配置分频,配置QS1,QS2)
2. 在主程序内打开CAN设备,
3. 配置过滤器
4. 使能中断
5. 实现中断回调函数
CAN_RxHeaderTypeDef rxheadr;
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);if(hcan==&hcan1)HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &rxheadr, rx_can_data);elseHAL_CAN_GetRxMessage(&hcan2, CAN_RX_FIFO0, &rxheadr, rx_can_data);
}static void LEDTaskFunction( void * param)
{CAN_TxHeaderTypeDef header={.StdId = 1,.ExtId=0,.IDE = CAN_ID_STD,.RTR = CAN_RTR_DATA,.DLC=8};xsem = xSemaphoreCreateBinary();if(xsem!=NULL){hb_printf("create sem binary ok\r\n");}CAN_FilterTypeDef sFilterConfig;sFilterConfig.FilterBank = 0; //过滤器编号可选0-27sFilterConfig.FilterMode = CAN_FILTERMODE_IDLIST; //设为列表模式 ,还可以设置为掩码模式 sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; //过滤器使用32位模式 //使用标准帧,接收id是1;uint32_t id1=1;uint32_t tmp = (id1<<21)|CAN_ID_STD|CAN_RTR_DATA;//需要构造一个ID sFilterConfig.FilterIdHigh = (tmp&0xffff0000)>>16; //基本ID放入到STID中 sFilterConfig.FilterIdLow = tmp&0xffff; //使用标准帧,接收id是1;uint32_t id2=2;tmp = (id2<<21)|CAN_ID_STD|CAN_RTR_DATA; //需要构造一个ID sFilterConfig.FilterMaskIdHigh =(tmp&0xffff0000)>>16; sFilterConfig.FilterMaskIdLow =tmp&0xffff; sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0 ; //接收到的报文放入到FIFO0中 sFilterConfig.FilterActivation = ENABLE; //使能过滤器sFilterConfig.SlaveStartFilterBank = 0; //配置过滤器HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig);HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig);//打开CAN设备HAL_CAN_Start(&hcan1);HAL_CAN_Start(&hcan2);//就是打开中断HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING);HAL_CAN_ActivateNotification(&hcan2,CAN_IT_RX_FIFO0_MSG_PENDING);
数据发送的方法
- 配置好cubemx参数主要是波特率
- 打开CAN外设
- 构建一个发送结构体
- 使用发送
CAN_TxHeaderTypeDef header={.StdId = 1,//id.ExtId=0,//扩展id.IDE = CAN_ID_STD,//标准帧结构.RTR = CAN_RTR_DATA,//数据帧.DLC=8//数据的长度};
HAL_CAN_Start(&hcan1);
HAL_CAN_AddTxMessage(&hcan1, &header, "12345678", (uint32_t *) CAN_TX_MAILBOX0);
数据过滤器的设置方式
每组筛选器包含 2 个 32 位的寄存器,分别为 CAN_FxR1 和 CAN_FxR2,它们用来存储要筛选的 ID 或掩码
下面以32位筛选器标准帧为例:
CAN_FxR1[31-22]位是标准数据帧的id设置位合计11bit
CAN_FxR1[1] 是设置遥控帧还是数据帧
CAN_FxR1[2] 是设置标准帧还是扩展ID帧,此处设置为标准帧
示例代码设置标识符模式的标注帧 的ID 设置方法(32位列表模式)
//使用标准帧,接收id是1;uint32_t id1=1;//设置筛选的iduint32_t tmp = (id1<<21)|CAN_ID_STD|CAN_RTR_DATA;// 1.先移动21位,把id设置到指定的bit,添加真的RTR和IDEsFilterConfig.FilterIdHigh = (tmp&0xffff0000)>>16; // 将寄存器的高16bit放置到CAN_FxR1[31-16] ,sFilterConfig.FilterIdHigh仅仅低16位数据有效sFilterConfig.FilterIdLow = tmp&0xffff; // 将寄存器的高16bit放置到CAN_FxR1[15-0] ,sFilterConfig.FilterIdLow仅仅低16位数据有效//使用标准帧,接收id是2;uint32_t id2=2;tmp = (id2<<21)|CAN_ID_STD|CAN_RTR_DATA; sFilterConfig.FilterMaskIdHigh =(tmp&0xffff0000)>>16; //将寄存器的高16bit放置到CAN_FxR2[31-16] ,sFilterConfig.FilterMaskIdHigh仅仅低16位数据有效sFilterConfig.FilterMaskIdLow =tmp&0xffff; //将寄存器的高16bit放置到CAN_FxR2[15-0] ,sFilterConfig.FilterMaskIdLow仅仅低16位数据有效
示例2: 仅仅接收ID是奇数的数据(32位掩码模式)
接收所有数据
4种过滤模式的详细描述图
STM32CAN外设使用相关推荐
- 26. GD32F103C8T6入门教程-CAN外设回环测试
1.基础知识 相关stm32CAN外设 外设特征: 3个发送邮箱 2个深度为3个邮箱的接收FIFO 自动重传 自动唤醒 发送.接收时间戳 最大速率1Mbps 3种工作模式 睡眠模式:可以检车总线状态自 ...
- STM32--CAN通讯实验
目录 CAN协议介绍 物理层 闭环总线网络 开环总线网络 通讯节点 差分信号 协议层简介 CAN的波特率 位时序 帧类型.作用及格式 数据帧 STM32CAN外设 CAN 发送邮箱 CAN 接收 FI ...
- proxmoxve打造云桌面_AIO攻略 | 桌面云是如何解决外设问题的?
如何有效牢固地保护敏感数据? 如何实现通过多元化的终端设备接入企业办公桌面,且高效安全.不限地点? 如何实现桌面集中维护.统一管理,同时打造云上轻办公空间呢? 这恐怕是很多企业都在思考的问题. 答案非 ...
- iOS App 连接外设的几种方式
原创作者: Max_Marry 文章地址: http://www.jianshu.com/p/852bf92c5c92 随着近年来车联网和物联网的兴起,智能家居和智能硬件的逐步火热,越来越多的 App ...
- 2018-2019-1 20165318 20165322 20165326 实验四 外设驱动程序设计
实验四 外设驱动程序设计 实验内容 任务一 任务二 问题及解决方法 参考链接 实验内容 任务一 学习资源中全课中的"hqyj.嵌入式Linux应用程序开发标准教程.pdf"中的第十 ...
- 计算机用什么方式 管理程序和数据,计算机与外设之间数据传送方式有几种?各有什么特点?...
原标题:计算机与外设之间数据传送方式有几种?各有什么特点? 主要有四种方式. 1.无条件传送方式,最简单的传送方式,所配置的硬件和软件最少. 2.查询传送方式,CPU的利用受到影响,陷于等待和反复查询 ...
- 计算机安装两个键盘会怎样,外设门诊:一个键盘能否连接两个接收器?
1一个键盘能否连接两个接收器 [中关村在线键鼠频道原创] 用户及玩家在日常使用键鼠外设产品时,经常会出现这样或那样的问题.小到驱动下载安装,大到更换线材.MOD改造等等,如果您想得到及时丰富的解答,请 ...
- Linux主机驱动与外设驱动分离思想
- by 宋宝华(Barry Song) 1主机.外设驱动分离的意义 在Linux设备驱动框架的设计中,除了有分层设计实现以外,还有分隔的思想.举一个简单的例子,假设我们要通过SPI总线访问某外设,在 ...
- i2c hid 触摸板不能用_I2C 总线协议初探 - STM32 I2C 接口外设学习笔记
I2C(Inter-Integrated Circuit)总线是由 PHILIPS(飞利浦) 公司开发的两线式串行总线,用于连接微控制器及其外围设备.是微电子通信控制领域广泛采用的一种总线标准.它是同 ...
最新文章
- sip-selvet 环境搭建
- html中图片响应式怎么写,如何使用 HTML5 的picture元素处理响应式图片
- 本地安装UCSC基因组浏览器
- unity 动态生成类_Houdini城市道路模型生成
- CV_MAT_ELEM——获取矩阵元素和初始化矩阵
- arch linux添加用户,Users and groups (简体中文)
- Vue源码分析 - mvvm.js
- mybatis-plus修改操作(自动填充)
- 使用git checkout的方式进行轻量级部署
- flutter实现画中国地图
- android4.4.3版本root,碉堡了!ROOT精灵支持Nexus 5等Android4.4.3机型ROOT
- Flash制作大雪纷飞效果动画
- 纯洁的心--佩雷尔曼
- Python 微信自动化工具开发系列01_自动获取微信聊天信息(2023年1月可用)
- 等价多米诺骨牌对的数量
- 批量修改图片的后缀名以及删除相同的符号
- python网课教学_如何上好网课 — 老师录课和在线上课教学经验谈
- 南通大学机械院两年来的心得体会(给大一新生的一点建议)
- 微信屏蔽APP分享链接的解决方案原理,剖析微信域名防封技术
- 数据看板--日报、周报、月报
热门文章
- bat文件指定jdk路径_配置点击就能运行Python程序的bat批处理脚本(Windows)
- oracle mysql 线程数_oracle线程数更改
- ArcGIS中栅格数据的金字塔详解
- vmix安装无法连接远程服务器_Windows server 2012 云服务器建站教程 (1):远程连接桌面+IIS服务器安装...
- 模板引擎工作原理_「白皮书解读搜索引擎的工作原理」如何排序
- MateBook14一个多月的使用体验(开发向)
- centos7 yum修改为国内源
- django设置models.Model数据可以为空
- pytorch Embedding模块,自动为文本加载预训练的embedding
- Pytorch解决LSTM前向传播时报错:RuntimeError: input must have 3 dimensions, got 2