GD32F303之CAN通信
1、CAN时钟
GD32F303主时钟频率最大是120Mhz,然后APB1时钟最大是60Mhz,APB2时钟最大是120Mhz,CAN挂载在APB1总线上面
所以一般CAN的时钟频率是60Mhz,这个频率和后面配置波特率有关
2、GD32F303时钟配置
首先我们知道芯片有几个时钟
HXTAL:高速外部时钟;
LXTAL:低速外部时钟;
IRC8M:高速内部时钟;
IRC40K:低速内部时钟;
代码配置时钟时我们要确定时选择内部晶振还是外部晶振,他们配置频率都不一样,例如下面的宏定义可以配置不同的时钟频率
比如 如果定义了__SYSTEM_CLOCK_120M_PLL_IRC8M宏定义,那么芯片时钟采用内部晶振8Mhz,然后主时钟频率是120Mhz
如果定义了__SYSTEM_CLOCK_120M_PLL_HXTAL宏定义,那么芯片时钟采用外部晶振时钟,这个晶振一般都是8Mhz,但是针对不同的系列有所不一样,比如GD32F303RET6的外部晶振就是12Mhz,然后使能__SYSTEM_CLOCK_120M_PLL_HXTAL宏定义之后他的主时钟频率不是120Mhz,看代码可知 (12/2)*30不等于120Mhz,所以时钟的频率需要确定好,下面这个代码只适配外部晶振是8Mhz的。
3、CAN的波特率配置
首先我们需要知道波特率的计算公式,其中的PCLK就是CAN挂载总线APB1的时钟,一般为60Mhz,如果我们配置为下面的参数,及代表着CAN的波特率为250kbits。
/* baudrate 250Kbps */can_parameter.resync_jump_width=CAN_BT_SJW_1TQ;can_parameter.time_segment_1 = CAN_BT_BS1_14TQ;can_parameter.time_segment_2 = CAN_BT_BS2_1TQ;can_parameter.prescaler = 15;
4、CAN通信代码
can.c
//can.c文件
#include "can.h"
#include "led.h"void gd32_can_init(void)
{can_parameter_struct can_parameter;can_filter_parameter_struct can_filter;/* initialize CAN register */can_deinit(CAN0);/* enable CAN clock */rcu_periph_clock_enable(RCU_CAN0);rcu_periph_clock_enable(RCU_GPIOA);//使能时钟gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ,GPIO_PIN_11);gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_12);//IO复用为CAN功能/* configure CAN0 NVIC */nvic_irq_enable(CAN0_RX1_IRQn,0,0); //中断配置can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);//初始化参数/* baudrate 250Kbps */can_parameter.time_segment_1 = CAN_BT_BS1_14TQ;can_parameter.time_segment_2 = CAN_BT_BS2_1TQ;can_parameter.prescaler = 15;/* initialize CAN */can_init(CAN0, &can_parameter);can_filter.filter_fifo_number = CAN_FIFO1;can_filter.filter_enable = ENABLE;can_filter_init(&can_filter);/* enable can receive FIFO0 not empty interrupt */can_interrupt_enable(CAN0, CAN_INT_RFNE1|CAN_INT_TME);}/*CAN通信数据发送can_frame---要发送的数据发送成功返回0,失败返回1
*/
uint8_t gd32_can_send(can_trasnmit_message_struct can_frame)
{ uint8_t ret=0;ret = can_message_transmit(CAN0,&can_frame);if(ret == CAN_NOMAILBOX){return 1;}return 0;
}/*CAN出错--重启CAN
*/
void gd32_can_error(void)
{if( can_flag_get(CAN0, CAN_FLAG_MTE2) != RESET ||can_flag_get(CAN0, CAN_FLAG_MTE0) != RESET ||can_flag_get(CAN0, CAN_FLAG_MTE1) != RESET || can_flag_get(CAN0, CAN_FLAG_PERR) != RESET ||can_flag_get(CAN0, CAN_FLAG_WERR) != RESET){can_flag_clear(CAN0, CAN_FLAG_MTE0);can_flag_clear(CAN0, CAN_FLAG_MTE1);can_flag_clear(CAN0, CAN_FLAG_MTE2);can_flag_clear(CAN0, CAN_FLAG_PERR);can_flag_clear(CAN0, CAN_FLAG_WERR);can_wakeup(CAN0);gd32_can_init();}
}/*CAN接收中断函数
*/
void CAN0_RX1_IRQHandler(void)
{can_receive_message_struct can_mes;memset(&can_mes,0,sizeof(can_mes)); can_message_receive(CAN0, CAN_FIFO1, &can_mes); LED1_ON();
}
can.h
#ifndef __CAN_H
#define __CAN_H#include "gd32f30x.h"
#include "string.h"void gd32_can_init(void);
uint8_t gd32_can_send(can_trasnmit_message_struct can_frame);
void gd32_can_error(void);#endif
main.c
//CAN初始化gd32_can_init();transmit_message.tx_sfid = 0x7ab;transmit_message.tx_efid = 0x00;transmit_message.tx_ft = CAN_FT_DATA;//帧的类型:数据帧或者遥控帧transmit_message.tx_ff = CAN_FF_STANDARD;//帧的格式:标准帧或者拓展帧transmit_message.tx_dlen = 8;//数据长度小于8transmit_message.tx_data[0] = 0x55;transmit_message.tx_data[1] = 0x55;transmit_message.tx_data[2] = 0x55;transmit_message.tx_data[3] = 0x55;transmit_message.tx_data[4] = 0x55;transmit_message.tx_data[5] = 0x55;transmit_message.tx_data[6] = 0x55;transmit_message.tx_data[7] = 0x55;gd32_can_send(transmit_message);
5、USBCAN-II+的指示灯含义
如果sys 亮绿灯,则代表驱动安装成功,如果亮红灯,则表示驱动安装失败
如果CAN0或者CAN1的绿灯常亮,说明开始通信
6、CAN通信失败原因可能
(1)波特率和上位机没有一一配对
(2) CAN的时钟频率配置问题
(3)CANtest上位机如果一直出现打开设备失败,则选择使用ZCanPro上位机
(4)可以使用示波器挂一下单片机的两个输出引脚,是否有波形发出,如果有,说明软件发出了数据,然后挂载另一边,检查芯片是否有问题
(5)打开上位机然后CAN盒一直闪红灯,说明通信有问题
问题1:错误帧一直累加,说明单片机已经发出数据帧,但是帧的内容存在问题,原因可能是上位机和单片机的波特率不匹配
问题2:接收帧和错误帧都会累加,但是接收帧的帧ID,数据长度和内容都存在问题,原因可能是主时钟频率或者CAN频率出现问题
7、USBCAN-II+驱动下载
驱动下载 (zlg.cn)
总结:主时钟频率是程序的基础,针对和时钟有关的代码,必须将时钟频率调准再写,比如选择外部时钟源,具体是8Mhz还是12Mhz,比如选取完外部时钟源时钟分频和倍频是否正确。
相关文章:

GD32F303之CAN通信
1、CAN时钟 GD32F303主时钟频率最大是120Mhz,然后APB1时钟最大是60Mhz,APB2时钟最大是120Mhz,CAN挂载在APB1总线上面 所以一般CAN的时钟频率是60Mhz,这个频率和后面配置波特率有关 2、GD32F303时钟配置 首先我们知道芯片有几个时钟 HXTAL:高速外部时钟࿱…...

postgres 的dblink使用,远程连接数据库
一.安装下载 dblink create extension if not exists dblink 查看是否已经安装 select * from pg_extension;二.运行,查询数据 其中,第一个参数是dblink名字,也可以是连接字符串。 第二个参数是要执行的SQL查询语句。AS子句用于指定返回结…...

短视频矩阵系统是什么?怎么搭建短视频矩阵系统?一文了解矩阵模式
在数字时代,短视频已成为信息传播的新宠,而短视频矩阵系统则是品牌和个人在短视频领域取得突破的重要工具。那么,短视频矩阵系统究竟是什么?如何搭建这样一个高效的系统?它又能够解决哪些问题呢?本文将为您…...

查看centos硬盘大小
直接上命令 lsblk...

2024 年 6 月公链行业研报:市场回调,比特币和以太坊 Layer 2 表现各异
作者:stellafootprint.network 数据来源:公链 Research 页面 六月,加密货币市场经历了显著的挑战。比特币因即将到来的 Mt. Gox 赔偿支付及政府清算的压力,导致市场不确定性加剧。尽管美国现货以太坊 ETF 的推进带来了积极信号…...

SAP S4 销售组的定义和分配
spro-企业结构-定义-销售与分销-维护销售组 新增一个记录 spro-企业结构-分配-销售与分销-给销售办公室分配销售组...

实时数仓和离线数仓的区别是什么,企业该如何选择合适的数仓架构?
目录 一、离线数仓 1. 离线数仓是什么? 2. 离线数仓的特点 3. 离线数仓的适用场景 二、实时数仓 1. 实时数仓是什么? 2. 实时数仓的特点 3. 实时数仓的适用场景 三、由数仓需求变化带来的数据仓库架构的演变 1. 传统数仓架构 2. 离线大数据架构 3. Lambd…...

花所Flower非小号排名20名下载花所Flower
1、Flower花所介绍 Flower花所是一家新兴的数字货币交易平台,致力于为全球用户提供安全、便捷的交易体验。平台以其强大的技术支持和丰富的交易产品闻名,为用户提供多样化的数字资产交易服务,涵盖了主流和新兴数字货币的交易需求。 2. Flowe…...

程序员有哪些职位?
互联网行业中的岗位种类繁多、五花八门,学习一门技术后,重要的是找到合适的职业发展方向,程序员有哪些职业发展方向?一起来看看吧! 1.架构师 架构师需要程序员有强大的技术实力和深厚的技术积累。建筑师的成长需要经…...

python+Selenium自动化之免登录(cookie及token)
目录 cookie免登录 通过接口获取cookie 启用浏览器绕过登录 添加token 使用登录可以减去每次登录的重复操作,直接操作系统登录后的菜单页面,也可以减少安全验证登录,如图像验证登录的操作。注意:cookie和token都有有效期。 c…...

Web安全:SQL注入
一、SQL注入三要素 1、用户可以对输入的参数值进行修改。 2、后端不对用户输入的参数值进行严格过滤。 3、用户修改后的参数值可以被带入后端中成功执行,并返回一定结果。 二、SQL注入原理 简单来说,用户输入的值会被插入到SQL语句中,然后…...

【LLM-驯化】成功配置多模态大模型InternLM-XComposer微调环境
【LLM-驯化】成功配置多模态大模型InternLM-XComposer微调环境 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 免费获取相关内容文档关注&am…...

C++·继承
面向对象编程有三大特性:封装、继承、多态。 封装我们前几节已经讲过了,第一层封装是将一个数据和方法都封装到一个类中,想让用户访问的定义成公有,不想让用户访问的定义成私有,第二层封装就类似于迭代器、适配器的思想…...

2024最适合小白的Midjourney教程,值得收藏!
一、Midjourney 的提示词 1、提示可以包括一个或多个图像 URL、多个文本短语以及一个或多个参数 1)Image Prompts(图像提示):可以将图像 URL 添加到提示中以影响最终结果的样式和内容。图像 URL 始终出现在提示的前面。文件应以.…...

