当前位置: 首页 > news >正文

基于STM32/GD32的双CAN、一路485开发板

双CAN开发板

  • 双CAN、一路485开发板的设计
    • 开发板配置
    • 器件选型
    • CAN设计
      • 硬件设计
      • 软件设计
    • 485设计
      • 硬件设计
      • 软件设计
    • 其他设计
      • LED硬件
      • 按键硬件
    • PCB板子和实物图
    • 开发板测试视频
    • 其他资料

双CAN、一路485开发板的设计

最近工作经常会出现一些小问题。就想设计一款带CAN的开发板用来测试代码,于是就设计了一款双CAN带一路485的开发板。 此篇文章是关于开发板的设计方案。

开发板配置

  • 双路CAN通信
  • 一路485通信(两路串口可选)
  • 一个EEPROM存储
  • 三个LED指示灯
  • 三个按键
  • 其余所有IO口引出

器件选型

主控采用了国产兆易的GD互联型芯片,有两路CAN通信,CAN采用目前比较流程TJA1057方案。以下是主要的器件选型:

  1. 主控MCU :GD32F105RBT6
  2. CAN芯片:TJA1057T
  3. 485芯片:MAX3485ESA
  4. EEPROM芯片:AT24C128
  5. 电源芯片芯片:ASM1117-3.3V

CAN设计

硬件设计

CAN设计采用TJA1057T设计,由于TJA1057T是5V芯片,需要在Rx到单片机采用一个电压转换电路。为了节省成本,我们采用一个分压电阻,将电压调试到3.3V。设计还并联了一个120欧的匹配电阻,和一个跳线帽串联起来,用户可以通过跳线帽先择是否接入120电阻。这题设计如图所示。
在这里插入图片描述

软件设计

CAN波特率计算:波特率 = APB1频率 / CAN分频 / (BS1 + BS2 +1);
这里初始化采用的是掩码模式,掩码中设置的为1时,报文ID为必须匹配,掩码为0时报文ID为无关紧要。例如ID为:0x18FF1111。当掩码设置为0x1FFF FFFF时。只有接收到0x18FF1111才会通过滤波进入CAN接收中断。当掩码设置为0x1FFFFFFE时,可以接收到0x18FF1110和0x18FF1111。

