STM32 CAN总线通讯

news2024/11/25 6:06:36

 使用STM32的CAN通讯,利用回环模式,按键控制发送CAN数据,中断接收CAN数据并通过串口助手打印出来。

7.2、配置引脚信息

由于每次新建工程都需要配置信息,比较麻烦,好在STM32CubeIDE提供了导入.ioc文件的功能,可以帮我们节省时间。

1.从Serial的项目里导入ioc文件,并命名为CAN。

在Connectivity里找到CAN,并打勾Activated使能CAN外设。

image-20220326121240215

2.根据原理图可知,CAN总线连接的引脚为PB8和PB9,而默认的CAN总线引脚为PA11和PA12,所以需要手动修改CAN总线的引脚为PB8和PB9。

image-20220326122605409

image-20220326122759412

image-20220326122910978

3.设置CAN外设的参数,这里我们设置波特率为1000kbps,模式设置为Loopback。

image-20220326121651092

由于这里只用来测试通讯,所以选择Loopback回环模式(数据自发自收);如果需要连接第三方CAN设备,请选择为Normal常规模式(数据收/发独立)。

image-20220326121936036

4.中断设置里将CAN RX0中断打开,如果不打开中断就无法接收到数据。

image-20220326122355699

核心代码解释

1.在BSP中新建蜂鸣器的驱动库bsp_can.h和bsp_can.c文件。在bsp_can.h中增加以下内容:

/*
 * bsp_can.h
 *
 *  Created on: Mar 7, 2022
 *      Author: Administrator
 */

#ifndef BSP_CAN_H_
#define BSP_CAN_H_

void Can_Init(void);
void Can_Test_Send(void);

#endif /* BSP_CAN_H_ */

2.在bsp_can.c中添加以下内容:

Can_Init():初始化CAN外设相关内容,设置CAN接收过滤器,开启CAN总线通讯。

#include "bsp_can.h"
#include "bsp.h"

// Define related variables  定义相关变量
CAN_TxHeaderTypeDef TxHeader;
CAN_RxHeaderTypeDef RxHeader;
CAN_FilterTypeDef sFilterConfig;


// Initialize the CAN  初始化CAN
void Can_Init(void)
{
    sFilterConfig.FilterBank = 0;
    sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
    sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
    sFilterConfig.FilterIdHigh = 0x0000;
    sFilterConfig.FilterIdLow = 0x0000;
    sFilterConfig.FilterMaskIdHigh = 0x0000;
    sFilterConfig.FilterMaskIdLow = 0x0000;
    sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
    sFilterConfig.SlaveStartFilterBank = 27;
    sFilterConfig.FilterActivation = CAN_FILTER_ENABLE;

    // Setting the CAN Filter  设置CAN过滤器
    if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
    {
        Error_Handler();
    }

    // Start the CAN peripheral  启动CAN
    if (HAL_CAN_Start(&hcan) != HAL_OK)
    {
        Error_Handler();
    }

    // Activate CAN RX notification  启动CAN RX通知
    if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
    {
        Error_Handler();
    }
}


// The test sends data through CAN  测试通过CAN发送数据
void Can_Test_Send(void)
{
	uint8_t TxData[8];
	uint32_t TxMailbox = 0;
	TxHeader.StdId = 0x000F;
	TxHeader.ExtId = 0x00;
	TxHeader.RTR = CAN_RTR_DATA;
	TxHeader.IDE = CAN_ID_STD;
	TxHeader.DLC = 8;
	TxHeader.TransmitGlobalTime = DISABLE;

	for (int i = 0; i < 8; i++)
	{
		TxData[i] = 1 << i;
	}
	printf("CAN Send:%02X %02X %02X %02X %02X %02X %02X %02X \n",
			TxData[0], TxData[1], TxData[2], TxData[3],
			TxData[4], TxData[5], TxData[6], TxData[7]);
    // Send Data  发送数据
    if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox) != HAL_OK)
    {
        Error_Handler();
    }
}


// CAN receives interrupt callbacks  CAN接收中断回调
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
	if (hcan->Instance == CAN1)
	{
		uint8_t RxData[8];
		if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
		{
			Error_Handler();
		}
		else
		{
			printf("CAN Receive:%02X %02X %02X %02X %02X %02X %02X %02X \n",
					RxData[0], RxData[1], RxData[2], RxData[3],
					RxData[4], RxData[5], RxData[6], RxData[7]);
		}
	}
}

3.为了测试发送数据,新建Can_Test_Send()函数把数据通过CAN发送出去,并打印到串口助手上。如果需要修改发送的数据,在发送前修改TxData数组即可。

4.CAN接收中断回调函数,将接收到CAN数据通过串口打印出来。此函数名称不能修改,否则无法调用到此函数。

5.在BSP初始化中,调用Can_Init()函数初始化CAN外设。

//bsp.c
#include "bsp.h"

