STM32-Arduino编程 CAN总线通信

article/2025/9/22 21:54:59

STM32-Arduino编程 CAN总线通信

  • 环境说明
  • 使用Arduino开发STM32原因
  • 直接开始操作

环境说明

开发软件:vscode+PlatformIO
操作系统:win10
开发板:STM32F103C8T6
CAN总线通信模块:TJA1050

使用Arduino开发STM32原因

STM32开发比较常用的软件有Keil和STM32Cube,但是用过的同学都应该发现这两款软件对于新手不怎么友好,需要花费很长的时间才能做到入门。特别是在开发一些比较复杂的程序时,比如植入freertos,安排几个任务,能把人给折磨死。与Keil和STM32Cube相同的的是,STM32-Arduino也是采用的库函数开发,并不存在低人一等的说法。当然需要承认的是相比于寄存器开发的程序还是要差一点的。STM32-Arduino在库函数得到基础上进一步的封装,可以大大的降低程序中出现的配置出错的问题,让新手的同学可以更快的开发出高质量的STM32的程序。

直接开始操作

首先打开platformIO,创建工程。
在这里插入图片描述
工程名称随便,要设定好对应的开发板。我这里使用的是开发板STM32F103C8T6,至于为什么要用这个开发板,主要是因为穷。如果需要使用其他的板子,在创建工程时设定好对应的板子即可。
在这里插入图片描述
工程创建好之后,在Libraries中搜索TJA1050,便可以找到eXoCAN库,将其加入到STM32CAN的工程中。
在这里插入图片描述

eXoCAN的库中找到example文件夹中找到例程,将其中一个例程复制到main.cpp中,我复制的是bpCanBlink.ino中的例程。加入串口通信的程序将CAN总线通信的信息通过串口输出出来,最终程序如下。

