野火STM32电机系列(三)Cubemx配置CAN通信

news/2025/1/25 7:58:15/

CAN接口:

PI9

PB9

1.配置CAN 通信参数

由于F4的 CAN外设挂载在APB1上,时钟配置后APB1的时钟速率为42MHz,目标通信速率为1000KHz,由公式:

BaudRate = 1/NominalBitTime

NominalBitTime = 1tq + tBS1 +tBS2

设置参数如下:

CAN时钟分频参数为7,BS1为4,BS2为1,CAN模式为Nomal模式。

生成工程

在can.c中添加如下函数

 

 

 

 

CAN_TxHeaderTypeDef TXHeader;
CAN_RxHeaderTypeDef RXHeader;uint8_t TXmessage[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uint8_t RXmessage[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};uint32_t pTxMailbox = 0;
uint32_t CAN_ID = 0x01;
int counT_A = 0;
int counT_B = 0;void CAN_Config(void)
{
CAN_FilterTypeDef  sFilterConfig;/*配置CAN过滤器*/sFilterConfig.FilterBank = 0;                     //过滤器0sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;sFilterConfig.FilterIdHigh = 0x0000;              //32位IDsFilterConfig.FilterIdLow = 0x0000;sFilterConfig.FilterMaskIdHigh = 0x0000;          //32位MASKsFilterConfig.FilterMaskIdLow = 0x0000;sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;//过滤器0关联到FIFO0sFilterConfig.FilterActivation = ENABLE;          //激活滤波器0sFilterConfig.SlaveStartFilterBank = 14;if(HAL_CAN_ConfigFilter(&hcan1,&sFilterConfig) != HAL_OK)//初始化过滤器{Error_Handler();}if(HAL_CAN_Start(&hcan1) != HAL_OK)//打开can{Error_Handler();}if(HAL_CAN_ActivateNotification(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)//开启接受邮邮箱0挂起中断{Error_Handler();}/*配置传输过程*/TXHeader.StdId = 0x321;TXHeader.ExtId = 0x01;TXHeader.RTR = CAN_RTR_DATA;TXHeader.IDE = CAN_ID_STD;TXHeader.DLC = 2;TXHeader.TransmitGlobalTime = DISABLE;}//发送函数
void CAN_senddata(CAN_HandleTypeDef *hcan,uint32_t can_id)
{TXHeader.StdId=can_id ;TXHeader.ExtId=0x12345000;//0x12345000TXHeader.DLC=8;TXHeader.IDE=CAN_ID_EXT;TXHeader.RTR=CAN_RTR_DATA;TXHeader.TransmitGlobalTime = DISABLE;HAL_CAN_AddTxMessage(hcan,&TXHeader,TXmessage,&pTxMailbox);}
//接受函数
uint32_t CAN1_Receive_Msg(uint8_t *buf)
{uint32_t i;uint8_t	RxData[8];if(HAL_CAN_GetRxFifoFillLevel(&hcan1, CAN_RX_FIFO0) != 1)//没有接收到数据,直接退出 {return 0xF1;}if(HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RXHeader, RxData) != HAL_OK){return 0xF2;}for(i=0;i<RXHeader.DLC;i++)buf[i]=RxData[i];return RXHeader.DLC;
}

头文件声明

void CAN_Config(void);

extern uint8_t TXmessage[8];

extern uint8_t RXmessage[8];

extern uint32_t CAN_ID;

extern int counT_A;

extern int counT_B;

void CAN_senddata(CAN_HandleTypeDef *hcan,uint32_t can_id);

uint32_t CAN1_Receive_Msg(uint8_t *buf);

主函数添加

 

 循环中设置1ms的发送周期

 用CAN分析仪接受

 完美


http://www.ppmy.cn/news/75917.html

相关文章

MongoDB聚合操作

文章目录 一、单一聚合二、聚合管道2.1 $match / $project / $count2.2 $limit / $skip / $sort2.3 $group 分组查询2.4 $unwind 展开数组2.5 $lookup 左外连接2.6 $bucket 存储桶 三、MapReduce 提示&#xff1a;以下是本篇文章正文内容&#xff0c;MongoDB 系列学习将会持续更…

数据结构:二叉树的顺序结构--堆

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下栈和队列方面的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

栈和队列OJ题:LeetCode--232.用栈实现队列

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;今天给大家带来的是LeetCode--232.用栈实现队列 数 据 结 构 专 栏&#xff1a;数据结构 个 人 主 页 &#xff1a;stackY、 LeetCode 专 栏 &#xff1a;LeetCode刷题训练营 LeetCode--232.用栈实现队列&#xff…

Allegro优化布线常用技巧

delete-cut 在排线布线过程中&#xff0c;有时候需要调整线序&#xff0c; 这时候&#xff0c;可以使用delete-cut&#xff0c;将需要调整的线&#xff0c; 首尾各剪断一小段线&#xff0c; 这样&#xff0c;中间部分&#xff0c;就变成了dummy net&#xff0c;就可以挂靠任意…

机器学习与深度学习——通过knn算法分类鸢尾花数据集iris求出错误率并进行可视化

什么是knn算法&#xff1f; KNN算法是一种基于实例的机器学习算法&#xff0c;其全称为K-最近邻算法&#xff08;K-Nearest Neighbors Algorithm&#xff09;。它是一种简单但非常有效的分类和回归算法。 该算法的基本思想是&#xff1a;对于一个新的输入样本&#xff0c;通过…

【设计模式】观察者模式与责任链模式异同点

责任链模式和观察者模式都是常见的设计模式&#xff0c;它们都可以用于解耦和增强代码的可维护性。下面是它们的优劣对比&#xff1a; 责任链模式的优点&#xff1a; 可以动态地组合处理者&#xff0c;增加或删除处理者&#xff0c;而不需要修改客户端代码。可以避免请求发送…

Linux防火墙之iptables(下)

目录 一、通用匹配 1&#xff09;协议匹配 2&#xff09;地址匹配 3&#xff09;接口匹配 二、隐含匹配 1&#xff09;端口匹配 2&#xff09;TCP标志位的匹配 3&#xff09;ICMP的类型匹配 ①请求规则设置 ②回显匹配 ②显示目的不可达匹配 三、显示匹配 1 &…

3、EasyExcel介绍

文章目录 EasyExcel介绍1、 导出示例2、 导入示例3、EasyExcel集成3.1 添加依赖 EasyExcel介绍 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&am…