【STM32G4xx的CAN驱动记录】

news2025/1/22 6:14:40

STM32G4xx的CAN驱动记录

  • CAN说明
    • CAN的波特率计算
    • 数据测试
    • 总结

本文主要记录了基于STM32G4xx的CAN接口解析某型号雷达数据遇到的问题及规避方法,CAN总线波特率500Kbps,采样点要求80%附近。
注意CAN总线同步段的时间!!!
注意CAN总线同步段的时间!!!
注意CAN总线同步段的时间!!!

CAN说明

网上对于CAN的原理说明以及太多,这里就不再过多废话,主要把遇到的错误进行梳理。

CAN的波特率计算

手册内提到的波特率计算方法如下:
在这里插入图片描述
在这里插入图片描述
从手册中可知,只需根据时钟及设备要求的采样点配置同步段(SyncSeg)、位段1(Bit segment1)、位段2(Bit segment1)。
在这里插入图片描述
前期因为分频系数设置太低,导致CAN时钟较高,使得同步段的时间很小,与雷达相差太大导致无法同步,一般标准CAN的时钟在16MHz,当前10分频后CAN主频为17MHz,基本满足要求。

数据测试

采用RXFIFO0中断接收数据,利用双缓存存储数据

// 数据定义
FDCAN_RxHeaderTypeDef RxHeader;

typedef struct {
    uint8_t buf[255];
    uint8_t head;
    uint8_t size;
} ByteFIFO;

bool radar_buf1_idle = true;
bool radar_buf2_idle = true;

ByteFIFO radar_fifo1, radar_fifo2;

// CAN中断处理
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
    if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)
    {
        if(radar_buf1_idle == true)
        {
            // 帧头
            radar_fifo1.buf[radar_fifo1.head] = 0xAA;
            radar_fifo1.buf[radar_fifo1.head+1] = 0xAA;

            // 雷达数据ID
            radar_fifo1.buf[radar_fifo1.head+2] = RxHeader.Identifier & 0Xff;
            radar_fifo1.buf[radar_fifo1.head+3] = (RxHeader.Identifier>>8) & 0Xff;

            /* Retrieve Rx messages from RX FIFO0 */
            // 雷达数据
            HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, &radar_fifo1.buf[radar_fifo1.head+4]);
            
            // 帧尾
            radar_fifo1.buf[radar_fifo1.head+12] = 0x55;
            radar_fifo1.buf[radar_fifo1.head+13] = 0x55;
            radar_fifo1.size = radar_fifo1.size + 14;
            radar_fifo1.head = radar_fifo1.head + 14;
        }
        else if(radar_buf2_idle == true)
        {
            radar_fifo2.buf[radar_fifo2.head] = 0xAA;
            radar_fifo2.buf[radar_fifo2.head+1] = 0xAA;
            radar_fifo2.buf[radar_fifo2.head+2] = RxHeader.Identifier & 0Xff;
            radar_fifo2.buf[radar_fifo2.head+3] = (RxHeader.Identifier>>8) & 0Xff;
            /* Retrieve Rx messages from RX FIFO0 */
            HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, &radar_fifo2.buf[radar_fifo2.head+4]);
            radar_fifo2.buf[radar_fifo2.head+12] = 0x55;
            radar_fifo2.buf[radar_fifo2.head+13] = 0x55;
            radar_fifo2.size = radar_fifo2.size + 14;
            radar_fifo2.head = radar_fifo2.head + 14;
        }
    }
}

总结

当前不论是ST还是国产MCU,基本都要GUI工具进行工程配置,只要理解了相关驱动的原理,简单配置就能够使用了,再也不会被N多寄存器支配的恐惧了,但是针对某些要求高效运行的场合还是需要使用寄存器,可采用GUI配置完成后在特定地方采用寄存器即可。

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

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

相关文章

Cyber Security 101-Security Solutions-Vulnerability Scanner Overview(漏洞扫描程序概述)

了解漏洞扫描程序及其在实际场景中的工作原理。 任务1:什么是漏洞? 想象一下你住在一个小而可爱的房子里。有一天,你注意到 你的屋顶有很多小洞。如果不处理,这些小孔 可能会导致重大问题。下雨时,水会流过来 这些泄漏并损坏您…

Node.js 完全教程:从入门到精通

Node.js 完全教程:从入门到精通 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,允许开发者在服务器端使用 JavaScript。它的非阻塞 I/O 和事件驱动架构使得 Node.js 非常适合于构建高性能的网络应用。本文将详细介绍 Node.js 的安装、基本语…

【经验分享】ARM Linux-RT内核实时系统性能评估工具

【经验分享】ARM Linux-RT内核实时系统性能评估工具 前言下载和编译方法常用工具介绍总结 前言 最近在研究Linux-RT实时系统,介绍下常用的实时系统的性能评估工具。 下载和编译方法 用git下载 git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.…

C++ ——— 模拟实现 vector 类

目录 vector 类的框架 无参数的构造函数 析构函数 获取有效数据个数 获取容量 重载 [] 运算符 可读可写版本 只可读版本 扩容 尾插 实现迭代器 可读可写版本 只可读版本 自定义设置size长度和内容 在任意位置插入 删除任意位置的数据 赋值重载 vector 类的框…

02内存结构篇(D4_JVM内存分配机制)

