【HAL库】STM32CubeMX开发----STM32F407----CAN通信实验

news2024/11/18 17:28:56

STM32CubeMX 下载和安装 详细教程
【HAL库】STM32CubeMX开发----STM32F407----目录


前言

本次实验以 STM32F407VET6 芯片为MCU,使用 25MHz 外部时钟源。
CAN通信波特率为 500K bps。
CAN通信引脚MCU引脚 对应关系如下:

CAN通信引脚MCU引脚
TXPB9
RXPB8

一、使用STM32CubeMX----新建CAN通信工程

步骤1:打开 STM32CubeMX 软件

具体 STM32CubeMX 界面如下:
在这里插入图片描述

步骤2:选择 从MCU开始我的项目

在这里插入图片描述

步骤3:选择MCU芯片

我们本次实验选择 STM32F407VET6 芯片做 MCU
在这里插入图片描述

进入工程编辑,具体界面如下:

在这里插入图片描述

步骤4:设置烧写方式为 SWD模式

这一步必须选择一种烧写方式,否则烧写一次程序后,芯片中就没法再次烧写程序了。需要硬件重启才可以重新烧写程序。

STM32烧写程序连接方式详解

在这里插入图片描述

步骤5:设置时钟源

设置外部晶振为芯片系统时钟源。
在这里插入图片描述

步骤6:设置时钟

STM32F407 时钟最大频率为 168M
在这里插入图片描述

步骤7:CAN通信配置

1.选择引脚

CAN通信引脚选择如下表:

CAN引脚MCU引脚1MCU引脚2MCU引脚3
CAN1_RXPA11PB8PD0
CAN1_TXPA12PB9PD1
CAN2_RXPB5PB12/
CAN2_TXPB6PB13/

我们这次选择:CAN1通信,PB8,PB9为通信引脚。
具体操作如下:

在这里插入图片描述

鼠标左键点击引脚,选择CAN通信功能。

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

最后结果如下:

在这里插入图片描述

2.配置参数

本次实验的APB1时钟频率 = 42MHz,在 步骤6设置时钟 中有介绍。
CAN波特率 = APB1时钟频率 / Prescaler / (1 + BS1 + BS2)

CAN波特率APB1时钟频率PrescalerBS1BS2
500KBPS42MHz792

具体操作如下:
在这里插入图片描述

3. 中断配置

勾选CAN通信接收中断RX0
在这里插入图片描述

步骤8:项目编辑

在这里插入图片描述

步骤9:代码生成编辑

在这里插入图片描述

步骤10:点击 GENERATE CODE 生成代码

在这里插入图片描述
新建的工程,已经生成,接下来就是对工程代码的编辑。

二、使用keil5----编辑程序

想要使用keil5打开工程,需要电脑先安装 keil5编译环境,具体操作流程。
可以点击下方文章链接:Keil5编译环境搭建流程

1. CAN相关HAL库函数说明

//开启CAN通讯
HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan);
//关闭CAN通讯	
HAL_StatusTypeDef HAL_CAN_Stop(CAN_HandleTypeDef *hcan);	
//进入休眠模式
HAL_StatusTypeDef HAL_CAN_RequestSleep(CAN_HandleTypeDef *hcan);
//从休眠模式中唤醒
HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef *hcan);	
//检查是否成功进入休眠模式
uint32_t HAL_CAN_IsSleepActive(CAN_HandleTypeDef *hcan);	
//向 Tx 邮箱中增加一个消息,并且激活对应的传输请求
HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox);	
//请求发送中断传输
HAL_StatusTypeDef HAL_CAN_AbortTxRequest(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes);	
//获取空闲Tx邮箱的数量
uint32_t HAL_CAN_GetTxMailboxesFreeLevel(CAN_HandleTypeDef *hcan);
//检查是否有传输请求在指定的 Tx 邮箱上等待
uint32_t HAL_CAN_IsTxMessagePending(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes);	
//如果启用时间触发通信模式,则返回发送的Tx消息的时间戳。
uint32_t HAL_CAN_GetTxTimestamp(CAN_HandleTypeDef *hcan, uint32_t TxMailbox);
//从Rx FIFO区域获取CAN帧到消息
HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[]);
//返回Rx FIFO填充水平
uint32_t HAL_CAN_GetRxFifoFillLevel(CAN_HandleTypeDef *hcan, uint32_t RxFifo);

2. CAN通信配置流程

STM32CubeMX生成CAN通信工程程序后,还需要做以下配置,才能实现CAN收发功能。
(1)配置过滤器
(2)启动CAN外围设备
(3)激活CAN接收中断
具体程序如下:

