STM32 子设备通过CAN发送数据到主设备

采集ADC、GPS经纬坐标、温湿度数据、大气压数据通过CAN方式发送给主设备端,帧ID按照如下定义:

我尼玛一个标准帧ID位数据是11位,扩展帧才是11+18=29位,它说最开头的是四位是真类型,并给我如下解释:

它把帧的定义当成了字节2和字节3的拼接了(整体的报文识别码),对于STM32帧ID设置是直接赋值,也就是它给我的帧ID需要左移5位才是实际帧ID。不多说直接上代码!波特率500kbs!

初始化部分:

void Can_Btl(u32 btl)
{switch(btl){                case btl_5k	  	:CAN_Mode_Init(CAN_SJW_2tq,CAN_BS1_6tq,CAN_BS2_4tq,600,CAN_Mode_Normal);break;case btl_10k	:CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_5tq,CAN_BS2_3tq,400,CAN_Mode_Normal);break;case btl_20k	:CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_3tq,CAN_BS2_2tq,300,CAN_Mode_Normal);break;case btl_25k	:CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_3tq,CAN_BS2_2tq,240,CAN_Mode_Normal);break;case btl_40k	:CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_3tq,CAN_BS2_2tq,150,CAN_Mode_Normal);break;case btl_50k	:CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_3tq,CAN_BS2_2tq,120,CAN_Mode_Normal);break;case btl_62_5k 	:CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_3tq,CAN_BS2_2tq,96,CAN_Mode_Normal);break;case btl_80k	:CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_3tq,CAN_BS2_2tq,75,CAN_Mode_Normal);break;case btl_100k 	:CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_3tq,CAN_BS2_2tq,60,CAN_Mode_Normal);break;case btl_125k 	:CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_3tq,CAN_BS2_2tq,48,CAN_Mode_Normal);break;case btl_200k 	:CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_3tq,CAN_BS2_2tq,30,CAN_Mode_Normal);break;case btl_250k 	:CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_3tq,CAN_BS2_2tq,24,CAN_Mode_Normal);break;case btl_400k 	:CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_5tq,CAN_BS2_3tq,10,CAN_Mode_Normal);break;case btl_500k 	:CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_3tq,CAN_BS2_2tq,12,CAN_Mode_Normal);break;case btl_666k 	:CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_4tq,CAN_BS2_4tq,6,CAN_Mode_Normal);break;case btl_800k 	:CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_5tq,CAN_BS2_3tq,5,CAN_Mode_Normal);break;case btl_1M	  	:CAN_Mode_Init(CAN_SJW_1tq,CAN_BS1_3tq,CAN_BS2_2tq,6,CAN_Mode_Normal);break;}
}
u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{GPIO_InitTypeDef GPIO_InitStructure; CAN_InitTypeDef        CAN_InitStructure;CAN_FilterInitTypeDef  CAN_FilterInitStructure;
#if CAN_RX0_INT_ENABLE NVIC_InitTypeDef  NVIC_InitStructure;
#endifRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);//ʹÄÜPORTAʱÖÓ	                   											 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//ʹÄÜCAN1ʱÖÓ	GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);GPIO_InitStructure.GPIO_Pin = CAN_HIGH;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//¸´ÓÃÍÆÍìGPIO_Init(CAN_GPIO, &GPIO_InitStructure);		//³õʼ»¯IOGPIO_InitStructure.GPIO_Pin = CAN_LOW;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//ÉÏÀ­ÊäÈëGPIO_Init(CAN_GPIO, &GPIO_InitStructure);//³õʼ»¯IO//CANµ¥ÔªÉèÖÃCAN_InitStructure.CAN_TTCM=DISABLE;						 //·Çʱ¼ä´¥·¢Í¨ÐÅģʽ  //CAN_InitStructure.CAN_ABOM=ENABLE;						 //Èí¼þ×Ô¶¯ÀëÏß¹ÜÀí	 //CAN_InitStructure.CAN_AWUM=DISABLE;						 //˯Ãßģʽͨ¹ýÈí¼þ»½ÐÑ(Çå³ýCAN->MCRµÄSLEEPλ)//CAN_InitStructure.CAN_NART=ENABLE;						 	//½ûÖ¹±¨ÎÄ×Ô¶¯´«ËÍ //CAN_InitStructure.CAN_RFLM=DISABLE;						 //±¨ÎIJ»Ëø¶¨,еĸ²¸Ç¾ÉµÄ // CAN_InitStructure.CAN_TXFP=DISABLE;						 //ÓÅÏȼ¶Óɱ¨Îıêʶ·û¾ö¶¨ //CAN_InitStructure.CAN_Mode= mode;	         //ģʽÉèÖ㺠mode:0,ÆÕͨģʽ;1,»Ø»·Ä£Ê½; ////ÉèÖò¨ÌØÂÊCAN_InitStructure.CAN_SJW=tsjw;				//ÖØÐÂͬ²½ÌøÔ¾¿í¶È(Tsjw)Ϊtsjw+1¸öʱ¼äµ¥Î»  CAN_SJW_1tq	 CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tqCAN_InitStructure.CAN_BS1=tbs1; //Tbs1=tbs1+1¸öʱ¼äµ¥Î»CAN_BS1_1tq ~CAN_BS1_16tqCAN_InitStructure.CAN_BS2=tbs2;//Tbs2=tbs2+1¸öʱ¼äµ¥Î»CAN_BS2_1tq ~	CAN_BS2_8tqCAN_InitStructure.CAN_Prescaler=brp;            //·ÖƵϵÊý(Fdiv)Ϊbrp+1	//CAN_Init(CAN1, &CAN_InitStructure);            // ³õʼ»¯CAN1 CAN_FilterInitStructure.CAN_FilterNumber=0;	  //¹ýÂËÆ÷0CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32λ CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;32λIDCAN_FilterInitStructure.CAN_FilterIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32λMASKCAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//¹ýÂËÆ÷0¹ØÁªµ½FIFO0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //¼¤»î¹ýÂËÆ÷0CAN_FilterInit(&CAN_FilterInitStructure);//Â˲¨Æ÷³õʼ»¯
#if CAN_RX0_INT_ENABLECAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0ÏûÏ¢¹ÒºÅÖжÏÔÊÐí.		    NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // Ö÷ÓÅÏȼ¶Îª1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // ´ÎÓÅÏȼ¶Îª0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
#endifreturn 0;
}

