【FDCAN】STM32G0B1+FDCAN+HAL库调试记录

发布者:DazzlingSpirit最新更新时间:2021-10-14 来源: eefocus关键字:FDCAN  HAL库 手机看文章 扫描二维码
随时随地手机看文章

前言

本文是本人以STM32G0B1为平台,记录下调试总结,仅供参考,若有不对的地方,还劳烦指正。


一、实验环境?

1)MCU:STM32FG0B1VCT6 2)CAN工具:广成CAN总线分析仪双通道can转usb模块USBCAN调试解析工具can卡

在这里插入图片描述

3)CAN收发器:TCAN1042DRQ1

4)STM32CubeMX版本:V6.3.0

在这里插入图片描述

5)固件版本:STM32Cube FW_G0 V1.5.0

6)仿真器:ST-LINK V2

7)MDK: V5.30.0.0

在这里插入图片描述

二、CAN和FDCAN区别

1.介绍

CAN:1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议.


CAN_FD:随着人们对数据传输带宽要求的增加,传统的CAN总线由于带宽的限制难以满足这种增加的需求。此外为了缩小CAN网络(max. 1MBit/s)与FlexRay(max.10MBit/s)网络的带宽差距,2011年BOSCH公司推出了CAN FD 。


2.FDCAN有哪些优点(个人角度):

1)速度更快,最快可以达到10M,普遍采用5M。

2)一包数据长度最大支持64个字节,而普通CAN一包最大8个字节,通信效率大大提高。

3)CAN_FD全称是Flexible Data-Rate,意思就是帧报文中数据段波特率可变的特性,即仲裁段和数据控制段使用标准的通信波特率,而传输数据段时就会切换到更高的通信波特率。


三、CAN发送

1.STM32CubeMX配置截图:

在这里插入图片描述

1)Clock Divider:表示CAN时钟分频,STM32G0B1时钟最大支持64M,这里选择不分频。

2)Frame Format:这里选择经典模式,即把它当作普通CAN模式。

3)Mode:这里选择正常工作模式,此外还有回环模式。

4)Nominal Prescaler:表示仲裁段和数据控制段分频系数

5)Nominal Sync Jump Width:重新同步跳跃宽度。

6)Nominal Time Seg1和Nominal Time Seg2:和设置波特率有关,BAUD=Freq/Clock Divider/Prescaler/(Seg1+Seg2+1)=64M/1/8/(10+5+1)=500K

7)下面Data和上面类似。

8)Std Filters Nbr:标准帧滤波器数量。是配置CAN接受时候使用的滤波器数量,用了多少个就写多少个。

9)Ext Filters Nbr:扩展帧滤波器数量。


2.用户需要自己添加的内容:

1)在初始化的时候添加如下:


 if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK)

  {

   Error_Handler();

  }


2)在主循环中添加如下:


    TxHeader.Identifier = 0x0fffffff;

    TxHeader.IdType = FDCAN_EXTENDED_ID;

    TxHeader.TxFrameType = FDCAN_DATA_FRAME;

    TxHeader.DataLength = FDCAN_DLC_BYTES_8;

    TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;

    TxHeader.BitRateSwitch = FDCAN_BRS_OFF;

    TxHeader.FDFormat = FDCAN_CLASSIC_CAN;

    TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;

    TxHeader.MessageMarker = 0;


    ++TxData[7];


    if(HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData) != HAL_OK)

    {

      Error_Handler();

    }

    HAL_Delay(1000);


3)增加两个全局变量,方便调试观查


FDCAN_TxHeaderTypeDef TxHeader;

uint8_t TxData[8] = {0};


3.调试结果:

在这里插入图片描述

工程下载连接:FDCAN_Send,点我下载!!!!!!


四、CAN接受

1.滤波器类型采用掩码方式:

1)添加如下函数实现:

FDCAN_RxHeaderTypeDef RxHeader;

uint8_t RxData[8];

void FDCAN1_Config(void)

{

  FDCAN_FilterTypeDef sFilterConfig;

  /* Configure Rx filter */

  sFilterConfig.IdType = FDCAN_EXTENDED_ID;

  sFilterConfig.FilterIndex = 1;

  sFilterConfig.FilterType = FDCAN_FILTER_MASK;

  sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;

  sFilterConfig.FilterID1 = 0x00000023;

  sFilterConfig.FilterID2 = 0x1FFFFFFF;


  if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)

  {

    Error_Handler();

  }


  sFilterConfig.IdType = FDCAN_EXTENDED_ID;

  sFilterConfig.FilterIndex = 0;

  sFilterConfig.FilterType = FDCAN_FILTER_MASK;

  sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;

  sFilterConfig.FilterID1 = 0x00000026;

  sFilterConfig.FilterID2 = 0x1FFFFFFF;


  if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)

  {

    Error_Handler();

  }


  /* Configure global filter:

     Filter all remote frames with STD and EXT ID

     Reject non matching frames with STD ID and EXT ID */

  if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)

  {

    Error_Handler();

  }


  /* Start the FDCAN module */

  if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)

  {

    Error_Handler();

  }


  if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)

  {

    Error_Handler();

  }


}