MVC 返回集合方法,以及分页
返回一个数据集方法 返回多个数据集方法 》》定义一个Model public class IndexMoel {public List<UserGroup> UserGroup{get;set;}public List<User> User{get;set;}}》》》控制器 //db 是 EF 中的上下文 var listnew IndexModel(); list.UserGroupdb.UserGro…...
昇思MindSpore学习笔记6-05计算机视觉--SSD目标检测
摘要: 记录MindSpore AI框架使用SSD目标检测算法对图像内容识别的过程、步骤和方法。包括环境准备、下载数据集、数据采样、数据集加载和预处理、构建模型、损失函数、模型训练、模型评估等。 一、概念 1.模型简介 SSD目标检测算法 Single Shot MultiBox Detecto…...

vb.netcad二开自学笔记9:界面之ribbon
一个成熟的软件怎么能没有ribbon呢,在前面的框架基础上再加个命令AddRibbon <CommandMethod("AddRibbon")> Public Sub AddRibbon() Dim ribbonControl As RibbonControl ComponentManager.Ribbon Dim tab As RibbonTab New RibbonTab() tab.Tit…...

学习笔记——动态路由——OSPF链路状态通告(LSA)
十、OSPF链路状态通告(LSA) 1、链路状态通告简介 (1)LAS概述 链路状态通告(Link State Advertisement,LSA)是路由器之间链路状态信息的载体。LSA是LSDB的最小组成单位,LSDB由一条条LSA构成的。是OSPF中计算路由的重要依据。 LSA用于向其它邻接OSPF路…...

