CAN 五: CAN编程实践

1、CAN基本驱动步骤

(1)CAN参数初始化

  • 工作模式、波特率等
  • 函数:HAL_CAN_Init

(2)使能CAN时钟和初始化相关引脚

  • GPIO模式设为复用功能模式
  • 函数:HAL_CAN_MspInit(CAN的初始化回调函数)

(3)设置过滤器

  • 过滤器的配置
  • 函数:HAL_CAN_ConfigFilter

(4)CAN数据的接收和发送

  • HAL_CAN_AddTxMessage  发送消息
  • HAL_CAN_GetRxMessage  接收数据

(5)使能CAN相关中断/设置NVIC/编写中断服务函数

  • NVIC:中断控制器
  • __HAL_CAN_ENABLE_IT (可选)

2、开发环境

(1)KeilMDK:V5.38.0.0

(2)STM32CubeMX:V6.8.1

(3)MCU:STM32F407ZGT6

3、实验目的

(1)使用回环模式实现自发自收。

(2)CAN发送数据,然后接收数据,将接收到的数据通过串口发送出去。

4、原理图

(1)CAN芯片选择TJA1040。

(2)CAN_TX接PA12,CAN_RX接PA11。

5、STM32CubeMX创建工程及配置

5.1、补充内容

(1)查阅数据手册,CAN外设接在总线APB1上,时钟频率此处配置为36MHz。

(2)CubeMX创建工程、配置时钟、串口不做详细介绍。

5.2、CubeMX中CAN的配置

(1)使能CAN外设。

(2)配置CAN的参数

  • Bit Timings Parameters:位时序参数
    • Prescaler:分频系数
    • Time Quanta in Bit Segment 1:时间段1(配置为9标识9个时间单元)
    • Time Quanta in Bit Segment 2:时间段2
    • ReSynchronization Jump Width:重新同步跳跃宽度
    • TS1=8、TS2=7、BRP=3,波特率 = 36000 / [( 9 + 8 + 1 ) * 4] = 500Kbps
  • Basic Parameters:基本参数
    • Time Triggered Communication Mode:时间触发通信方式
    • Automatic Bus-Off Management:总线自动离线管理
    • Automatic Wake-Up Mode:自动唤醒模式
    • Automatic Retransmission:自动重发
    • Receive Fifo Locked Mode:接收Fifo锁定模式
    • Transmit Fifo Priority:发送Fifo优先级
  • Advanced Parameters:先进的参数
    • Operating Mode:操作模式

6、KeilMDK软件编写

6.1、CAN相关函数

CAN_TxHeaderTypeDef g_can1_txheader;    /* CAN发送结构体 */
CAN_RxHeaderTypeDef g_can1_rxheader;    /* CAN接收结构体 */
CAN_HandleTypeDef hcan1;     // CAN控制句柄/* CAN1 init function */
void MX_CAN1_Init(void)
{hcan1.Instance = CAN1;hcan1.Init.Prescaler = 4;                  /* 分频系数 */            hcan1.Init.Mode = CAN_MODE_LOOPBACK;       /* 工作模式设置 环回模式:自发自收 */hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;    /* 重新同步跳跃宽度 */hcan1.Init.TimeSeg1 = CAN_BS1_9TQ;         /* 时间段1 */hcan1.Init.TimeSeg2 = CAN_BS2_8TQ;         /* 时间段2 */hcan1.Init.TimeTriggeredMode = DISABLE;    /* 禁止时间触发通信模式 */hcan1.Init.AutoBusOff = DISABLE;           /* 禁止自动离线管理 */hcan1.Init.AutoWakeUp = DISABLE;           /* 禁止自动唤醒 */hcan1.Init.AutoRetransmission = DISABLE;   /* 禁止自动重发 */hcan1.Init.ReceiveFifoLocked = DISABLE;    /* 禁止接收FIFO锁定 */hcan1.Init.TransmitFifoPriority = DISABLE; /* 禁止发送FIFO优先级 */if (HAL_CAN_Init(&hcan1) != HAL_OK){Error_Handler();}}void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(canHandle->Instance==CAN1){/* USER CODE BEGIN CAN1_MspInit 0 *//* USER CODE END CAN1_MspInit 0 *//* CAN1 clock enable */__HAL_RCC_CAN1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**CAN1 GPIO ConfigurationPA11     ------> CAN1_RXPA12     ------> CAN1_TX*/GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF9_CAN1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USER CODE BEGIN CAN1_MspInit 1 *//* USER CODE END CAN1_MspInit 1 */}
}/*
**功能:CAN过滤器配置
**参数:无
**返回值:无*/
void can_filter_config(void)
{CAN_FilterTypeDef can_filterconfig;/* 过滤器是接收所有报文,不筛选 */can_filterconfig.FilterMode = CAN_FILTERMODE_IDMASK;   /* 过滤器模式:标识符掩码模式(屏蔽位模式)*/can_filterconfig.FilterScale = CAN_FILTERSCALE_32BIT;  /* 过滤器位宽:32位位宽 *///STID[10:3] STID[2:0] EXID[17:13]         EXID[12:5] EXID[4:0] IDE RTR 0can_filterconfig.FilterIdHigh = 0;        /* ID高字节 */               can_filterconfig.FilterIdLow  = 0;        /* ID低字节 */can_filterconfig.FilterMaskIdHigh = 0;    /* 掩码高字节 */can_filterconfig.FilterMaskIdLow  = 0;    /* 掩码低字节 */can_filterconfig.FilterBank = 0;                         /* 选择过滤器组 */can_filterconfig.FilterFIFOAssignment = CAN_FilterFIFO0; /* 过滤器关联FIFO */can_filterconfig.FilterActivation = CAN_FILTER_ENABLE;   /* 过滤器使能 */can_filterconfig.SlaveStartFilterBank = 14;HAL_CAN_ConfigFilter(&hcan1, &can_filterconfig);}/* 发送消息数据函数 */
void can_send_message(uint32_t id, uint8_t *buf, uint8_t len)
{uint32_t tx_mail = CAN_TX_MAILBOX0;  /* 发送邮箱 */g_can1_txheader.ExtId = id;          /* 扩展标识符 */g_can1_txheader.DLC = len;           /* 数据长度 */g_can1_txheader.IDE = CAN_ID_EXT;    /* 帧格式(标准帧或扩展帧) */g_can1_txheader.RTR = CAN_RTR_DATA;  /* 帧类型(数据帧或远程帧) */HAL_CAN_AddTxMessage(&hcan1, &g_can1_txheader, buf, &tx_mail);// 等待发送完成while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan1) != 3);
}/* 接收数据函数 */
uint8_t can_receive_message(uint8_t *buf)
{if (HAL_CAN_GetRxFifoFillLevel(&hcan1, CAN_RX_FIFO0) == 0){return 0;}HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &g_can1_rxheader, buf);// 返回接收数据长度return g_can1_rxheader.DLC;
}