void User_CAN1_Init(void)
{
 /*配置CAN过滤器*/
  CAN_FilterTypeDef FilterConfig;
 
  FilterConfig.FilterBank = 0;         //过滤器组号
  FilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;	//过滤模式:屏蔽位模式--CAN_FILTERMODE_IDMASK,列表模式--CAN_FILTERMODE_IDLIST
  FilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;	//过滤器位宽:32位
  FilterConfig.FilterIdHigh = 0x0000;               //32位ID
  FilterConfig.FilterIdLow = 0x0000;
  FilterConfig.FilterMaskIdHigh = 0x0000;           //32位MASK
  FilterConfig.FilterMaskIdLow = 0x0000;
  FilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;//过滤器0关联到FIFO0
  FilterConfig.FilterActivation = ENABLE;          //激活滤波器0
  FilterConfig.SlaveStartFilterBank = 14;		  //单CAN此参数无意义
  //过滤器配置
  if (HAL_CAN_ConfigFilter(&hcan1, &FilterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  //启动CAN外围设备
  if(HAL_CAN_Start(&hcan1) != HAL_OK) 
  {
    Error_Handler();
  }
  //激活CAN接收中断
  if (HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
  {
    Error_Handler();
  }
}

3. CAN通信----发送

CAN总线通信发送配置流程

  1. 写入标识符
  2. 写入标识符类型标准帧/扩展帧
  3. 写入帧类型远程帧/数据帧
  4. 写入数据长度
  5. 写入数据
  6. 发送数据

具体程序如下:

void CAN1_TX_Data(void)
{
	CAN_TxHeaderTypeDef	TxHeader;      
	uint8_t TX_data[8]={0,0,0,0,0,0,0,0};
	
	TxHeader.StdId = 0;							//标准标识符(11位)
	TxHeader.ExtId = 0x12345678; 		//扩展标识符(29位)
	TxHeader.IDE = CAN_ID_EXT ;			//扩展帧
	TxHeader.RTR = CAN_RTR_DATA;		//数据帧
	TxHeader.DLC = 8;								//数据个数
	TxHeader.TransmitGlobalTime = DISABLE;
	
	TX_data[0] = 0x11;
	TX_data[1] = 0x22;
	TX_data[2] = 0x33;
	TX_data[3] = 0x44;
	TX_data[4] = 0x55;
	TX_data[5] = 0x66;
	TX_data[6] = 0x77;
	TX_data[7] = 0x88;
	
	uint32_t TxMailbox;
	
	HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TX_data, &TxMailbox);
}

4. CAN通信----接收

CAN总线通信接收配置流程

  1. 进入CAN总线接收中断回调函数
  2. 从Rx FIFO区域获取数据
  3. 解析接收数据
  4. 实现对应功能

具体代码如下:

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

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

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

相关文章

虹科教您 | 虹科Automation softPLC入门操作指南(2)——子程序和用户自定义功能块 UDFB

虹科KPA Automation softPLC是为Linux、Xenomai、INtime、Windows等实时操作系统开发PLC的编程环境,适合需要使用IEC61131-3和PLCopen标准的控制技术和进行PLC编程的用户。本篇文章将帮助您创建和使用IEC语言开发的函数和功能块。 Automation softPLC Studio 命名规…

kettle 9.2源码打包和idea环境启动及常见错误

一:源码打包 这里为什么是kettle 9.2,因为kettle 9.3需要jdk11 这里直接去下载kettle的源码,tag9.2.0.4-R。这里需要自己搭建一个nexus仓库,因为有些包从kettle的仓库里面下载不下来。 nexus新建仓库代理, 记得加到public里面去 …

学术界or工业界,高校博后转行大厂工程师心得!

8本电子书免费送给大家,见文末。 导读:以下是这篇文章是一位 七月在线 学员的的学习和面试经历的分享,现将学员学习和面试心得分享给大家,祝大家都能有好的offer。 1 个人情况 我之前在高校做博后,现在转行到大厂做…

数据库的基本操作(7)

在这一篇博客中我将对数据库进行一个结尾,这将是关于数据库基本内容的结尾。 首先我们来简单总结一下前面的内容: 前面主要讲了Mysql中的索引和事务,这是面试必考的内容。 索引,怎么理解索引呢? 1.索引存在的意义&…

通用汽车在华加速推出智能电动车型

到2025年底前,推出超过15款基于奥特能平台打造的电动车型基于奥特能平台的雪佛兰FNR-XE纯电概念车全球首发通用汽车全新“软件定义汽车”平台将于明年正式推出近日,通用汽车中国在上海举办了“2022科技展望日”,展示了其在Ultium奥特能全球电…

IE高级配置中支持的SSL/TLS协议对应注册表值

一、手动勾选"Internet选项->高级->安全->使用TLS 1.2" 二、以编程方式勾选"Internet选项->高级->安全->使用TLS 1.2" 1.注册表值SecureProtocols对应的含义 注册表的路径为:HKEY_CURRENT_USER\Software\Microsoft\Windows…

【第六部分 | JavaScript高级】2:函数高级

目录 【第二章】函数进阶 | (复习)函数声明 | 函数也是对象 | 函数的this指向 | 改变函数this的指向 | 函数的“严格模式” | 闭包 | 浅拷贝和深拷贝 【第二章】函数进阶 | (复习)函数声明 | 函数也是对象 Java中的方法好…

Android基础二:常见的几种组件

关注我,会持续发布关于Android学习的内容! 文章目录 前言 一、MaterialButton 二、MaterialButtonToggleGroup 三、TextView 文本组件 四、ImageView控件 总结 前言 本节我们来学习安卓(Android)的几种常用的组件,包括…

PTA题目 装睡

你永远叫不醒一个装睡的人 —— 但是通过分析一个人的呼吸频率和脉搏,你可以发现谁在装睡!医生告诉我们,正常人睡眠时的呼吸频率是每分钟15-20次,脉搏是每分钟50-70次。下面给定一系列人的呼吸频率与脉搏,请你找出他们…

VMware虚拟机安装ubuntu-16.04.5详细教程

不是每一位程序员都必须玩过linux,现在大多数服务器都是linux系统的,很多生产上的框架和工具都是安装在服务器上的,而且有不少大公司都要求熟悉在linux上开发,因此小编个人觉得大家有必要去了解一下linux(现在大部分服…

vue.js毕业设计,基于vue.js前后端分离图书购物商城系统设计与实现(H5移动项目)

功能介绍 【后台管理员功能】 会员列表:查看所有注册会员信息,支持删除 录入资讯:录入资讯标题、内容等信息 管理资讯:查看已录入资讯列表,支持删除和修改 广告设置:上传图片和设置小程序首页轮播图广告地…

RK3588-EDGE Ubuntu搭建HTTP服务器

一:开发环境 RK3588-EDGE版本根据指导文档开发环境需要Ubuntu18.04及以上。 本次选择在虚拟机中安装Ubuntu20.04进行开发。 二:安装Apache2 sudo apt-get install apache2 安装成功后配置文件位于“/etc/apache2 ” 其次在“/var/www/html”目录下会生成index.html文件…

mysql 多版本冲突安装(5..5和5.7)

1.我先装好了了5.5但是发现版本过低,需要重新装5.7(所以只记录5.7的安装过程) zip版的5.7,先解压 创建my.ini文件 [mysqld] port 3306 basedirC:\D\mysql-5.7.29-winx64datadirC:\D\mysql-5.7.29-winx64/data max_connections2…

视频编解码 — 帧内预测

目录 帧内预测 块大小 帧内预测模式 4x4 亮度块的帧内预测模式(9种) 16x16亮度块的帧内预测模式 8x8色度块的帧内预测模式 帧内预测模式的选择 率失真优化 帧内预测 一张图像中相邻像素的亮度和色度信息是比较接近的,并且亮度和色度…

【windows】实战部署一(安装)SVNserver服务端+SVNclient客户端

1、环境准备 下载SVNserver https://www.visualsvn.com/server/download/ 下载SVNclient https://tortoisesvn.net/downloads.html 语言包位置: 2、安装SVNserver 1、下载后运行msi文件: 2、点击Next下一步: 3、勾选同意,点…

雷达SAR成像仿真的应用(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

window 下兼容多各低版本的chrome测试

分享我做前端浏览器版本兼容测试遇到Chrome不能多版本共存,存在高版本覆盖低版本问题的解决方案,这个方法不影响Windows系统内已安装的Chrome下载你想要的chrome版本,我是在这里找寻下载版本的:https://www.chromedownloads.net/c…

大数据生态圈及分布式文件系统HDFS实践part2

前言 问题引入 (这是以前讲课的时候,给学生准备的一些问题,大家可以思考一下,对理解HDFS很有帮助) 1、如果一个文件中有10个数值(一行一个,并且都是可以用int来度量), …

关于我在uni-app练手中遇到的坑

目录 页面层级结构的加载和回退 filePath编码 对象的深度克隆 弹幕的加载 ​编辑 uni-app内置浏览器加载视频失败 后台报错 java.io.IOException: 你的主机中的软件中止了一个已建立的连接 安卓里遍历uni-list-item错误 手机自带浏览器无法加载视频 乱码问题 video中…

陆地卫星计划:卫星图像数据和波段介绍

陆地卫星计划:卫星图像数据和波段 学分:美国地质调查局(地球上陆地卫星8号图解) 陆地卫星项目:超过40年的图像采集 想象一下,能够在任何给定的地点,在任何给定的时间回顾四十年,并…