STMCubeMX5.10版本CAN使用loopback模式自测

2023-11-03

使用芯片:STM32F103C8T6
cube软件版本:5.10
软件包版本为:STM32Cube FW_F1 V1.7.0

一、配置时钟为使用外部晶振,并配置为72M

在这里插入图片描述
在这里插入图片描述

二、使能 can,并配置参数

设置can波特率为500k,并设置为loopback模式,波特率计算方式为(systime/(pre*(bs1+bs2+sjw))),can时钟为36M,则36/(12*(1+2+3))=500k。
在这里插入图片描述

三、开启can接收中断

在这里插入图片描述

四、设置生成代码,在生成的can.c函数中增加过滤器配置代码如下

在这里插入图片描述
CAN_FilterIdHigh和CAN_FilterIdLow组合成一个32位寄存器,用来存储将要过滤的ID

CAN_FilterMaskIdHigh和CAN_FilterMaskIdLow组合成一个32位寄存器,用来表示这个ID的哪些位必须符合(置1),哪些位不关心(置0).
例如要过滤的ID为0x1e000000,则CAN_FilterIdHigh、CAN_FilterIdLow、CAN_FilterMaskIdHigh和CAN_FilterMaskIdLow配置为

uint32_t EXTID = 0x1e000000;
CAN_FilterType.FilterIdHigh=(EXTID<<3)>>16;
CAN_FilterType.FilterIdLow=((EXTID<<3)&0xffff)|CAN_ID_EXT;//只关心扩展帧,标准帧为CAN_ID_STD
CAN_FilterType.FilterMaskIdHigh=0xffff;
CAN_FilterType.FilterMaskIdLow=0xffff<<3|CAN_ID_EXT;//每一位都必须一致,只关心扩展帧,标准帧为CAN_ID_STD

以下配置代码,有列表模式和掩码模式,二选一

/* 列表模式只接受0x02200000和0x1e000000 */
void CAN1_IDLISTConfig(void)
{
	uint32_t EXTID = 0x02200000;
	uint32_t EXTID1 = 0x1e000000;
	CAN_FilterTypeDef CAN_FilterType;
	CAN_FilterType.FilterBank=0;
	CAN_FilterType.FilterIdHigh=(EXTID<<3)>>16;
	CAN_FilterType.FilterIdLow=((EXTID<<3)&0xffff)|CAN_ID_EXT;
	CAN_FilterType.FilterMaskIdHigh=0xffff;
	CAN_FilterType.FilterMaskIdLow=0xffff<<3|CAN_ID_EXT;
	CAN_FilterType.FilterFIFOAssignment=CAN_RX_FIFO0;
	CAN_FilterType.FilterMode=CAN_FILTERMODE_IDLIST;
	CAN_FilterType.FilterScale=CAN_FILTERSCALE_32BIT;
	CAN_FilterType.FilterActivation=ENABLE;
	CAN_FilterType.SlaveStartFilterBank=14;
	if(HAL_CAN_ConfigFilter(&hcan,&CAN_FilterType)!=HAL_OK)
	{
		Error_Handler();
	}
	CAN_FilterType.FilterBank=1;
	CAN_FilterType.FilterIdHigh=(EXTID1<<3)>>16;
	CAN_FilterType.FilterIdLow=((EXTID1<<3)&0xffff)|CAN_ID_EXT;
	CAN_FilterType.FilterMaskIdHigh=0xffff;
	CAN_FilterType.FilterMaskIdLow=0xffff<<3|CAN_ID_EXT;
	CAN_FilterType.FilterFIFOAssignment=CAN_RX_FIFO0;
	CAN_FilterType.FilterMode=CAN_FILTERMODE_IDLIST;//列表模式
	CAN_FilterType.FilterScale=CAN_FILTERSCALE_32BIT;
	CAN_FilterType.FilterActivation=ENABLE;
	CAN_FilterType.SlaveStartFilterBank=14;
	if(HAL_CAN_ConfigFilter(&hcan,&CAN_FilterType)!=HAL_OK)
	{
		Error_Handler();
	}
	if(HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING)!=HAL_OK)
	{
		Error_Handler();
	}
	if(HAL_CAN_Start(&hcan)!=HAL_OK)
	{
		Error_Handler();
	}
}
/* 掩码模式全部接收 */
void CAN1_IDMASKConfig(void)
{
   	CAN_FilterTypeDef CAN_FilterType;
   	CAN_FilterType.FilterBank=0;
   	CAN_FilterType.FilterIdHigh=0x0000;
   	CAN_FilterType.FilterIdLow=0x0000;
   	CAN_FilterType.FilterMaskIdHigh=0x0000;
   	CAN_FilterType.FilterMaskIdLow=0x0000;
   	CAN_FilterType.FilterFIFOAssignment=CAN_RX_FIFO0;
   	CAN_FilterType.FilterMode=CAN_FILTERMODE_IDMASK;//掩码模式
   	CAN_FilterType.FilterScale=CAN_FILTERSCALE_32BIT;
   	CAN_FilterType.FilterActivation=ENABLE;
   	CAN_FilterType.SlaveStartFilterBank=14;
   	if(HAL_CAN_ConfigFilter(&hcan,&CAN_FilterType)!=HAL_OK)
   	{
   		Error_Handler();
   	}
   	if(HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING)!=HAL_OK)
   	{
   		Error_Handler();
   	}
   	if(HAL_CAN_Start(&hcan)!=HAL_OK)
   	{
   		Error_Handler();
   	}
}