6.2、main.c部分代码

#include "can.h"int main(void)
{/* USER CODE BEGIN 1 */uint8_t can_sen_buf[8] = {0, 1, 2, 3, 4, 5, 6, 7};  // can发送数据uint8_t can_rec_len = 0;                            // can接收数据长度uint8_t can_rec_buf[8] = {0};                       // can接收数据缓冲区MX_CAN1_Init();/* USER CODE BEGIN 2 */// 1、已经使能CAN时钟和初始化CAN// 2、配置CAN接收过滤器can_filter_config();// 3、启动CAN设备HAL_CAN_Start(&hcan1);while (1){printf("hello world\r\n");can_send_message(0xF0000000, can_sen_buf, 8);can_rec_len = can_receive_message(can_rec_buf);if (can_rec_len){for (uint8_t i = 0; i < can_rec_len; i++){printf("%x ",can_rec_buf[i]);}printf("\r\n");}}
}

6.3、完整工程下载地址

(1)完整工程存储再码云。

(2)STM32_CSDN: CSDN中STM32专栏的所有示例代码

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

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

相关文章

Photoshop插件3D Map Generator Geo的使用记录1(版本说明、安装卸载使用和高程数据生成3D地形图的准备工作)

3D Map Generator是一款强大的地图创建和定制化工具&#xff0c;具有以下特点和功能&#xff1a; 快速创建3D地图&#xff1a;用户可以通过该工具快速创建出高质量的3D地图&#xff0c;而无需具备专业的GIS或PS技能。支持多种图层类型&#xff1a;3D Map Generator支持多种图层…

【vmware】虚拟机固定ip和网络配置

废话不多说&#xff0c;直接干货 桥接模式不多说&#xff0c;动态ip&#xff0c;一般一键下一步就可 本文主要讲 NAT模式下 静态IP设置及公网问题 创建虚拟机 查看ip ip a 或者 ifconfig 设置静态ip 1.设置虚拟机网络 点击上图中NAT设置&#xff0c;配置网关IP&#xff08;vmv…

Vue学习计划-Vue2--VueCLi(四)组件传值和自定义事件

1. 组件传值 组件化编码流程&#xff1a; 拆分静态组件&#xff1a;组件要按照功能点拆分&#xff0c;命名不要与html元素冲突实现动态组件&#xff1a;考虑好数据的存放位置&#xff0c;数据是一个组件在用&#xff0c;还是一些组件在用&#xff1a; 一个组件在用&#xff0c…

蓝桥杯专题-真题版含答案-【排序法 - 改良的选择排序】【插补搜寻法】【稀疏矩阵】【欧拉与鸡蛋】

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

PMP项目管理 - 质量管理

系列文章目录 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. PMP项目管理 - 质量管理 系列文章目录一、规划质量管理 - 关注工作需要达到的质量二、管理…

【golang/g3n】3D游戏引擎G3N的windows安装与测试

目录 说在前面安装测试 说在前面 操作系统&#xff1a;win 11go version&#xff1a;go1.21.5 windows/amd64g3n版本&#xff1a;github.com/g3n/engine v0.2.0其他&#xff1a;找了下golang 3d相关的库&#xff0c;目前好像就这个比较活跃 安装 按照官方教程所说&#xff0c;…

