测试单片机是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);

数据发送的方法

  1. 配置好cubemx参数主要是波特率
  2. 打开CAN外设
  3. 构建一个发送结构体
  4. 使用发送
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外设使用相关推荐

  1. 26. GD32F103C8T6入门教程-CAN外设回环测试

    1.基础知识 相关stm32CAN外设 外设特征: 3个发送邮箱 2个深度为3个邮箱的接收FIFO 自动重传 自动唤醒 发送.接收时间戳 最大速率1Mbps 3种工作模式 睡眠模式:可以检车总线状态自 ...

  2. STM32--CAN通讯实验

    目录 CAN协议介绍 物理层 闭环总线网络 开环总线网络 通讯节点 差分信号 协议层简介 CAN的波特率 位时序 帧类型.作用及格式 数据帧 STM32CAN外设 CAN 发送邮箱 CAN 接收 FI ...

  3. proxmoxve打造云桌面_AIO攻略 | 桌面云是如何解决外设问题的?

    如何有效牢固地保护敏感数据? 如何实现通过多元化的终端设备接入企业办公桌面,且高效安全.不限地点? 如何实现桌面集中维护.统一管理,同时打造云上轻办公空间呢? 这恐怕是很多企业都在思考的问题. 答案非 ...

  4. iOS App 连接外设的几种方式

    原创作者: Max_Marry 文章地址: http://www.jianshu.com/p/852bf92c5c92 随着近年来车联网和物联网的兴起,智能家居和智能硬件的逐步火热,越来越多的 App ...

  5. 2018-2019-1 20165318 20165322 20165326 实验四 外设驱动程序设计

    实验四 外设驱动程序设计 实验内容 任务一 任务二 问题及解决方法 参考链接 实验内容 任务一 学习资源中全课中的"hqyj.嵌入式Linux应用程序开发标准教程.pdf"中的第十 ...

  6. 计算机用什么方式 管理程序和数据,计算机与外设之间数据传送方式有几种?各有什么特点?...

    原标题:计算机与外设之间数据传送方式有几种?各有什么特点? 主要有四种方式. 1.无条件传送方式,最简单的传送方式,所配置的硬件和软件最少. 2.查询传送方式,CPU的利用受到影响,陷于等待和反复查询 ...

  7. 计算机安装两个键盘会怎样,外设门诊:一个键盘能否连接两个接收器?

    1一个键盘能否连接两个接收器 [中关村在线键鼠频道原创] 用户及玩家在日常使用键鼠外设产品时,经常会出现这样或那样的问题.小到驱动下载安装,大到更换线材.MOD改造等等,如果您想得到及时丰富的解答,请 ...

  8. Linux主机驱动与外设驱动分离思想

    - by 宋宝华(Barry Song) 1主机.外设驱动分离的意义 在Linux设备驱动框架的设计中,除了有分层设计实现以外,还有分隔的思想.举一个简单的例子,假设我们要通过SPI总线访问某外设,在 ...

  9. i2c hid 触摸板不能用_I2C 总线协议初探 - STM32 I2C 接口外设学习笔记

    I2C(Inter-Integrated Circuit)总线是由 PHILIPS(飞利浦) 公司开发的两线式串行总线,用于连接微控制器及其外围设备.是微电子通信控制领域广泛采用的一种总线标准.它是同 ...

最新文章

  1. sip-selvet 环境搭建
  2. html中图片响应式怎么写,如何使用 HTML5 的picture元素处理响应式图片
  3. 本地安装UCSC基因组浏览器
  4. unity 动态生成类_Houdini城市道路模型生成
  5. CV_MAT_ELEM——获取矩阵元素和初始化矩阵
  6. arch linux添加用户,Users and groups (简体中文)
  7. Vue源码分析 - mvvm.js
  8. mybatis-plus修改操作(自动填充)
  9. 使用git checkout的方式进行轻量级部署
  10. flutter实现画中国地图
  11. android4.4.3版本root,碉堡了!ROOT精灵支持Nexus 5等Android4.4.3机型ROOT
  12. Flash制作大雪纷飞效果动画
  13. 纯洁的心--佩雷尔曼
  14. Python 微信自动化工具开发系列01_自动获取微信聊天信息(2023年1月可用)
  15. 等价多米诺骨牌对的数量
  16. 批量修改图片的后缀名以及删除相同的符号
  17. python网课教学_如何上好网课 — 老师录课和在线上课教学经验谈
  18. 南通大学机械院两年来的心得体会(给大一新生的一点建议)
  19. 微信屏蔽APP分享链接的解决方案原理,剖析微信域名防封技术
  20. 数据看板--日报、周报、月报

热门文章

  1. bat文件指定jdk路径_配置点击就能运行Python程序的bat批处理脚本(Windows)
  2. oracle mysql 线程数_oracle线程数更改
  3. ArcGIS中栅格数据的金字塔详解
  4. vmix安装无法连接远程服务器_Windows server 2012 云服务器建站教程 (1):远程连接桌面+IIS服务器安装...
  5. 模板引擎工作原理_「白皮书解读搜索引擎的工作原理」如何排序
  6. MateBook14一个多月的使用体验(开发向)
  7. centos7 yum修改为国内源
  8. django设置models.Model数据可以为空
  9. pytorch Embedding模块,自动为文本加载预训练的embedding
  10. Pytorch解决LSTM前向传播时报错:RuntimeError: input must have 3 dimensions, got 2