void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)

{

  if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET)

  {

    /* Retrieve Rx messages from RX FIFO0 */

    if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)

    {

      Error_Handler();

    }

  }

}


2)调试结果:

扩展ID发送0x23的时候,CAN总线上的数据是会通过滤波器编号为1的滤波器送达单片机内部的CAN控制器上。

在这里插入图片描述

扩展ID发送0x26的时候,CAN总线上的数据是会通过滤波器编号为2的滤波器送达单片机内部的CAN控制器上。

发送扩展ID为其他的时候,CAN总线上的数据都会被滤波器过滤掉,并不会送到CAN控制器上。

工程下载连接:FDCAN_Receive_MASK,点我下载!!!!


总结

1.当滤波器选择为掩码方式的时候即FilterType = FDCAN_FILTER_MASK,FilterID2的位置为0x1FFFFFFF,代表的就是FilterID1全部校验。


2.当有多个ID需要过滤需要在CubeMX中更改滤波器使用数量,不然是无效的,且滤波器使用顺序应当按照编号。举个例子,假设你分配了使用两个滤波器,在实际中却使用了0和2,虽然1没有使用,但是实际效果应当是你配的那个2的是无效的,0的是有效的。

关键字:FDCAN  HAL库 引用地址:【FDCAN】STM32G0B1+FDCAN+HAL库调试记录

上一篇:STM32—常用的几种伪指令宏
下一篇:【CubeMX】外设选择LL库还是HAL库

推荐阅读最新更新时间:2024-11-12 13:51