// LED显示当前运行状态,每10毫秒调用一次,LED灯每200毫秒闪烁一次。
// The LED displays the current operating status, which is invoked every 10 milliseconds, and the LED blinks every 200 milliseconds.  
void Bsp_Led_Show_State_Handle(void)
{
	static uint8_t led_count = 0;
	led_count++;
	if (led_count > 20)
	{
		led_count = 0;
		LED_TOGGLE();
	}
}


// The peripheral device is initialized  外设设备初始化
void Bsp_Init(void)
{
	Can_Init();
	USART1_Init();
	Beep_On_Time(50);
	printf("start\n");
}


// main.c中循环调用此函数,避免多次修改main.c文件。
// This function is called in a loop in main.c to avoid multiple modifications to the main.c file
void Bsp_Loop(void)
{
	// Detect button down events   检测按键按下事件
	if (Key1_State(KEY_MODE_ONE_TIME))
	{
		Beep_On_Time(50);
		Can_Test_Send();
	}

	Bsp_Led_Show_State_Handle();
	// The buzzer automatically shuts down when times out   蜂鸣器超时自动关闭
	Beep_Timeout_Close_Handle();
	HAL_Delay(10);
}

6.在按键按下后,增加发送CAN数据的功能。

实验效果

烧录程序后,LED灯每隔200毫秒闪一次,将扩展板通过micro-USB数据线与电脑连接后并打开串口助手(具体参数如下图所示),每按一次按键,蜂鸣器都会响50毫秒,可以看到串口助手会显示CAN发送的数据以及CAN接收到的数据。

image-20220326141649900

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

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

相关文章

阿里云PAI主机网页访问测试

笔者使用的阿里云平台PAI主机(首次使用免费三个月额度)&#xff0c;由于其默认不设置公网IP&#xff0c;所以在该主机上启动HTTP服务后无法访问测试。 这里使用ssh来作隧道穿透&#xff0c;首先需要配置ssh。 云主机配置ssh 1. 修改root账号密码 在云主机上执行 passwd ro…

图片转pdf,图片转pdf在线转换,在线图片转pdf

图片转PDF&#xff0c;听起来似乎是一个简单的操作&#xff0c;但实际上&#xff0c;它涉及到许多细节和技巧。有时候我们需要将图片转换为PDF格式&#xff0c;以便于分享、打印或保存。那么&#xff0c;如何将图片转换成PDF呢&#xff1f;接下来&#xff0c;我将为您详细介绍几…

电脑系统重装怎么操作?分享四个win10重装系统方法

“我遇到了一些笔记本电脑的问题&#xff0c;别人告诉我解决这个问题需要重新安装Win10电脑系统。但我不记得我把光盘放在哪里了&#xff0c;我能否在不丢失文件的情况下重新安装操作系统&#xff1f;电脑系统重装怎么操作&#xff1f;”虽然电脑自带系统中有多种方法可供选择&…

有哪些常用ORM框架

ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;是一种编程技术&#xff0c;它允许开发者使用面向对象的编程语言来操作关系型数据库。ORM的主要目的是将数据库中的数据表映射到编程语言中的对象&#xff0c;从而使得开发者可以使用对象的方式来…

Docker之overlay2的迁移

原因 docker默认将文件及其容器放置在了系统盘的挂载区内&#xff0c;如果长期使用会发现系统挂载区被overlay2挤爆了,因此在一开始我们将其迁移在大容量外挂磁盘上,就可以避免系统盘被挤爆,放心使用. 具体操作 # 停止容器 systemctl stop docker# 修改容器配置&#xff0c…

Spring+SpringMVC介绍+bean实例化+依赖注入实战

Spring介绍 Spring是一个轻量级的Java 开发框架&#xff0c;核心是IOC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09; Spring解决了业务层&#xff08;Service包&#xff09;与其他各层&#xff08;表现层&#xff0c;包括Model&#xff0c;Vie…

无版权图片素材搜索网站,解决无版权图片查找问题

在数字内容创作领域&#xff0c;图片素材的选择至关重要。一张高质量、合适的图片不仅能够吸引读者的眼球&#xff0c;还能有效传达信息。然而&#xff0c;找到既免费又无版权限制的图片素材并非易事。小编将为大家介绍几个解决这一问题的无版权图片素材搜索网站&#xff0c;这…

程序猿大战Python——面向对象——对象属性

什么是属性 目标&#xff1a;了解什么是属性&#xff1f; 在现实生活中&#xff0c;属性就表示固有特征&#xff0c;比如&#xff1a;一辆小轿车的属性有轮胎数、颜色、品牌等。 仔细观察后会发现&#xff0c;属性可以简单理解为与生俱来的特征&#xff0c;比如一个人的姓名、年…

Lazada API接口——一键获取商品买家评论数据信息

