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

【STM32G4xx的CAN驱动记录】

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.kler.cn/a/515393.html

相关文章:

  • 【玩转全栈】----Django基本配置和介绍
  • 在elasticsearch中,document数据的写入流程如何?
  • 论文笔记(六十二)Diffusion Reward Learning Rewards via Conditional Video Diffusion
  • 人工智能之深度学习_[4]-神经网络入门
  • 26考研资料分享 百度网盘
  • 网络安全解决方案分享:推荐十款网络准入控制系统,保护企业网络安全
  • TCP断开通信前的四次挥手(为啥不是三次?)
  • H3C-防火墙IPSec配置案例(主模式)
  • 监控与调试:性能优化的利器 — ShardingSphere
  • JavaScript系列(40)--虚拟DOM实现详解
  • FPGA中场战事
  • Mac下安装ADB环境的三种方式
  • 光谱相机在智能冰箱的应用原理与优势
  • 【嵌入式开发】stm32 st-link 烧录
  • 详细介绍:云原生技术细节(关键组成部分、优势和挑战、常用云原生工具)
  • Web 音视频(三)在浏览器中创建视频
  • 4K大视频浏览器无法正常播放解决方案
  • 【超详细】ELK实现日志采集(日志文件、springboot服务项目)进行实时日志采集上报
  • #2 js中number类型计算精度问题解决
  • Docker Compose创建镜像服务
  • Android Studio常用操作备忘录
  • 设计模式详解
  • python 关闭 sagemaker 日志美化
  • Android SystemUI——最近任务应用列表(十七)
  • Postgresql源码(140)理解PG的编译流程(make、Makefile、Makefile.global.in)
  • 21. C语言 `typedef`:类型重命名