目录 一、对象的创建 1. 类加载检查 2. 分配内存 3. 初始化零值 4. 设置对象头 32位对象头 64位对象头 5. 执行方法 二、对象大小与指针压缩 三、对象内存分配 1. 对象内存分配流程图 2. 对象栈上分配 3.3 对象在Eden区分配 3.4 大对象直接进入老年代 3.5 长期存…

异步 进程 Promise规范及应用

异步 两个或多个事件不同时存在或发生,区别于同步,同步是顺序执行从上到下,而异步不需要顺序执行,且不依赖于前面的事情是否已完成。 举例: //异步执行 let count 1; let timer setTimeout(function () {count…

C#树图显示目录下所有文件以及文件大小

C#树图显示目录下所有文件以及文件大小 我们在打开某个目录属性时,可以查看到有大小信息.如下图 而一个目录(文件夹)System.IO.Directory是没有FileSize或者Length属性的. 目录(文件夹)的大小是指该目录下所有子目录和所有文件大小的累加,按字节为单位. 新建窗体应用程序Get…

力扣707题——设计链表

#题目 从零开始设计链表,我们拆分成两次任务,今天先看1 ,2 ,4 #代码

机器学习09-Pytorch功能拆解

机器学习09-Pytorch功能拆解 我个人是Java程序员,关于Python代码的使用过程中的相关代码事项,在此进行记录 文章目录 机器学习09-Pytorch功能拆解1-核心逻辑脉络2-个人备注3-Pytorch软件包拆解1-Python有参和无参构造构造方法的基本语法示例解释注意事项…

天津市开通首个万兆宽带:1秒钟下载1GB文件

快科技1月21日消息,华为光网宣布,天津联通携手华为,日前成功为天津市北辰区柴楼金园小区部署了天津市首个万兆宽带网络。 在现场测速环节中,该万兆宽带网络展现出了惊人的速度——高达9429Mbps的下载速率,几乎跑满带宽…

html全局遮罩,通过websocket来实现实时发布公告

1.index.html代码示例 <div id"websocket" style"display:none;position: absolute;color:red;background-color: black;width: 100%;height: 100%;z-index: 100; opacity: 0.9; padding-top: 30%;padding-left: 30%; padding-border:1px; "onclick&q…

数据结构(四) B树/跳表

目录 1. LRU 2. B树 3. 跳表 1. LRU: 1.1 概念: 最近最少使用算法, 就是cache缓存的算法. 因为cache(位于内存和cpu之间的存储设备)是一种容量有限的缓存, 有新的数据进入就需要将原本的数据进行排出. 1.2 LRU cache实现: #include <iostream> #include <list>…

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

CSDN年度回顾:技术征途上的坚实步伐

嘿&#xff0c;时光过得可真快呀&#xff0c;就像那匹跑得飞快的白马&#xff0c;嗖的一下&#xff0c;2024 年的日历就这么悄无声息地翻到了最后一页。这会儿我回头看看在 CSDN 上度过的这一年&#xff0c;心里那叫一个感慨万千&#xff0c;满满的都是喜悦&#xff0c;就像心里…

解决 PostgreSQL 中创建 TimescaleDB 扩展的字符串错误

解决 PostgreSQL 中创建 TimescaleDB 扩展的字符串错误 在使用 PostgreSQL 数据库并尝试创建 TimescaleDB 扩展时&#xff0c;你可能会遇到一些棘手的错误。今天&#xff0c;我们就来探讨一个常见的错误信息及相应的解决方法&#xff1a; CREATE EXTENSION IF NOT EXISTS tim…

【语言处理和机器学习】概述篇(基础小白入门篇)

前言 自学笔记&#xff0c;分享给语言学/语言教育学方向的&#xff0c;但对语言数据处理感兴趣但是尚未入门&#xff0c;却需要在论文中用到的小伙伴&#xff0c;欢迎大佬们补充或绕道。ps&#xff1a;本文不涉及公式讲解&#xff08;文科生小白友好体质&#xff09;&#xff…

【ESP32】ESP32连接JY61P并通过WIFI发送给电脑

前言 手头上有个ESP32&#xff0c;发现有wifi功能&#xff0c;希望连接JY61P并通过WIFI把姿态数据发送给电脑 1.采用Arduino IDE编译器&#xff1b;需要安装ESP32的开发板管理器&#xff1b; 2.电脑接受数据是基于python的&#xff1b; 1. ESP32 连接手机WIFI #include <…

将 Docker 安装到 Windows 的 D 盘的方法

1.官网下载Docker Desktop Installer.exe&#xff0c;官网网址&#xff1a;Get Started | Docker 2.以管理员身份打开 Windows 终端 3.切换到 你Docker Desktop Installer.exe下载到的地址 4.在运行代码前&#xff0c;需要提前手动创建好D:\Program Files\Docker和D:\Program F…

DeepSeek-R1-GRPO理解

一、GRPO GRPO&#xff08;Group Relative Policy Optimization&#xff09;是一种强化学习&#xff08;Reinforcement Learning, RL&#xff09;算法&#xff0c;专门用于训练大型语言模型&#xff08;LLMs&#xff09;在复杂任务&#xff08;如数学推理、代码生成等&#xf…

Unreal Engine 5 C++ Advanced Action RPG 十章笔记

第十章 Survival Game Mode 2-Game Mode Test Map 设置游戏规则进行游戏玩法 生成敌人玩家是否死亡敌人死亡是否需要刷出更多 肯定:难度增加否定:玩家胜利 流程 新的游戏模式类游戏状态新的数据表来指定总共有多少波敌人生成逻辑UI告诉当前玩家的敌人波数 3-Survival Game M…