首页 > 其他分享 >FDCAN输出数据(STM32H7)

FDCAN输出数据(STM32H7)

时间:2023-04-19 17:14:01浏览次数:39  
标签:输出 CODE TxHeader FDCAN sFilterConfig STM32H7 0x2C USER

STM32配置FDCAN

总线上有的设备可能不支持FDCAN,FDCAN配置为传统CAN。

配置外部时钟

 

 

配置FDCAN1

 

 GPIO配置

 定义变量

FDCAN_RxHeaderTypeDef RxHeader;
FDCAN_TxHeaderTypeDef TxHeader;
uint8_t RxData[8];
uint8_t TxData[64] = {0x24,0x47,0x4E,0x47,0x53,0x41,0x2C,0x41,0x2C,0x31,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x39,0x39,0x2E,0x30,0x2C,0x39,0x39,0x2E,0x30,0x2C,0x39,0x39,0x2E,0x30,0x2A,0x31,0x45,0x0A};
uint8_t TxData1[8] = {0x03,0x41,0x0D,0x32,0x00,0x00,0x00,0x00};

配置CAN发送参数

void FDCAN1_Config(void)
{
  FDCAN_FilterTypeDef sFilterConfig;


  sFilterConfig.IdType = FDCAN_STANDARD_ID;   //  配置为过滤标准帧
  sFilterConfig.FilterIndex = 0;              //  过滤器的索引号
  sFilterConfig.FilterType = FDCAN_FILTER_MASK;  //  过滤方式为范围,即从FilterID1~FilterID2之间的值
  sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
  sFilterConfig.FilterID1 = 0x0000;
  sFilterConfig.FilterID2 = 0x07ff;           //  标准帧为11位ID,即0x7ff,本例配置为接收所有帧
  if(HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK)
  {
    Error_Handler();
  }

  if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
  {
    Error_Handler();
  }

//  sFilterConfig.IdType = FDCAN_EXTENDED_ID;   //  配置为过滤扩展帧
//  sFilterConfig.FilterIndex = 0;              //  过滤器的索引号
//  sFilterConfig.FilterType = FDCAN_FILTER_RANGE_NO_EIDM;  //  过滤方式为范围,即从FilterID1~FilterID2之间的值
//  sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;
//  sFilterConfig.FilterID1 = 0x00000000;
//  sFilterConfig.FilterID2 = 0x01ffffff;       //  扩展帧为29位ID,即0x1fffffff,本例配置为接收所有帧
//  HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig);

  HAL_FDCAN_ActivateNotification(&hfdcan1,FDCAN_IT_RX_FIFO0_NEW_MESSAGE,0);

  if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK)
  {
    Error_Handler();
  }
}

CAN发送数据包

uint8_t can1_SendPacket(uint32_t id, uint8_t *_DataBuf, uint8_t _Len)
{
    FDCAN_TxHeaderTypeDef TxHeader = {0};

    /* 配置发送参数 */
    TxHeader.Identifier = id;                      /* 设置发送帧消息的ID */
    TxHeader.IdType = FDCAN_STANDARD_ID;              /* 标准ID */
    TxHeader.TxFrameType = FDCAN_DATA_FRAME;         /* 数据帧 */
    TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE; /* 设置错误状态指 */
    TxHeader.BitRateSwitch = FDCAN_BRS_OFF;           /* 关闭可变波特率 */
    TxHeader.FDFormat = FDCAN_CLASSIC_CAN;                /* FDCAN格式 */
    TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;/* 用于发送事件FIFO控制, 无发送事件*/
    TxHeader.MessageMarker = 0;     /* 用于复制到TX EVENT FIFO的消息Maker来识别消息状态,范围0-0xFF */

    /* 添加数据到TX FIFO */
    int i = 0;
    int len = 8U;
    for( ; _Len; )
    {
        if(_Len>=8)
        {
            _Len -=8;
        }
        else
        {
            len = _Len;
            _Len = 0;
        }
        TxHeader.DataLength = len<<16;      /* 发送数据长度 */

        while((hfdcan1.Instance->TXFQS)&(1U<<21));   //发送缓冲满了就阻塞
        if(HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, _DataBuf+i)) return 1;
        i +=len;
    }

    return 0;
}

 