模拟防止重复提交
gitee地址(需要自取)AopProxy重复提交: 防止重复提交 (gitee.com) RestController public class SubmissionController {Autowiredprivate SubmissionService submissionService;private static Jedis jedis new Jedis("localhost",6379);pr…...

C++:strcut与class的区别
在C中,struct和class在语法上非常相似,但它们之间确实存在一些关键的差异,这些差异主要体现在成员的默认访问权限和继承的默认方式上。然而,从更广泛的角度来看,它们都可以用来定义自定义数据类型,包含数据…...

科研绘图系列:R语言两组数据散点分布图(scatter plot)
介绍 展示两组数据的散点分布图是一种图形化表示方法,用于显示两个变量之间的关系。在散点图中,每个点代表一个数据点,其x坐标对应于第一组数据的值,y坐标对应于第二组数据的值。以下是散点图可以展示的一些结果: 线性关系:如果两组数据之间存在线性关系,散点图将显示出…...

【EasyExcel】根据单元格内容自动调整列宽
1.自定义Excel列宽样式策略类 import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.e…...

半月内笔者暂不写时评文
今晨,笔者在刚恢复的《新浪微博》发布消息表态如下:“要开会了!今起,半月内笔者暂不写敏感时评文,不让自媒体网管感到压力,也是张驰有度、识时务者为俊杰之正常选择。野钓去也。” 截图:来源笔者…...

Python面试题:如何在 Python 中解析 XML 文件?
在 Python 中解析 XML 文件可以使用内置的 xml.etree.ElementTree 模块。以下是一个示例,展示了如何使用这个模块解析 XML 文件: 读取 XML 文件: import xml.etree.ElementTree as ET# 读取 XML 文件 tree ET.parse(example.xml) root tr…...

3033.修改矩阵
1.题目描述 给你一个下标从 0 开始、大小为 m x n 的整数矩阵 matrix ,新建一个下标从 0 开始、名为 answer 的矩阵。使 answer 与 matrix 相等,接着将其中每个值为 -1 的元素替换为所在列的 最大 元素。 返回矩阵 answer 。 示例 1: 输入&am…...

解决MCM功率电源模块EMC的关键
对MCM功率电源而言,由于其工作在几百kHz的高频开关状态,故易成为干扰源。电磁兼容性EMC(Electro Magnetic Compatibility),是指设备或系统在其电磁环境中符合要求运行并不对其环境中的任何设备产生无法忍受的电磁干扰的…...

在conda的环境中安装Jupyter及其他软件包
Pytorch版本、安装和检验 大多数软件包都是随Anaconda安装的,也可以根据需要手动安装一些其他软件包。 目录 创建虚拟环境 进入虚拟环境 安装Jupyter notebook 安装matplotlib 安装 pandas 创建虚拟环境 基于conda包的环境创建、激活、管理与删除http://t.cs…...

spark中的floor函数
在Spark中,floor函数是一种数学函数,用于返回不大于给定数值的最大整数。具体作用如下: 1. 数值操作: floor函数会将每个元素向下取整到最接近的整数。例如,对于浮点数或双精度数值,它会返回不大于该数值的…...

最简单的Docker离线安装教程
最简单的Docker离线安装教程 方式一 RPM 包方式1. 在线下载 RPM 包2. 将 RPM 包拷贝到安装机器3. 安装4. 启动 方式二 二进制安装方式(推荐)1. 下载包2. 将包进行解压授权3. 注册 systemd4. 自启和启动 一直以来在线安装 docker 到服务器上是非常方便的&…...

如何在 Python 中创建一个类似于 MS 计算器的 GUI 计算器
问题背景 假设我们需要创建一个类似于微软计算器的 GUI 计算器。这个计算器应该具有以下功能: 能够显示第一个输入的数字。当按下运算符时,输入框仍显示第一个数字。当按下第二个数字时,第一个数字被替换。 解决方案 为了解决这个问题&am…...