void SysInit_CAN(void)
{/* CANs configuration */CAN_Config();/* IT Configuration for CAN1 */can_interrupt_enable(CAN0,  ENABLE);can_interrupt_enable(CAN1,  ENABLE);
}
/*CAN初始化*/
void CAN_Config(void)
{uint32_t id ;can_parameter_struct CAN_InitStructure;can_filter_parameter_struct CAN_FilterInitStructure;rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_GPIOB);rcu_periph_clock_enable(RCU_CAN0);rcu_periph_clock_enable(RCU_CAN1);rcu_periph_clock_enable(RCU_AF);/* Configure CAN1 RX pin */gpio_pin_remap_config(GPIO_CAN0_PARTIAL_REMAP, ENABLE);gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_8);gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_10MHZ, GPIO_PIN_12);gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_13);/* Configure CAN1 TX pin *//* CAN1 and CAN2 register init */can_deinit(CAN0);can_deinit(CAN1);/* initialize CAN */CAN_InitStructure.time_triggered = DISABLE;CAN_InitStructure.auto_bus_off_recovery = ENABLE;CAN_InitStructure.auto_wake_up = DISABLE;CAN_InitStructure.auto_retrans = DISABLE;CAN_InitStructure.rec_fifo_overwrite = DISABLE;CAN_InitStructure.trans_fifo_order = DISABLE;CAN_InitStructure.working_mode = CAN_NORMAL_MODE;CAN_InitStructure.resync_jump_width = CAN_BT_SJW_1TQ;CAN_InitStructure.time_segment_1 = CAN_BT_BS1_6TQ;CAN_InitStructure.time_segment_2 = CAN_BT_BS2_1TQ;/* baudrate 250K bps */CAN_InitStructure.prescaler = 6;can_init(CAN0, &CAN_InitStructure);CAN_InitStructure.prescaler = 6;can_init(CAN1, &CAN_InitStructure);/* initialize filter */id = 0x18ffffff;//需过滤的EXT_ID/* CAN0 filter number */CAN_FilterInitStructure.filter_number = 0;/* initialize filter */CAN_FilterInitStructure.filter_mode = CAN_FILTERMODE_MASK;CAN_FilterInitStructure.filter_bits = CAN_FILTERBITS_32BIT;CAN_FilterInitStructure.filter_list_high = (((u32)id <<3)&0xFFFF0000)>>16;;CAN_FilterInitStructure.filter_list_low = (((u32)id <<3)|CAN_FF_STANDARD|CAN_FF_EXTENDED)&0xFFFF;;CAN_FilterInitStructure.filter_mask_high = 0x0000;CAN_FilterInitStructure.filter_mask_low = 0x0000;CAN_FilterInitStructure.filter_fifo_number = CAN_FIFO0;CAN_FilterInitStructure.filter_enable = ENABLE;can_filter_init(&CAN_FilterInitStructure);/* initialize filter */id = 0x18ffffff;//需过滤的EXT_ID/* CAN0 filter number */CAN_FilterInitStructure.filter_number = 15;/* initialize filter */CAN_FilterInitStructure.filter_mode = CAN_FILTERMODE_MASK;CAN_FilterInitStructure.filter_bits = CAN_FILTERBITS_32BIT;CAN_FilterInitStructure.filter_list_high = (((u32)id <<3)&0xFFFF0000)>>16;;CAN_FilterInitStructure.filter_list_low = (((u32)id <<3)|CAN_FF_STANDARD|CAN_FF_EXTENDED)&0xFFFF;;CAN_FilterInitStructure.filter_mask_high = 0x0000;CAN_FilterInitStructure.filter_mask_low = 0x0000;CAN_FilterInitStructure.filter_fifo_number = CAN_FIFO0;CAN_FilterInitStructure.filter_enable = ENABLE;can_filter_init(&CAN_FilterInitStructure);can_interrupt_enable(CAN0, CAN_INT_RFNE0);can_interrupt_enable(CAN1, CAN_INT_RFNE0);
}
/*CAN0接收中断*/
void CAN0_RX0_IRQHandler(void)
{Init_RxMes(&RxMessage);can_message_receive(CAN0, CAN_FIFO0, &RxMessage);CAN0_RXData();
}
/*CAN1接收中断*/
void CAN1_RX0_IRQHandler(void)
{Init_RxMes(&RxMessage);can_message_receive(CAN1, CAN_FIFO0, &RxMessage);CAN1_RXData();
}

485设计

485硬件设计采用了自动收发报文的设计。具体实现方案可以自行百度搜索。

硬件设计

在这里插入图片描述

软件设计

软件就是一般的串口初始化。

/*IO口初始化*/
void usart_init(void)
{rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_AF);rcu_periph_clock_enable(RCU_USART0);gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);usart_deinit(USART0);usart_baudrate_set(USART0, 9600);usart_word_length_set(USART0, USART_WL_8BIT);usart_stop_bit_set(USART0, USART_STB_1BIT);usart_parity_config(USART0, USART_PM_NONE);usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);usart_receive_config(USART0, USART_RECEIVE_ENABLE);usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);usart_enable(USART0);usart_interrupt_enable(USART0, USART_INT_RBNE);nvic_irq_enable(USART0_IRQn,1,2);
}/* retarget the C library printf function to the usart */
int fputc(int ch, FILE *f)
{usart_data_transmit(USART0, (uint8_t) ch);while (RESET == usart_flag_get(USART0, USART_FLAG_TBE));return ch;
}
/*串口0接收中断*/
void USART0_IRQHandler(void)
{uint16_t data;if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){/* receive data */data = usart_data_receive(USART0);usart_data_receive(USART0);}
}

其他设计

LED硬件

硬件LED采用的是共阴极,IO口驱动的话输出高电平LED点亮。
在这里插入图片描述

按键硬件

硬件按键采用的是监测地。配置IO口时要配置为上拉输入。当IO口监测到低电平时表示按键按下。

在这里插入图片描述

PCB板子和实物图

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

开发板测试视频