五、增加can发送函数

 /***********************************************
    函数功能:can发送数据
    入口参数:
    			ide:	0:标准帧
    					1:扩展帧
    			id:	帧ID
    			len:	数据长度
    			data:	数据
    返回值:0:成功。1:失败
    ************************************************/
    uint8_t Can_TxMessage(uint8_t ide,uint32_t id,uint8_t len,uint8_t *data)
    {
    	uint32_t   TxMailbox;
    	CAN_TxHeaderTypeDef CAN_TxHeader;
    	HAL_StatusTypeDef   HAL_RetVal; 
    	uint16_t i=0;
    	if(ide == 0)
    	{
    		CAN_TxHeader.IDE = CAN_ID_STD;	//标准帧
    		CAN_TxHeader.StdId = id;
    	}
    	else 
    	{
    		CAN_TxHeader.IDE = CAN_ID_EXT;			//扩展帧
    		CAN_TxHeader.ExtId = id;
    	}
    	CAN_TxHeader.DLC = len;
    	CAN_TxHeader.RTR = CAN_RTR_DATA;//数据帧,CAN_RTR_REMOTE遥控帧
    	CAN_TxHeader.TransmitGlobalTime = DISABLE;
    	while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) == 0)
    	{
    		i++;
    		if(i>0xfffe)
    			return 1;
    	}
    	HAL_Delay(500);
    	HAL_RetVal = HAL_CAN_AddTxMessage(&hcan,&CAN_TxHeader,data,&TxMailbox);
    	if(HAL_RetVal != HAL_OK)
    		return 1;
    	return 0;
    }

六、增加接收中断回调函数

 void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
    {
    	CAN_RxHeaderTypeDef CAN_RxHeader;
    	HAL_StatusTypeDef HAL_Retval;
    	uint8_t Rx_Data[8];
    	uint8_t Data_Len=0;
    	uint32_t ID=0;
    	uint8_t i;
    	HAL_Retval = HAL_CAN_GetRxMessage(hcan,CAN_RX_FIFO0,&CAN_RxHeader,Rx_Data);
    	if(HAL_Retval == HAL_OK)
    	{
    		Data_Len = CAN_RxHeader.DLC;
    		if(CAN_RxHeader.IDE)
    			ID = CAN_RxHeader.ExtId;
    		else
    			ID = CAN_RxHeader.StdId;
    		printf("id:%x\r\n",ID);
    		printf("Data_Len:%d\r\n",Data_Len);
    		for(i=0;i<8;i++)
    			printf("Rx_Data[%d]=%x\r\n",i,Rx_Data[i]);	
    	}
    }

七,在main.c函数中增加函数,最终如下:

 int main(void)
    {
      /* USER CODE BEGIN 1 */
    	uint8_t data[8]={1,2,3,4,5,6,7,8};
      /* USER CODE END 1 */
    
      /* MCU Configuration--------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_CAN_Init();
      MX_USART1_UART_Init();
      /* USER CODE BEGIN 2 */
    	CAN1_IDMASKConfig();//过滤器配置
      /* USER CODE END 2 */
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
    	  Can_TxMessage(0,0x222,8,data);//CAN发送
    	  HAL_Delay(1000);
      }
      /* USER CODE END 3 */
    }

每隔1S,通过can向标识符为0x222的设备发送一次数据,因为本例程设置的为loopback模式,所以不需要接任何外设即可,通过串口调试助手查看接收到的数据,与发送数据相符
在这里插入图片描述
工程下载地址:https://download.csdn.net/download/qq_32605451/11042109

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STMCubeMX5.10版本CAN使用loopback模式自测 的相关文章