linux 开机启动流程

1.打开电源 2.BIOS 有时间和启动方式 3.启动Systemd 其pid为1 4.挂载引导分区 /boot 5.启动各种服务 如rc.local

Ubuntu 常用命令之 ls 命令用法介绍

Ubuntu ls 命令用法介绍 ls是Linux系统下的一个基本命令&#xff0c;用于列出目录中的文件和子目录。它有许多选项可以用来改变列出的内容和格式。 以下是一些基本的ls命令选项 -l&#xff1a;以长格式列出文件&#xff0c;包括文件类型、权限、链接数、所有者、组、大小、最…

持续集成交付CICD:Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前后端应用

目录 一、实验 1.部署Ansible自动化运维工具 2.K8S 节点安装nginx 3.Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前后端应用 二、问题 1.ansible安装报错 2.ansible远程ping失败 3. Jenkins流水线通过ansible命令直接ping多台机器的网络状态报错 一、实验 …

C语言:猜数字游戏

#include<stdio.h> #include<time.h> #include<stdlib.h> void menu() {printf("********************************\n");printf("****** 1.开始 2.退出 ******\n");printf("********************************\n"); } voi…

Swin-Transformer 在图像识别中的应用

1. 卷积神经网络简单介绍 图像识别任务主要利用神经网络对图像进行特征提取&#xff0c;最后通过全连接层将特征和分类个数进行映射。传统的网络是利用线性网络对图像进行分类&#xff0c;然而图像信息是二维的&#xff0c;一般来说&#xff0c;图像像素点和周围邻域像素点相关…

2机5节点系统潮流MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 电力系统潮流计算是电力系统最基本的计算&#xff0c;也是最重要的计算。所谓潮流计算&#xff0c;就是已知电网的接线方式与参数及运行条件&#xff0c;计算电力系统稳态运行各母线电压、各支路电流、功率及…

接口自动化测试实操【设置断言思路】

1 断言设置思路 这里总结了我在项目中常用的5种断言方式&#xff0c;基本可能满足90%以上的断言场景&#xff0c;具体参见如下脑图&#xff1a; 在这里插入图片描述 下面分别解释一下图中的五种思路&#xff1a; 1&#xff09; 响应码 对于http类接口&#xff0c;有时开发人…

Spring AOP 和 Spring Boot 统一功能处理

文章目录 Spring AOP 是什么什么是 AOPAOP 组成切面&#xff08;Aspect&#xff09;连接点&#xff08;Join Point&#xff09;切点&#xff08;Pointcut&#xff09;通知&#xff08;Advice&#xff09; 实现 Spring AOP添加 Spring AOP 框架支持execution表达式定义切面、切点…

Docker构建镜像时空间不足:/var/lib/docker,no space left on device

背景 在一次更新业务服务功能后&#xff0c;重新在服务器上构建微服务镜像&#xff0c;在构建镜像时报错空间不足&#xff1a; /var/lib/docker, no space left on device 赶紧用 df -h 看了下磁盘使用情况&#xff0c;果然&#xff0c; devicemapper 已经满了。。由于需要紧急…

使用Pytorch从零开始构建LoRA

引言 在这篇博文中&#xff0c;我将向大家展示如何使用Pytorch从头开始构建 LoRA。LoRA 是Low-Rank Adaptation或Low-Rank Adapters的缩写&#xff0c;它提供了一种高效且轻量级的方法来微调预先存在的语言模型。这包括BERT和RoBERTa等掩码语言模型&#xff0c;以及GPT、Llama…

基于循环神经网络长短时记忆(RNN-LSTM)的大豆土壤水分预测模型的建立

Development of a Soil Moisture Prediction Model Based on Recurrent Neural Network Long Short-Term Memory in Soybean Cultivation 1、介绍2、方法2.1 数据获取2.2.用于预测土壤湿度的 LSTM 模型2.3.土壤水分预测的RNN-LSTM模型的建立条件2.4.预测土壤水分的RNN-LSTM模型…

蓝桥杯专题-真题版含答案-【三角螺旋阵】【干支记年法】【异或加密法】【金字塔】

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

内网渗透测试基础——Windows PowerShell篇

内网渗透测试基础——Windows PowerShell篇 1. Windows PowerShell基础 Windows PowerShell是一种命令行外壳程序和脚本环境&#xff0c;它内置在每个受支持的Windows版本中&#xff08;Windows7、Windows Server 2008 R2及更高版本&#xff09;&#xff0c;为Windows命令行使…

怎么使用会声会影?2024年最新使用会声会影的具体步骤

一听说视频剪辑我们就不由得联想到电影、电视等一些高端的视频剪辑技术&#xff0c;大家都觉得视频剪辑是一个非常复杂而且需要很昂贵的设备才可以完成的技术活&#xff0c;这对很多“门外汉”来说都可望而不可及。实际上&#xff0c;使用会声会影剪辑视频不仅是很多人都可以操…