板子焊接好后,按照如图所示插上相应的跳线帽,通过5VType-C口给模块供电。测试代码固件烧录进去之后,三个LED点亮,其中一个LED0.5HZ频率闪烁。按下按键后,相应的LED灯切换状态。串口波特率为9600,并且每1秒输出Shiboven PCB-018 测试固件 V1.0 CAN测试请使用5VUSB供电。两路CAN波特率都为250k。两路CAN都是250K波特率并每1秒输出一路为:ID0x12345678,另一路为0x17654321

注意:CANH、CANL别接反了。485A、485B也别接反了!!!

双CAN+一路485演示视频演示视频

其他资料

资料包中有硬件软件源码及其他资料。包括一堆CAN资料包。
在这里插入图片描述

相关文章:

基于STM32/GD32的双CAN、一路485开发板

双CAN开发板 双CAN、一路485开发板的设计开发板配置器件选型CAN设计硬件设计软件设计 485设计硬件设计软件设计 其他设计LED硬件按键硬件 PCB板子和实物图开发板测试视频其他资料 双CAN、一路485开发板的设计 最近工作经常会出现一些小问题。就想设计一款带CAN的开发板用来测试…...

快排/堆排/归并/冒泡/

常见的内排序算法 插入排序 直接插入排序 原理&#xff1a;相当于扑克牌变成有序&#xff0c;先拿第一张&#xff0c;把他调节成有序&#xff0c;再拿第二张&#xff0c;与第一张相比找到第二张的位置&#xff0c;再继续拿第三张&#xff0c;以此类推。 void InsertSort(in…...

React基础教程(08):state体验