#include <Arduino.h>/* bpCanBlink.ino                                                                     4/24/20C:\Users\jhe\Documents\PlatformIO\mySTM32LIBS\eXoCAN\bpCanBlink.cppThis simple example requires two STM32f103 boards.  One of the boards is loadedwith the 'frame' using txMsg = 0x069.  The second board gets loaded with the secondframe where tsMsgID = 0x005 by uncommenting that section.On each board connect CAN default RX and TX pins(11,12) together.  Then connectthe boards together: +5V, Gnd., and Can TX/RX.When a board receives a CAN message it toggles its LED.  One board sends a messageevery second and the other every five seconds.RAM:   904 bytes Flash: 12988 bytes  working                                                                            4/25*/
#include <arduino.h>
#include <eXoCAN.h>#define bluePillLED PC13int txMsgID = 0x069;
uint8_t txData[8]{0x00, 0x01, 0x23, 0x45, 0xab, 0xcd, 0xef, 0xff};
uint8_t txDataLen = 8;
uint32_t txDly = 5000; // mSecint id, fltIdx;
uint8_t rxbytes[8];
eXoCAN can;void setup()
{Serial.begin(115200);can.begin(STD_ID_LEN, BR250K, PORTA_11_12_WIRE_PULLUP); // 11b IDs, 250k bit rate, no transceiver chip, portA pins 11,12can.filterMask16Init(0, 0, 0x7ff, 0, 0);                // filter bank 0, filter 0: don't pass any, flt 1: pass all msgspinMode(bluePillLED, OUTPUT);
}uint32_t last = 0;
void loop()
{if (millis() / txDly != last)             // tx every txDly{last = millis() / txDly;can.transmit(txMsgID, txData, txDataLen);}if (can.receive(id, fltIdx, rxbytes) > -1) // poll for rx{digitalToggle(bluePillLED);Serial.println(id);}}

测试硬件,两单片机的程序相同,其中TJA1050的RX接PA11,TX接PA12,不要想当然的把TJA1050接到一般的串口上。
在这里插入图片描述
测试结果,可见串口接收的程序将CAN总线通信的Id打印出来,而发送的Id为0x069,转成10进制便是105,与串口打印的结果一致。
在这里插入图片描述
下面说一下感受,CAN总线通信相比于串口通信和SPi通信是具有明显的优势的,其在构建网络的过程中不需要一个主机来进行数据的交换,但发送的数据是共享的容易出现信息的泄露。所以使用前综合考虑它的利弊。


http://chatgpt.dhexx.cn/article/jeeEtQLn.shtml

相关文章

ESP8266-Arduino编程实例-QRE1113红外反射传感器

QRE1113红外反射传感器 1、QRE1113介绍 QRE1113 具有易于使用的模拟输出,它会根据反射回传感器的红外光量而有所不同。 QRE1113 IR 反射传感器由两部分组成 - 一个 IR 发射 LED 和一个 IR 敏感光电晶体管。 当 VCC 和 GND 引脚通电时,传感器内部的 IR LED 将亮起。 由于深…

ESP8266-Arduino编程实例-MLX90614红外测温传感器驱动

MLX90614红外测温传感器驱动 1、MLX90614传感器介绍 MLX90614 是一款非接触式红外测温仪,测量范围为 -70 至 +380 摄氏度。 MLX90614有以下特性: 体积小,成本低安装在带有两种引脚的分线板上用于 I2C 接口的 10k 上拉电阻,带有可选的焊接跳线在宽温度范围内进行工厂校准…

STM32-Arduino编程 串口通信

STM32-Arduino编程 串口通信 环境说明使用Arduino开发STM32原因直接开始操作 环境说明 开发软件&#xff1a;vscodePlatformIO 操作系统&#xff1a;win10 开发板&#xff1a;STM32F103C8T6 其他硬件&#xff1a;USB转TTL模块&#xff08;需要安装对应驱动&#xff09; 使用A…

ESP8266-Arduino编程实例-金属触摸传感器驱动

金属触摸传感器驱动 1、金属触摸传感器介绍 KY-036金属触摸传感器模块采用KRS13达林顿NPN晶体管,其信号由电路部分控制,电路部分集成LM393,内部有两个比较器。 当触摸弯曲在晶体管上的裸线(由晶体管的基极表示)时,环境的 50 Hz 信号被注入到高增益放大器中。放大器的输…

Arduino编程语言之setup()和loop()

Arduino编程语言之setup()和loop() setup() 当程序开始执行时&#xff0c;将调用setup()函数&#xff0c;使用此函数 ①用来初始化变量 ②管脚模式 ③调用库函数 注意&#xff1a;setup()函数将只运行一次。 例子&#xff1a; int ledPin 13; void setup() { pinMode(ledP…

esp8266使用Arduino编程实现自动浇水、OTA升级功能

创作前情&#xff1a; 上海疫情已有一段时间&#xff0c;从三月初算起来已过了一个多月&#xff0c;当时用了泡沫箱种了些小香葱&#xff0c;这几天把它搬到了室外阳台&#xff0c;由于浇水不方便&#xff0c;想着做一个自动浇水的设备。 实现目的&#xff1a; 可以远程控制浇…

ESP8266-Arduino编程实例-MPL3115A2压力传感器驱动

MPL3115A2压力传感器驱动 1、MPL3115A2介绍 MPL3115A2 是一款紧凑型压阻式绝对压力传感器,具有 I2C 数字接口。 MPL3115A2 具有 20 kPa 至 110 kPa 的宽工作范围,该范围涵盖了地球上的所有表面高度。 MEMS 使用片上温度传感器进行温度补偿。 压力和温度数据被馈送到高分辨率…

ESP8266-Arduino编程实例-AHT20温湿度传感器驱动

AHT20温湿度传感器驱动 1、AHT20介绍 AHT20作为新一代温湿度传感器,在尺寸和智能方面树立了新标准。 它嵌入在适合回流焊接的双排扁平无铅封装中,底部为 3 x 3 mm,高度为 1.0 mm。 该传感器以标准IAHT20输出校准后的数字信号,作为新一代温湿度传感器,在尺寸和智能方面树…

ESP8266-Arduino编程实例-中断

中断 本文将演示如何使用 ESP8266 NodeMCU 的中断和定时器。 中断检测 GPIO 状态的变化且无需不断检查其当前值。通过使用中断,当检测到更改时,会触发事件(调用函数)。 在实例中,使用 PIR 运动传感器检测运动:当检测到运动时,ESP8266 会启动一个定时器并打开 LED 预定…

ESP8266-Arduino编程实例-MLX90393磁场传感器驱动

MLX90393磁场传感器驱动 1、MLX90393介绍 MLX90393 磁场传感器可以在运行时重新编程为不同的模式和不同的设置。 该传感器使用 Melexis 专有的 Triaxis 技术提供与沿 XYZ 轴感应的磁通密度成比例的 16 位输出,还提供温度输出信号。 这些数字值可通过 I2C 和 SPI 获得,其中 …

arduino新手入门详细教程系列之【Ⅱ:arduino编程环境配置】

目录 一&#xff09;下载Arduino IDE 二&#xff09;安装驱动 三&#xff09;认识Arduino IDE 四&#xff09;下载一个Blink程序 五&#xff09;blink程序 更多优质文章请关注博主&#xff1a; 沄边小卖部的博客_CSDN博客-笔记,计算机类相关,《初级会计实务》考试学习分享…

ESP8266-Arduino编程实例-PWM

PWM 本文将演示如何使用ESP8266 NodeMCU生成PWM信号,通过随时间改变占空比来调节 LED 亮度。 ESP8266 GPIO 可以设置为输出 0V 或 3.3V,但在0~3.3V之间不能输出任何电压。 尽管如此,可以使用脉宽调制 (PWM) 输出“假”中电平电压,从而产生不同级别的 LED 亮度的方式。 如…

Arduino编程基础与常用函数(详细)解析

Arduino编程基础 关键字&#xff1a; if、if…else、for、switch、case、while、do…while、break、continue、return、goto。 语法符号&#xff1a;每条语句以“&#xff1b;”结尾&#xff0c;每段程序以“{}”括起来。 数据类型&#xff1a; boolean、 char、 int、 unsign…

Arduino入门-Arduino编程语言入门教程

随着社会的发展&#xff0c;越来越多的中小学生、老师、创客们、设计师、艺术家等都在玩Arduino,那Arduino编程语言入门难吗&#xff1f;我们都知道Arduino使用C/C编写程序&#xff0c;虽然C兼容C语言&#xff0c;但这是两种语言&#xff0c;C语言是一种面向过程的编程语言&…

arduino c语言pdf,arduino编程从零开始

arduino编程从零开始是一款Arduino新手编程入门手册,由Simon Monk编著,刘椮楠翻译,全书揭示了arduino的软件特性,介绍了如何在arduino上用c语言编写能稳定运行的sketch。本书的重点是对Arduino编程,作者将介绍怎样简单并有趣地对Arduino编程,避免使用生涩难瞳的代码而让制…

小白入门Arduino,一步一图搭建开发环境

目录 1、Arduino 2、环境搭建 2.1 下载软件&#xff1a; 2.2 ide安装 2.3 软件试用 2.5 代码解读 3、总结 最近有机会接触到物联网的开发&#xff0c;所以自己学习一下&#xff0c;记录一下。 在查阅了各种资料&#xff0c;对比了下各种难度&#xff0c;资料的丰富程度…

arduino入门1

文章目录 编程并不是一间很难的事&#xff0c;你可这样理解&#xff1a; 在编程中&#xff0c;你就像是一个老板arduino就像是你的员工&#xff0c;你可指挥arduino去做你想让它做的事。当然&#xff0c;要做的事得在员工的工作范围之内。 arduino这位员工就是一块电路板&…

Arduino面向对象编程基础

面向对象编程基础 1.基础概论 面向对象三大特征&#xff1a;继承、封装、多态 2.简单的类和对象 案例&#xff1a;创建Led类 案例01&#xff1a;感受构造函数与析构函数的功能 class Led {public :Led(); //构造函数声明&#xff0c;初始化对象&#xff0c;在创建对象的…

Arduino入门教程

Arduino是一款简单易学的开源电子原型平台&#xff0c;包含硬件&#xff08;各种型号的Arduino板&#xff09;和软件&#xff08;Arduino IDE&#xff09;。它通过各种各样的传感器来感知环境&#xff0c;再通过控制灯光、电机和其他的装置来完成很多自动控制任务&#xff0c;在…

Arduino学习篇,基础入门

什么是arduino? 简单来讲arduino就是通过源代码控制开发板的信号输入输出从而实现对一些电子元件的控制&#xff0c;例如LED灯&#xff0c;蜂鸣器&#xff0c;按键 arduino程序 首先来讲arduino程序是基于C语言&#xff0c;而实现类似对于LED灯和蜂鸣器的简单控制只需简单C语…