当前位置: 首页 > news >正文

STM32 CAN 过滤器设置

做个笔记吧 ,免得以后忘记了

芯片是stm32F207  ,用cubeMX 6.80 版本生成

CAN 的使用总体包含4个部分

第一步:CAN初始化,配置波特率  (cubeMX 里面配置好后自动生成,不需要手动添加)

MX_CAN1_Init();

第二步:接收部分的滤波器代码需要单独配置,CUBEMX未生成此部分代码。

 CAN_SetFilters();

第三步:

//使能CAN

HAL_CAN_Start(&hcan1);
//激活接收
 HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) ;

第四步

//实现接收回调函数

HAL_CAN_RxFifo0MsgPendingCallback();
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *CanHandle)
{
    CAN_RxHeaderTypeDef    RxHeader;     
    if(HAL_CAN_GetRxMessage(CanHandle, CAN_RX_FIFO0, &RxHeader, RX_data)   !=HAL_OK)
    {
      Error_Handler();
    }
    /*
    处理接收到的数据
    */    

    if (hcan->Instance == CAN1) {
            // user to do 
    }
}

这里重点记录CAN 的过滤器配置

HAL_StatusTypeDef CAN_SetFilters(void)
{

    CAN_FilterTypeDef    canFilter;
    HAL_StatusTypeDef result;
     //1. 设置FIFO 0 的筛选器
    uint32_t StdId = 0x50A;            //标准CAN ID 是11位
    canFilter.FilterBank = 0;        //筛选器组编号
    canFilter.FilterMode = CAN_FILTERMODE_IDMASK;    //ID掩码模式
    canFilter.FilterScale = CAN_FILTERSCALE_32BIT;    //32位长度

    canFilter.FilterIdHigh = StdId<<5;        //CAN_FxR1 寄存器的高16位
    canFilter.FilterIdLow = 0x0000;            //CAN_FxR1 寄存器的低16位
    canFilter.FilterMaskIdHigh = 0xFFE<<5;//最后一位不需匹配,其余位完全匹配 //CAN_FxR2寄存器的高16位
    canFilter.FilterMaskIdLow = 0xFFFF;//0x0000; 完全匹配        //CAN_FxR2寄存器的低16位
    
    canFilter.FilterFIFOAssignment = CAN_RX_FIFO0;        //应用于FIFO 0
    canFilter.FilterActivation = ENABLE;        //使用筛选器
    canFilter.SlaveStartFilterBank = 0;        //从CAN控制器筛选器起始的Bank
 
    result=HAL_CAN_ConfigFilter(&hcan1, &canFilter);

    //add 
    HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
    HAL_CAN_Start(&hcan1);

    return result;
}

http://www.lryc.cn/news/125188.html

相关文章:

  • 日常BUG—— maven编译报错
  • Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理
  • 学习Vue:插值表达式和指令
  • echart 3d立体颜色渐变柱状图
  • linux shell变量
  • Linux 发行版 Debian 12.1 发布
  • 【Rust】Rust学习 第七章使用包、Crate和模块管理不断增长的项目
  • 网站SSL安全证书是什么及其重要性
  • Android Alarm闹钟API使用心得
  • 什么是业务敏捷,如何实现业务敏捷?
  • ​ATF(TF-A)安全通告 TFV-7 (CVE-2018-3639)​
  • 第三天课程下
  • 嵌入式编译FFmpeg6.0版本并且组合x264
  • 原子css 和 组件化css如何搭配使用
  • Python 实现Selenium录屏的一种方法(图片整合成动态图)
  • 【设计模式——学习笔记】23种设计模式——策略模式Strategy(原理讲解+应用场景介绍+案例介绍+Java代码实现)
  • 通讯商二要素Api接口验证真伪
  • React源码解析18(6)------ 实现useState
  • MongoDB的下载和安装
  • 如何卖 Click to WhatsApp 广告最有效
  • 【UE4 RTS】10-RTS HUD Setup
  • Python生成指定大小文件:txt/图片/视频/csv
  • Arcgis中影像图切片有白斑或者白点
  • nlohmann json:通过[ ]运算符读取设置object/array
  • rust学习-tokio::time
  • Java 中 List 集合排序方法
  • prometheus监控k8s服务并告警到钉钉
  • Go和Java实现解释器模式
  • 域名配置HTTPS
  • 机械设计cad,ug编程设计,ug模具设计,SolidWorks模具设计