一、引言 在电商领域&#xff0c;买家评论是商品销售中不可忽视的重要因素。它们不仅影响着潜在消费者的购买决策&#xff0c;还为商家提供了宝贵的客户反馈。为了满足商家和数据分析师对买家评论数据的需求&#xff0c;我们特别开发了一款针对Lazada平台的接口&#xff0c;其…

30分钟完成一个AI视频,跑通0到1的过程,包含文生图,图生视频的制作

关注公众号&#xff0c;赠送AI/Python/Linux资料 步骤一&#xff1a;写故事 需要给出故事情节&#xff0c;让kimi首先提供一个提示词模版 提示词输入后&#xff0c;就让kimi开始写故事了 一个完整的故事就出来了 非常好&#xff0c;描述一个IT人的一生是一个宏大的主题&#…

后台管理台字典localStorage缓存删除

localStorage里存放了如以下dictItems_开头的字典数据&#xff0c;localStorage缓存是没有过期时间的&#xff0c;需要手动删除。同时localStorage里还存有其他不需要删除的数据。 这里的方案是遍历localStorage&#xff0c;利用正则和所有key进行匹配&#xff0c;匹配到dict…

【有手就会】图数据库Demo教程,实现《诡秘之主》中的人物关系探索

前言 星环社区版家族于近期发布了单机、30s一键启动的StellarDB图数据库&#xff0c;本篇文章将为用户介绍如何使用开发版StellarDB实现人物关系探索。 友情链接&#xff1a;白话大数据 | 关于图数据库&#xff0c;没有比这篇更通俗易懂的啦 TDH社区版本次发布StellarDB社区…

如何选择合适的半桥栅极驱动芯片?KP8530X,KP85402,KP85211A满足你对半桥栅极驱动一切需求

半桥栅极驱动系列KP8530X&#xff0c;KP85402&#xff0c;KP85211A在功率电子领域展现出卓越的性能和可靠的品质。具备诸多显著优势。首先&#xff0c;半桥栅极驱动系列KP8530X&#xff0c;KP85402&#xff0c;KP85211A拥有出色的耐压性能&#xff0c;可承受高达数百伏的电压&a…

ArcGIS制作规划图卫星影像地图虚化效果

文章目录 一、效果展示二、加载数据三、效果制作四、注意事项一、效果展示 二、加载数据 订阅专栏后,从csdn私信查收实验数据资料,加载ArcGIS制作规划图卫星影像地图虚化效果.rar中的数据,如下所示: 三、效果制作 1. 创建掩膜图层 新建一个矢量图层,因为主要是作图需要…

GNSS边坡监测站

TH-WY1随着科技的飞速发展&#xff0c;各种先进的监测技术不断涌现&#xff0c;为边坡安全监测提供了有力保障。其中&#xff0c;GNSS边坡监测站以其高精度、实时性强的特点&#xff0c;受到了广泛关注。 GNSS边坡监测站&#xff0c;全称为全球导航卫星系统边坡监测站&#xf…

1.接口测试-postman学习

目录 1.接口相关概念2.接口测试流程3.postman基本使用-创建请求&#xff08;1&#xff09;环境&#xff08;2&#xff09;新建项目集合Collections&#xff08;3&#xff09;新建collection&#xff08;4&#xff09;新建模块&#xff08;5&#xff09;构建请求请求URLheader设…

湖南省物联网挑战赛教学平台使用说明文档

1物联网教学平台硬件连接 1.1硬件介绍 1&#xff09;物联网教学平台实验箱 2&#xff09;物联网硬件平台 3&#xff09;无线传感器节点 4&#xff09;智能烧录平台 1.2连线 注&#xff1a;智能烧录平台上的USB接口必须与物联网硬件平台“开关”那一面最右侧USB接口连接 1.3修…

小红书xs-xt解密

在进行小红书爬虫的时候,有一个关键就是解决动态密文的由来 这边用atob对X-S密文进行解密 可以看到他是一个字符串 可以发现他本来是一个json对象,因为加密需要字符串,所以将json对象转化 为了字符串 而在js中,常用JSON.stringify进行json对象到字符串的转化。 这边将JS…

java中atomic(原子包)常用类详解

目录 一、简介 二、分类 2.1 基本类型原子类 2.1.1 AtomicInteger和AtomicLong介绍 2.1.1.1 AtomicInteger常用的API源码和注释 2.1.1.2 AtomicInteger常用API使用案例 2.1.2 AtomicBoolean介绍 2.1.2.1 AtomicBoolean常用API源码和注释 2.1.2.2 AtomicBoolean常用API…

MVC模式中控制器、视图和模型之间的关系如何?

mvc模式将应用程序逻辑与表示层分离&#xff0c;包括控制器、视图和模型三个组件&#xff1a;控制器&#xff1a;协调用户输入&#xff0c;获取模型数据&#xff0c;验证输入&#xff0c;执行业务规则。视图&#xff1a;显示模型数据&#xff0c;不包含业务逻辑。模型&#xff…