文章目录 7、state再体验7.1 异步更新状态7.2 同步更新状态方式17.3 同步更新状态方式27.4 betterScroll7.5 列表案例7、state再体验 7.1 异步更新状态 完整代码 import React from "react";export default class App extends React.Component{state = {count:1,}…...

Win10 创建新的桌面2,并实现桌面切换

1. Win10 创建新的桌面2 Win - Tab 2. Win10 桌面切换 Ctrl - Win - ←/→ 我们下期见&#xff0c;拜拜&#xff01;...

MySQL数据库介绍及基础操作

目录&#xff1a; 一.数据库介绍 二.数据库分类 三. 数据库的操作 四. 常用数据类型 五. 表的操作 一.数据库介绍 1.文件保存数据有以下几个缺点: 1.1文件的安全性问题 1.2文件不利于数据查询和管理 1.3文件不利于存储海量数据 1.4文件在程序中控制不方便 为了解决上述问题&…...

【C语言篇】C语言常考及易错题整理DAY2

文章目录 C语言常考及易错题整理选择题编程题至少是其他数字两倍的最大数两个数组的交集图片整理寻找数组的中心下标多数元素除自身以外数组的乘积不使用加减乘除求两个数的加法 C语言常考及易错题整理 选择题 下列 for 循环的次数为&#xff08; &#xff09; for(int i 0…...

javase入门

最近在学习大数据,学到flume拦截器的时候发现自定义拦截器需要使用java编写,现在开始学一些java入门的东西. 一. java相关组成 path环境变量: 环境变量用于记住程序路径,方便在命令行窗口任意目录启动程序. 二 java中的变量 变量要先定义在使用. int age 15 定义变量要定义其…...

Wireshark显示过滤器大全:快速定位网络流量中的关键数据包

文章目录 一、简介二、wireshark中的逻辑运算符三、过滤示例集合3.1 过滤指定日期和时间3.2 过滤指定协议3.2.1 例&#xff1a;仅显示SMTP&#xff08;端口 25&#xff09;和ICMP流量&#xff1a;3.2.2 例如&#xff1a;Windows 客户端 - DC 交换 3.3 过滤指定网段&#xff08;…...

OOP笔记4----抽象类、接口、枚举

抽象类 简介 父类可以封装不同子类的共同特征或者共同行为.而有的时候&#xff0c;父类中封装的方法无法具体完成子类中需要的逻辑&#xff0c;因此我们可以将此方法设计成抽象方法&#xff0c;即使用关键字abstract进行修饰。而有抽象方法的类&#xff0c;也必须使用abstract…...

MySQL面试题全解析:准备面试所需的关键知识点和实战经验

MySQL有哪几种数据存储引擎&#xff1f;有什么区别&#xff1f; MySQL支持多种数据存储引擎&#xff0c;其中最常见的是MyISAM和InnoDB引擎。可以通过使用"show engines"命令查看MySQL支持的存储引擎。 存储方式&#xff1a;MyISAM引擎将数据和索引分别存储在两个不…...

01_Electron 跨平台桌面应用开发介绍

Electron 跨平台桌面应用开发介绍 一、Electron 的介绍二、关于 NW.js 和 Electron 介绍三、搭建 Electron 的环境1、准备工作&#xff1a;2、安装 electron 环境3、查看 electron 的版本&#xff0c;electron -v 一、Electron 的介绍 Electron 是由 Github 开发的一个跨平台的…...

【C语言-扫雷游戏】mineweeper【未完成】

编程小白如何成为大神&#xff1f;大学新生的最佳入门攻略 编程已成为当代大学生的必备技能&#xff0c;但面对众多编程语言和学习资源&#xff0c;新生们常常感到迷茫。如何选择适合自己的编程语言&#xff1f;如何制定有效的学习计划&#xff1f;如何避免常见的学习陷阱&…...

psychopy stroop 实验设计

斯特鲁stroop实验就是色词一致/不一致实验。 设计步骤如下&#xff1a; 1. 先去设置中将Input改为PsychToolbox&#xff0c; 2. 然后左上角File-New新建一个 3. 右键trial&#xff0c;rename改名 改成自己想要的名字即可&#xff0c;比如欢迎界面welcome。 4. 接下来添加提示语…...

c++精品小游戏(无错畅玩版)

一、俄罗斯方块 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #include <conio.h> #include <windows.h>#ifdef _MSC_VER // M$的编译器要给予特殊照顾 #if _MSC_VER < 1200 // VC6及以下版本 #err…...

应急响应-主机安全之系统及进程排查相关命令(Linux操作系统-初级篇)

目录 概述lscpu-显示有关CPU架构的信息uname-查看系统信息lsmod-输出加载的所有模块lastb-输出最后登录失败的用户last-展示用户最近登录信息lastlog-展示所有用户最后的登录时间systemctl-系统服务&#xff0c;开机自启排查crontab-计划任务选项 history-查看历史命令选项常用…...

java中RSA分段加解密及Data must not be longer than异常处理

谈到RSA非对称加密&#xff0c;作为开发的我们第一想到的是安全&#xff0c;几乎不会被破解&#xff0c;以及公钥加密&#xff0c;私钥解密这些。在Java代码中&#xff0c;我们常使用一些现成的工具类如hutool中提供的工具类、网上在线的或者博客上的RSAUtils工具类来实现公钥私…...

MySQL数据分析进阶(十二)设计数据库——PART3

※食用指南&#xff1a;文章内容为‘CodeWithMosh’SQL进阶教程系列学习笔记&#xff0c;笔记整理比较粗糙&#xff0c;主要目的自存为主&#xff0c;记录完整的学习过程。&#xff08;图片超级多&#xff0c;慎看&#xff01;&#xff09; 【中字】SQL进阶教程 | 史上最易懂S…...

Kubernetes-1.22.0 可视化部署

目录 Kubeadm方式部署3master&#xff0c;2work集群&#xff08;Kubernetes-1.22.0&#xff09;-CSDN博客 1. 官方Dashboard 2. Kuboard 部署 3. Rainbond 部署 4. Kubesphere 部署 1. 官方Dashboard kubectl apply -f https://kuboard.cn/install-script/k8s-dashboard/v2…...

在 vue3 中动态路由问题记录

第一种 如果这样子的话需要加上 /* vite-ignore / ,但是在这样用这行部署服务器上跳转会有问题 component: () > import(/ vite-ignore */ ../views/ e.component .vue) 第二种 // 解决跳转问题const modeules imporet.meta.glob(/views/**/**.vue)component: modules…...

进程编程及其函数的使用

1. 创建进程 创建进程的核心操作是使用 fork() 系统调用。 1.1 fork() 系统调用 fork() 创建一个新进程&#xff08;子进程&#xff09;&#xff0c;新进程几乎是父进程的完整拷贝。fork() 返回两次&#xff1a; 在父进程中&#xff0c;返回子进程的 PID。在子进程中&#…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...