随机推荐

  • 使用EasyPoi轻松导入导出Excel文档

    提到Excel的导入导出 大家肯定都知道alibaba开源的EasyExcel 该项目的github地址为 https github com alibaba easyexcel 这个项目非常活跃 项目诞生的目的就是为了简化开发 降低内存消耗
  • SCJP认证试题(十一)

    author yaoyuan 10 package com sun scjp 11 public class Geodetics 12 public static final double DIAMETER 12756 32 kilomet
  • 追求极致速度,极简多模态预训练模型ViLT,推理速度比UNITER快60倍!(ICML2021)...

    关注公众号 发现CV技术之美 写在前面 视觉和语言预训练 VLP 提高了各种联合视觉和语言下游任务的表现 然而 当前的VLP方法严重依赖于图像特征提取的过程 其中大部分涉及区域监督 例如 目标检测 和卷积结构 例如 ResNet 他们存在以
  • ubuntu16.04安装CUDA、cuDNN GTX 1660Ti

    在安装之前需要先确定已经安装好与显卡适配的驱动 如果没有的话 下载驱动 https www nvidia cn Download index aspx lang cn 安装 https blog csdn net frothmoon art
  • PCL 计算空间三角形的面积

    目录 一 算法原理 1 空间三角形面积 2 参考文献 二 代码实现 三 结果展示 一 算法原理 1 空间三角形面积 空间三角形面积的计算公式为 A P P S 1 P
  • FreeRTOS韦东山视频前八节学习笔记

    RTOS架构的概念 裸机开发 while 1 WEIFAN LIAOTIAN 多任务并行在while 1 循环 FreeeRTOS while 1 creat task 喂饭 creay task 回信息 start scheduler 让
  • Java课程设计——学生信息管理系统(源码)

    项目简介 该项目可以分为三个模块 登录模块 主页面模块 信息储存模块 本系统完成了基本所需功能 界面清晰 操作简单又实用 基本满足了学校对学生信息的增添 查询 修改和删除等功能 且具有登录系统使该系统具有一定的安全性 大大减少了操作人员和用
  • jstl 格式化时间日期标签讲解

  • 使用Openjdk8和maven时出错:java.security.InvalidAlgorithmParameterException

    错误类型 Maven java lang RuntimeException Unexpected error java security InvalidAlgorithmParameterException the trustAnchors
  • 【PCL】基于法线的差异来分割点云

    基于法线差异来分割点云 1 法向量的计算及可视化 法线又称法向量 因为在三维的点云中 根据一个点的K近邻点或者一个点的radius半径范围内的点拟合一个平面 而垂直这个平面且经过改点的线称之为法向量 法向量是点云点到另一个点的有方向的线段
  • 在django项目里创建子路由

    首先创建一个django项目 然后开始创建子路由 创建django项目 1 在pycharm中创建一个Blog graden的django项目 注意环境要选择正确 2 在Blog graden项目的控制台中创建一个blog app 3 将t
  • BIO、NIO、AIO区别

    一 BIO NIO AIO特点 1 BIO的特点就是每次一个客户端接入 都要在服务端创建一个线程来服务于这个客户端 所以如果有很多个客户端 就会对应成千上万个服务端线程 这会导致服务端负载过高 甚至卡死 2 NIO是同步非阻塞io 客户端和
  • C++ opencv人脸识别框

    需求 视频实时定位人脸位置 并画框 类似效果如下 分析 取视频帧 每一帧其实就类似一张图片 利用opencv的人脸识别模块 检测每一帧并进行划线 处理完成后显示 最后组成就是动态的带人脸识别框的视频 解决方法 下面是每一帧数据的处理方法 加
  • Myeclipse破解失败&&error: unable to access jarfile cracker.jar解决方法

    我的情况是在cracker jar破解成功后 Myeclipse依旧显示不成功 破解方案如下 1 进入cmd 输入java jar cracker jar 成功则显示图形 失败则会显示 error unable to access jarf
  • 台式机安装Linux系统

    材料 台式机 U盘 内存大于8G CentOs7 步骤一 U盘启动电脑 启动成功画面 选择第一个 按E或者 Tab键 进行编辑 vmlinuz initrd initrd img inst stage2 hd LABEL CentOS x2
  • Android 10深色主题适配踩坑记录

    1 问题简述 Android 10 推出了深色主题 便于用户根据白天和夜晚自由切换合适的主题 在适配的过程中 要特别注意 切换主题会导致当前activity被重建 也就是会重新走一遍Activity的生命周期 就和横竖屏切换时会重新走生命周
  • MongoDB 日志太大

    MongoDB的日志增长的非常快 var所在的空间立即就占满了 即便换到还有一个磁盘分区保存日志 日志还是增长的非常快 磁盘眼看要告磬 有一个好办法 就是使用旋转日志 MongoDB的旋转日志有点怪 Linux下mongd服务接受一个kil
  • C++基于开源Modbus Tcp 通讯应用客户端(稳定高效,多线程后台状态读取,不卡顿)

    C 基于开源Modbus Tcp 通讯应用客户端 前言 一 演示效果 二 关键程序 1 头文件 2 源文件 三 下载链接 前言 使用多线程后台批量刷寄存器的状态 在某种程度上保证了上层接口读取的时候 不会卡顿 整体应用效果比较友好 程序应用
  • PyImport_ImportModule 返回空NULL py模块import其他库

    问题描述 执行下列代码 PyImport ImportModule 总返回空NULL Py SetPythonHome L C Program Files Python38 Py Initialize PyRun SimpleString
  • STMCubeMX5.10版本CAN使用loopback模式自测

    使用芯片 STM32F103C8T6 cube软件版本 5 10 软件包版本为 STM32Cube FW F1 V1 7 0 一 配置时钟为使用外部晶振 并配置为72M 二 使能 can 并配置参数 设置can波特率为500k 并设置为lo