首页 > 其他分享 >STM32cubeIDE CAN回环模式

STM32cubeIDE CAN回环模式

时间:2023-06-13 19:55:18浏览次数:42  
标签:FIFO0 HAL TxHeader sFilterConfig 模式 STM32cubeIDE 回环 OK hcan

配置如下

 

经过分频,选择位段1和位段2之后波特率回自己计算

CAN总线的频率实在PCLK上

CAN是有接收和发送中断的但是需要在STM32CUBEIDE中自己加入滤波器。


void CAN_Config(void) { CAN_FilterTypeDef sFilterConfig; /*配置CAN过滤�??*/ sFilterConfig.FilterBank = 0; //过滤器 sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; sFilterConfig.FilterIdHigh = 0x0000; //32位ID sFilterConfig.FilterIdLow = 0x0000; sFilterConfig.FilterMaskIdHigh = 0x0000; //32位MASK sFilterConfig.FilterMaskIdLow = 0x0000; sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;//通过过滤器关联到FIFO0 sFilterConfig.FilterActivation = ENABLE; //过滤器使能 sFilterConfig.SlaveStartFilterBank = 14; //区块 //过滤器配置 if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK) { Error_Handler(); } HAL_CAN_Start(&hcan);//以轮训的方式开始 HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING);//开启中断 }

然后是CAN端口的发送函数,CAN是以包的形式发送的所以要配置好对应的结构体

CAN_FilterTypeDef sFilterConfig;
CAN_TxHeaderTypeDef TxHeader;
CAN_RxHeaderTypeDef RxHeader;


uint8_t CAN_Send_Msg(uint8_t* msg ,uint8_t len,uint32_t std_id) { uint32_t TxMailbox = CAN_TX_MAILBOX0;//对应的邮箱 TxHeader.StdId = std_id;//标准标识符 TxHeader.ExtId = std_id;//拓展标识符 TxHeader.IDE = CAN_ID_STD;//使用标准帧 TxHeader.RTR = CAN_RTR_DATA;//数据帧 TxHeader.TransmitGlobalTime = ENABLE; TxHeader.DLC = len;
  //if(HAL_CAN_AddTxMessage(&hcan, &TxHeader, msg,CAN_TX_MAILBOX0) ==HAL_OK)//这个是错误的因为hal库对应的邮箱不是地址,所以需要定义一个变量转一下
if(HAL_CAN_AddTxMessage(&hcan, &TxHeader, msg, &TxMailbox) ==HAL_OK)//HAL库发送函数  
{
return 1;
}
else return 0;
}

然后是接收函数通过中断接收,回环模式可以自检,发的什么可以自己收到什么,一个板子可以搞定自发自收。

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
{
Error_Handler();
}
}
进入接收中断开始接收数据

 

标签:FIFO0,HAL,TxHeader,sFilterConfig,模式,STM32cubeIDE,回环,OK,hcan
From: https://www.cnblogs.com/mokongking/p/17478585.html

相关文章

  • 数据库复习——数据库模式设计
    数据库模式设计如果不好会导致的问题:1.冗余2.导致数据一致性出现问题3.插入异常4.更新异常5.删除异常函数依赖函数依赖是指一个或多个属性的取值可以确定另一个属性的取值。具体地说,如果一个关系模式R中属性集合X的取值能唯一地确定属性集合Y的取值,那么我们......
  • ZYNQ 裸机模式下修改默认uart端口
    ##背景调试ZYNQ裸机code,调用printf()后在UART端口无法看到打印信息输出,查看原理图后发现,板子用的UART1作为默认串口调试接口,UART0分配给了RS485使用,因此需要修改默认的STD接口到UART0,那么如何修改呢? ##修改默认STD的UART接口打开bsp中的,mss文件,然后选择modifythi......
  • 开源互联网医院系统源码开发:构建个性化、精准化医疗服务新模式
    时下,许多行业已经跟互联网有了非常深入的结合,今天我们要讲的医疗行业同样不例外。构建个性化、精准化医疗服务的新模式势在必行,而开源互联网医院系统源码开发则为实现这一目标提供了技术支持。一、开源互联网医院系统源码开发开源互联网医院系统源码开发是一种基于开源技术的医疗服......
  • 中介者模式:只有一个仲裁者
    中介者模式是一种行为型设计模式,它的主要目的是减少多个对象之间的直接通信,并通过一个中介者对象来协调它们之间的交互。这样可以降低系统的复杂性,增加可维护性和灵活性。示例代码//中介者接口interfaceMediator{voidsendMessage(Stringmessage,Colleaguecolleag......
  • C语言-观察者模式
    点击查看代码#include<stdio.h>#defineMAX_OBSERVERS10typedefstructObserver{intOberver_value;void(*update)(structObserver*observer,intvalue);}Observer;typedefstructSubject{intvalue;Observer*observes[MAX_OBSE......
  • MVVM开发模式+双向数据绑定及扩展
    一、MVVM开发模式(1)前端的视图层概念=》由MVC演化(2)M:model【模型层】:渲染页面所以来的数据源(通过ajax从服务端获取的数据)  V:view【视图层】:将数据模型转换成UI展示给用户  VM:【视图模型层】:当监听到DOM变化时,会自动地更新数据源里面所依赖的数据......
  • 聊聊如何利用服务定位器模式按需返回我们需要的服务实例
    前言什么是服务定位器模式服务定位器是一个了解如何提供各种应用所需的服务(或组件)的对象。在服务定位器中,每个服务(或组件)都只有一个单独的实例,并通过ID唯一地标识。用这个ID就能从服务定位器中得到这个服务(或组件)。何时可以考虑使用服务定位器模式服务定位器模式的目......
  • Go学设计模式--原型模式的考查点和使用推荐
    这篇原创本周发布过一次,名字和内容有些问题,不利于长期留存,重新整理发布一次。如果一个类的有非常多的属性,层级还很深。每次构造起来,不管是直接构造还是用建造者模式,都要对太多属性进行复制,那么有没有一种好的方式让我们创建太的时候使用体验更好一点呢?今天的文章里就给大家介......
  • C语言-策略模式
    1.假设我们需要实现一个排序程序,可以对一个整型数组进行排序。我们需要使用策略模式来封装不同的排序算法,例如冒泡排序、插入排序和快速排序。2.Code点击查看代码#include<stdio.h>#include<stdlib.h>#include<string.h>//策略接口typedefvoid(*Strategy)(int*,in......
  • 【技术积累】软件设计模式中的工厂模式【一】
    什么是工厂模式?工厂模式是一种设计模式,它利用工厂类来创建对象,而不是在程序中直接实例化对象。工厂模式可以隐藏创建对象的具体细节,提高代码可维护性和可扩展性。其核心思想是将对象的创建与具体实现分离开来,通过工厂类统一管理对象的创建,使得客户端无需了解创......