采集及发送部分:

#define STD_ID_PID		(0x1020>>5)//0x0081
#define STD_ID_BASE		(0x2020>>5)//0x0101
#define STD_ID_LONG		(0x4020>>5)//0x0201
#define STD_ID_LAT		(0x8020>>5)//0x0401
while(1){if(sys_timer._1s_beat){//todo 1s freq thingsbme280GetData(&rel_data.bmp280_press,&bmp280_temper,&bmp280_humidity,&bmp280_asl);Analysis_GPS();SHT30_Read_Humiture(&sht30_temp,&sht30_humidity);rel_data.area_temper = sht30_temp*1.0f/10;rel_data.area_humi = sht30_humidity*1.0f/10;//»ù±¾ÐÅÏ¢·¢ËÍcan_buff[0] = ((STD_ID_BASE&0xff00)>>8);can_buff[1] = ((STD_ID_BASE&0x00ff)>>0);can_buff[2] = (sht30_temp&0xff00)>>8;//ζÈcan_buff[3] = (sht30_temp&0x00ff)>>0;can_buff[4] = (sht30_humidity&0xff00)>>8;//ʪ¶Ècan_buff[5] = (sht30_humidity&0x00ff)>>0;can_buff[6] = ((u16)rel_data.bmp280_press&0xff00)>>8;//´óÆøѹcan_buff[7] = ((u16)rel_data.bmp280_press&0x00ff)>>0;can_buff[8] = 0x00;can_buff[9] = 0x00;Can_Send_Msg(can_buff,sizeof(can_buff));//¾­¶ÈÐÅÏ¢·¢ËÍcan_buff[0] = ((STD_ID_LONG&0xff00)>>8);can_buff[1] = ((STD_ID_LONG&0x00ff)>>0);memcpy(&can_buff[2],(void *)&rel_data.longitude,sizeof(double));Can_Send_Msg(can_buff,sizeof(can_buff));//γ¶ÈÐÅÏ¢·¢ËÍcan_buff[0] = ((STD_ID_LAT&0xff00)>>8);can_buff[1] = ((STD_ID_LAT&0x00ff)>>0);memcpy(&can_buff[2],(void *)&rel_data.latitude,sizeof(double));Can_Send_Msg(can_buff,sizeof(can_buff));			sys_timer._1s_beat = false;}if(sys_timer._500ms_beat){//todo 500ms freq thingssys_timer._500ms_beat = false;}if(sys_timer._50ms_beat){Get_Adc_Num();adc_buf[adc_cnt++] = rel_data.adc_val;if(adc_cnt==4){//Íê³ÉÒ»°ü£¬´ò°ü·¢×ß-ͳһ°´ÕÕ´ó¶ËÐòcan_buff[0] = ((STD_ID_PID&0xff00)>>8);can_buff[1] = ((STD_ID_PID&0x00ff)>>0);can_buff[2] = (adc_buf[0]&0xff00)>>8;can_buff[3] = (adc_buf[0]&0x00ff)>>0;can_buff[4] = (adc_buf[1]&0xff00)>>8;can_buff[5] = (adc_buf[1]&0x00ff)>>0;can_buff[6] = (adc_buf[2]&0xff00)>>8;can_buff[7] = (adc_buf[2]&0x00ff)>>0;can_buff[8] = (adc_buf[3]&0xff00)>>8;can_buff[9] = (adc_buf[3]&0x00ff)>>0;Can_Send_Msg(can_buff,sizeof(can_buff));adc_cnt = 0;}sys_timer._50ms_beat = 0;}}	 
u8 Can_Send_Msg(u8* msg,u8 len)
{	u8 mbox;u16 i=0;CanTxMsg TxMessage;TxMessage.StdId=msg[0]<<8|msg[1];	// ±ê×¼±êʶ·û 11λTxMessage.ExtId=1;				   // ÉèÖÃÀ©Õ¹±êʾ·û TxMessage.IDE=CAN_Id_Standard; // ±ê×¼Ö¡TxMessage.RTR=CAN_RTR_Data;		 // Êý¾ÝÖ¡TxMessage.DLC=8;						// Òª·¢Ë͵ÄÊý¾Ý³¤¶Èfor(i=0;i<8;i++)TxMessage.Data[i]=msg[i+2];			          mbox= CAN_Transmit(CAN1, &TxMessage);   i=0;while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;	//µÈ´ý·¢ËͽáÊøif(i>=0XFF)return 1;return 0;
}

接收中断处理部分,此处没做帧ID过滤设置,没做接收数据处理设置:

CanRxMsg RxMessage;
void USB_LP_CAN1_RX0_IRQHandler(void)
{uint8_t i;CAN_Receive(CAN1, 0, &RxMessage);if(RxMessage.StdId>>8==0x01){paramx_can.Rev_ID = RxMessage.StdId & 0xFF;switch(RxMessage.Data[0]){default:break;}}
}

运行效果如下:

AD数据帧,1s发送5次,间隔200ms,一包包含4个数据,正好是50ms采集一次

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30110.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过Golang的container/list实现LRU缓存算法

文章目录 力扣&#xff1a;146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2. 插入元素3. 删除元素4. 遍历链表5. 获取链表长度使用场景注意事项 源代码阅读 在 Go 语言中&#xff0c;container/list 包提供了一个双向链表的实现。链表是一种常见的数据结构&#…

模型微调-基于LLaMA-Factory进行微调的一个简单案例

模型微调-基于LLaMA-Factory进行微调的一个简单案例 1. 租用云计算资源2. 拉取 LLaMa-Factory3. 安装依赖环境4. 启动 LLaMa-Factory 界面5. 从 Huggingface 下载模型6. 模型验证7. 模型微调 1. 租用云计算资源 以下示例基于 AutoDL 云计算资源。 在云计算平台选择可用的云计…

ArcGIS操作:13 生成最小外接矩阵

应用情景&#xff1a;筛选出屋面是否能放下12*60m的长方形&#xff0c;作为起降场候选点&#xff08;一个不规则的形状内&#xff0c;判断是否能放下指定长宽的长方形&#xff09; 1、面积初步筛选 Area ≥ 720 ㎡ 面积计算见 2、打开 ArcToolbox → Data Management Tools …

Vue 系列之:插槽

前言 插槽是定义在子组件中的&#xff0c;相当于一个占位符&#xff0c;父组件可以在这个占位符中填充HTML代码、组件等内容。 插槽显不显示、怎样显示是由父组件来控制的&#xff0c;而插槽在哪里显示就由子组件来进行控制。 基本使用 子组件&#xff1a; <template&g…

使用OpenCV和MediaPipe库——驼背检测(姿态监控)

目录 驼背检测的运用 1. 驾驶姿态与疲劳关联分析 2. 行业应用案例 1. 教育场景痛点分析 2. 智能教室系统架构 代码实现思路 1. 初始化与配置 2. MediaPipe和摄像头设置 3. 主循环 4. 资源释放 RGB与BGR的区别 一、本质区别 二、OpenCV的特殊性 内存结构示意图&…

网络版汉译英服务(muduo)

文章目录 网络版汉译英服务&#xff08;muduo&#xff09;muduo库muduo 库是什么muduo 库常见接口介绍muduo::net::EventLoopmuduo::net::TcpConnectionmuduo::net::TcpServermuduo::net::TcpClientmuduo::net::Buffer 汉译英服务服务端客户端 网络版汉译英服务&#xff08;mud…

“此电脑”中删除WPS云盘方法(百度网盘通用)

&#x1f4e3;此方法适用于卸载WPS云盘后&#xff0c;WPS云盘图标依然在此电脑中显示的问题。 原理&#xff1a;通过注册来进行删除 步骤&#xff1a; WIN键R,打开运行窗口&#xff0c;输入regedit命令&#xff0c;来打开【注册表编辑器】&#xff1b; 从左侧&#xff0c;依…

在ArcMap中通过Python编写自定义工具(Python Toolbox)实现点转线工具

文章目录 一、需求二、实现过程2.1、创建Python工具箱&#xff08;.pyt&#xff09;2.2、使用catalog测试代码2.3、在ArcMap中使用工具 三、测试 一、需求 通过插件的形式将点转线功能嵌入ArcMap界面&#xff0c;如何从零开始创建一个插件&#xff0c;包括按钮的添加、工具的实…

Cursor 使用经验,一个需求开发全流程

软件开发中 Cursor 的使用经验成为关注焦点&#xff0c;尤其是处理大型数据集的需求。用户提到“Cursor 使用经验&#xff0c;一个需求开发全流程”&#xff0c;但“Cursor”可能指数据库游标&#xff0c;涉及逐行处理数据。本文将详细探讨开发一个需求的完整流程&#xff0c;包…

selenium库

一、什么是selenium库&#xff1f; selenim是一个用于Web应用程序自动化测试工具&#xff0c;selenium测试直接运行在浏览器中 像真正的用户在操作一样&#xff0c;驱动浏览器执行特定的动作&#xff0c;如点击&#xff0c;下拉等操作 二、selenium在爬虫中的应用 获取动态…

[密码学实战]Java实现国密TLSv1.3单向认证

一、代码运行结果 1.1 运行环境 1.2 运行结果 1.3 项目架构 二、TLS 协议基础与国密背景 2.1 TLS 协议的核心作用 TLS(Transport Layer Security) 是保障网络通信安全的加密协议,位于 TCP/IP 协议栈的应用层和传输层之间,提供: • 数据机密性:通过对称加密算法(如 AE…

## DeepSeek写水果记忆配对手机小游戏

DeepSeek写水果记忆配对手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端水果记忆配对小游戏H5文件&#xff1a; 要求 可以重新开始游戏 可以暂停游戏 卡片里的水果…

【愚公系列】《Python网络爬虫从入门到精通》045-Charles的SSL证书的安装

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…

夸父工具箱(安卓版) 手机超强工具箱

如今&#xff0c;人们的互联网活动日益频繁&#xff0c;导致手机内存即便频繁清理&#xff0c;也会莫名其妙地迅速填满&#xff0c;许多无用的垃圾信息悄然占据空间。那么&#xff0c;如何有效应对这一难题呢&#xff1f;答案就是今天新推出的这款工具软件&#xff0c;它能从根…

探秘Transformer系列之(11)--- 掩码

探秘Transformer系列之&#xff08;11&#xff09;— 掩码 文章目录 探秘Transformer系列之&#xff08;11&#xff09;--- 掩码0x00 概述0x01 需求1.1 避免偏差实际情况问题所在解决方案 1.2 防止偷看实际情况问题所在解决方案 0x02 Padding Mask2.1 逻辑掩码矩阵计算注意力步…

使用MPU6050产生中断,唤醒休眠中的STM32

本篇文章源码&#xff1a;STM32L431_RT_Thread_PM_mpu6050_wakeup: 使用MPU6050产生中断&#xff0c;唤醒休眠中的STM32L4 书接上回【笔记】STM32L4系列使用RT-Thread Studio电源管理组件&#xff08;PM框架&#xff09;实现低功耗-CSDN博客 上一篇文章使用PA0外接一个按键实…

国产编辑器EverEdit - 宏功能介绍

1 宏 1.1 应用场景 宏是一种重复执行简单工作的利器&#xff0c;可以让用户愉快的从繁琐的工作中解放出来&#xff0c;其本质是对键盘和菜单的操作序列的录制&#xff0c;并不会识别文件的内容&#xff0c;属于无差别无脑执行。 特别是对一些有规律的重复按键动作&#xff0c;…

ubuntu22.04安装P104-100一些经验(非教程)

一、版本&#xff1a; 系统&#xff1a;ubuntu-22.04.5-desktop-amd64.iso Nvidia 驱动&#xff1a;NVIDIA-Linux-x86_64-570.124.04.run。官网下载即可 二、经验 1、通用教程⭐ 直接关键词搜“ubuntu p104”会有一些教程&#xff0c;比如禁用nouveau等 安装参考&#xff1a…

后智能体时代的LLM和Agent

文章目录 1. 关于AI重塑的哲学体系2. 关于AI大模型体系的认知3. 关于AI大模型体系的畅想4. 关于人和AI大模型体系的共处5. 写在最后 随着OpenAI、Deepseek、Manus等等智能体的爆火&#xff0c;人们茶前饭后、插科打诨的话题都离不开这些智能体&#xff0c;现状也正如《人民日报…

Denoising Diffusion Probabilistic Models

这篇文章就是所谓的DDPM 前向扩散过程之和前一步有关&#xff0c;是一阶马尔可夫链&#xff0c;是图像和标准高斯噪声I的加权&#xff0c;认为方差全部来自I&#xff0c;并且多步可以通过连乘合并为一步&#xff1a; 反向的过程也是类似的形式&#xff1a; 并且由贝叶斯公式&am…