测试

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MPU Configuration--------------------------------------------------------*/
  MPU_Config();

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_FDCAN1_Init();
  /* USER CODE BEGIN 2 */
  FDCAN1_Config();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
        can1_SendPacket(0x0001, TxData, 41);
        HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

 

 

标签:输出,CODE,TxHeader,FDCAN,sFilterConfig,STM32H7,0x2C,USER
From: https://www.cnblogs.com/boring-luobo/p/17333733.html

相关文章

  • C语言字符串输入输出
    字符串输入输出:charstring[8];scanf("%s",string);  scanf读入一个单词,到空格、tab或回车为止printf("%s",string); 但是!!上面的写法是不安全的,因为不知道会读取到多少数据,可能会溢出,所以可以在%s中间加一个数字,表示最多读取多少,例如:charstring[8];scanf("%7s",string......
  • 软件工程:波斯特尔定律,输入输出的平衡之道
    hi,我是熵减,见字如面。在软件开发中,你是否遇到过这种情况:你正在开发一个文件上传的功能,用户可以上传各种类型的文件。按照用户的需求场景,程序应该能够宽容地接受各种类型和格式的图像文件。如果用户上传了一个非常大的图像文件,你无法正常的处理,程序也不应该直接的奔溃,而是要给用......
  • 【Azure 应用服务】当在Azure App Service的门户上 Log Stream 日志无输出,需要如何操
    问题描述在AzureAppService的门户上LogStream日志无输出,需要如何操作让其输出ApplicationLogs呢?如下图所示:问题解答请注意,上图中提示说:Applicationlogsareswitchedoff. YoucanturnthemonusingtheAppServiceLogsSettings.应用日志关闭,可以通过AppServiceL......
  • STM32定时器的输出比较功能——输出PWM波形
    输出比较OC(OutputCompare)输入捕获IC(InputCapture)输入捕获和输出比较单元CC(Capture/Compare)输出比较模块的最主要功能:通过比较CNT(时基单元里的计数器,计数自增)和CCR寄存器(比较捕获寄存器,给定值)的关系,来对输出电平进行置1,置0或翻转的操作,用于输出一定频率和占空比的PWM波形......
  • 4/18打卡 复数的输入输出和加减乘除重载
    classComplex{doublereal;doubleimag;public:friendistream&operator>>(istream&is,Complex&c);friendostream&operator<<(ostream&os,constComplex&a);Complex(){real=0;......
  • TIM-PWM输出,占空比改变时机对输出波形的影响
    一、实验概述以下说明描述三种改变PWM占空比的方式,对于当前PWM输出波形的影响1、禁止预装载功能,在PWM某一周期波形输出过程中改变占空比值(ccp)2、禁止预装载功能,在PWM某周期波形输出完成后改变占空比值(ccp)3、使能预装载功能,在PWM某一周期波形输出过程中改变占空比值(ccp)4、使能......
  • Python输出函数需要注意的问题
    问题描述我是使用的print里面的f执行的相关的输出语句,然后就发现str类型的输出就自动带上了括号,就感到挺离谱的问题解决发现使用f进行输出的话,非数字数值的数据就会带上括号(在类里面),可以直接使用print(self.name)直接输出......
  • TTL反相器、OC门、TS门、推挽输出、开漏输出
    TTL反相器这是一个TTL反相器,这是经过了很多工程师多种设计最终沉淀出来的电路,这个电路是比较成熟的。我们只需要对这个电路进行解析即可,不需要再去研究当初是如何设计出来的。学过CMOS应该知道,右侧的输出级其实也是个推挽输出,因为长得像图腾柱,因此也有人称呼它为图腾柱。推挽输出的......
  • php输出文言文句 一言接口定义
    随机本地词典内容,随机一行文本输出<?php//获取句子文件的绝对路径$file=file($yiyanPath."yiyan.txt");//随机读取一行$arr=mt_rand(0,count($file)-1);$content=trim($file[$arr]);echo$content;?>......
  • 【Visual Leak Detector】VS 中 VLD 输出解析
    说明使用VLD内存泄漏检测工具辅助开发时整理的学习笔记。同系列文章目录可见《内存泄漏检测工具》目录目录说明1.使用方式2.输出报告1.使用方式在VS中使用VLD的方法可以查看另外一篇博客:在VS2015中使用VLD。2.输出报告在VS中使用VLD时的输出报告,与在QT......