【STM32】HAL库 STM32CubeMX教程九---ADC
前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 知识概括: 通过本篇博客您将学到: ACD工作原理 STM32CubeMX创建ADC例程 HAL库定时器ADC函数库 什么是ADC Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。 典型的模拟数字
[单片机]
【STM32】<font color='red'>HAL库</font> STM32CubeMX教程九---ADC
STM32标准库、HAL库和LL库介绍
引言 我们在进行STM32开发的时候,使用寄存器进行开发的终究是少数,大多数人还是习惯用库函数进行开发。到目前为止,有标准外设库、HAL库、LL库 三种。本文将分别介绍以下三种库,便于大家区分。 介绍 标准库 标准库(Standard Peripheral Library)是STMicroelectronics提供的最基本的库。它提供了对STM32微控制器的底层寄存器和外设的直接访问。标准库的设计目标是提供高度灵活性和低层次的硬件控制,以满足对性能和资源的严格要求。使用标准库,开发人员可以直接操作寄存器来配置和控制微控制器的功能,但需要手动编写大量的底层代码。标准库适用于对性能要求较高的应用和对代码大小和效率有严格要求的项目。
[单片机]
STM32标准库、<font color='red'>HAL库</font>和LL库介绍
STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收
参考资料: 1、ST HAL库官网资料 2、https://blog.csdn.net/u014470361/article/details/79206352#comments 一、STM32CubeMX配置外部时钟 注意在进行外部时钟配置时,即“High Speed Clock”和“Low Speed Clock”需配置成“Crytal/Ceramic Resonator(低温/陶瓷谐振器)”不能配置为 BYASS Clock Source(时钟脉冲源) ,否则系统起不来。 二、SWD下载接口配置 如果用HAL库不进行SWD或JTAG配置,单片机只能进行下载一次程序,要进行第二次或更多次程序下载,需要按复位键(如
[单片机]
STM32CubeMX <font color='red'>HAL库</font>串口+DMA数据发送不定长度数据接收
STM32 HAL库头文件包含关系
如图,从左到右下的顺序写: -------------------------------------------------------------------------------------------------------------------------------- The header of the common HAL driver file(stm32f1xx_hal.h) includes the common configurations for the whole HAL library.It is the only header file that is included in th
[单片机]
STM32 <font color='red'>HAL库</font>头文件包含关系
STM32F429HAL库定时器学习笔记
这些基础的东西看视频很费时间而且有过基础的在学习只是库不太清楚,希望我总结的库使用的一些使用能节约一点大家的时间。 void TIM3_Init(u16 arr,u16 psc) { TIM3_Handler.Instance=TIM3; //通用定时器3 TIM3_Handler.Init.Prescaler=psc; //分频系数 TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器 TIM3_Handler.Init.Period=arr; //自动装载值 TIM3_Ha
[单片机]
STM32Cube HAL库中断处理机制,以及回调函数实现原理
1写在前面 很多人都知道STM32CubeMX这套工具的一个目的:减少开发者对STM32底层驱动的开发时间,把重心放在应用代码上。 但是,STM32CubeMX只是生成了底层驱动的初始化代码。所以,我们还需要掌握:应用层代码如何调用HAL库函数接口,以及HAL库中断处理机制等相关知识。 HAL库牵涉的内容较多,本文拿HAL库中断处理来讲解,以及相关的回调函数。 HAL库中断处理机制 之前使用标准外设库开发时,中断程序(函数)由我们自己实现。 而HAL库的中断处理函数是按照HAL处理机制来实现,如USART1,统一由HAL_UART_IRQHandler来进行处理,如下图: 其它大部分外设(TIM、SPI、CAN
[单片机]
基于STM32的HAL库学习(2)UART串口学习
1、串口的模式有3种,一是查询模式,二是中断模式,三是DMA模式 HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制 HAL_UART_Receive();串口轮询模式接收,使用超时管理机制 HAL_UART_Transmit_IT();串口中断模式发送 HAL_UART_Receive_IT();串口中断模式接收 HAL_UART_Transmit_DMA();串口DMA模式发送 HAL_UART_Transmit_DMA();串口DMA模式接收 2、阻塞传输是调用这个函数并在等待时间内一直等待操作完成。 HAL_UART_Transmit HAL_UART_Receive
[单片机]
使用HAL库、STM32CubeMX和Keil 5开发入门教程(一)
本文转载自http://blog.csdn.net/charmingsun/article/details/50802267,本教程以点亮一盏LED灯为目的为大家演示用STM32CubeMX、Keil、ST-Link开发STM32程序的一般方法。 一、学习前的准备工作 硬件:一块STM32开发板,一个ST-Link;(我使用的开发板是NUCLEO-F411RE) 软件:装好ST-Link的驱动程序,装好STM32CubeMX,装好Keil; 文档:开发板的原理图、芯片的参考手册和HAL驱动说明书。 附: STM32F4xx HAL驱动说明书 二、创建一个新的STM32CubeMX工程 打开STM32CubeMX,然后单击
[单片机]

推荐帖子

软件与信息服务业“十一五”发展目标
软件与信息服务业“十一五”发展目标基本确定2006-6-2  “‘十一五’规划预计,软件信息服务业将以30%以上的速度增长,到2010年的时候,突破13000亿元大关,软件出口达到125亿美元。”信息产业部电子信息产品管理司副司长丁文武昨天透露说。丁文武是在昨天举行的第十届中国国际软件博览会开幕式暨“2006中国软件产业发展高峰论坛”上说这一番话的。本届软博会正处于“十一五”计划开局之年、《2006—2020年国家信息化发展战略》新颁布、倡导建设创新型国家等重大国策的背景下,
ehk RF/无线
我整理的一点vxworks的介绍
1.VxWorks开发商:VxWorks是美国WindRiverSystem公司(以下简称风河公司,即WRS公司)推出的一个实时操作系统。WRS公司组建于1981年,是一个专门从事实时操作系统开发与生产的软件公司,该公司在实时操作系统领域被世界公认为是最具有领导作用的公司。1984年WRS公司推出它的第一个版本--VxWorks1.0.1,在1997年推出了它的最新版本VxWorks5.3.1。应用:VxWorks是一个运行在目标机上的高性能、可裁减的
dafei_hz 实时操作系统RTOS
插值问题(B超打印机驱动开发)
打印B超图像100%的时候,图像正常打印,现需要放大150%,使用手动写插值,可以实现放大功能,但缺点就是慢了好多,方法如下:800X576的图像ScreenBuffer,放大1.5倍,每两个字节中间插一个,需要插(800X576)/2个字节,这样打印速度就慢了.本人把该USB打印机连在PC上,打印文件(.prn文件),寻求机器是如何插值实现放大功能的,结果发现,在打印前,机器发了个插值表,长度是1280个字节(20X64),即64倍的以下字符,0x01,0x80,0x01,0x2a,
lessun 嵌入式系统
#闲置市集# 4G模块
出售4G模块,3000芯币,邮费自理。模块的imei数据有点问题,与原来的对接不上。#闲置市集#4G模块
lehuijie 淘e淘
求西门子plc的工业网络实验室的发展史
急求西门子plc的工业网络实验室的发展史。plc的S7300或者400的组成结构应用求西门子plc的工业网络实验室的发展史
eeleader 工控电子
launchpad用3.3V电压供电不行吗?为什么我的用3.3V供电就工作不正常,插上USB工作...
launchpad用3.3V电压供电不行吗?为什么我的用3.3V供电就工作不正常,插上USB工作就正常了。求指教!!!launchpad用3.3V电压供电不行吗?为什么我的用3.3V供电就工作不正常,插上USB工作...刚才用电表测了下,从USB出来的VCC是3.6V诶应该是5V回复沙发v7v7v7v7v7v的帖子你从哪里供电的啊?USB接口那里?那需要5V,因为板子上有降压芯片。如果从接口那里的话只需要3.3V,但是要断开J3的所有排针。从J6供电。具体请看原理图回复
tthhee 微控制器 MCU
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved