【HAL库】STM32CubeMX开发----STM32F407----CAN通信实验
创始人
2024-02-10 05:09:32
0

STM32CubeMX 下载和安装 详细教程
【HAL库】STM32CubeMX开发----STM32F407----目录


前言

本次实验以 STM32F407VET6 芯片为MCU,使用 25MHz 外部时钟源。
CAN通信波特率为 500K bps。
CAN通信引脚MCU引脚 对应关系如下:

CAN通信引脚MCU引脚
TXPB9
RXPB8

一、使用STM32CubeMX----新建CAN通信工程

步骤1:打开 STM32CubeMX 软件

具体 STM32CubeMX 界面如下:
在这里插入图片描述

步骤2:选择 从MCU开始我的项目

在这里插入图片描述

步骤3:选择MCU芯片

我们本次实验选择 STM32F407VET6 芯片做 MCU
在这里插入图片描述

进入工程编辑,具体界面如下:

在这里插入图片描述

步骤4:设置烧写方式为 SWD模式

这一步必须选择一种烧写方式,否则烧写一次程序后,芯片中就没法再次烧写程序了。需要硬件重启才可以重新烧写程序。

STM32烧写程序连接方式详解

在这里插入图片描述

步骤5:设置时钟源

设置外部晶振为芯片系统时钟源。
在这里插入图片描述

步骤6:设置时钟

STM32F407 时钟最大频率为 168M
在这里插入图片描述

步骤7:CAN通信配置

1.选择引脚

CAN通信引脚选择如下表:

CAN引脚MCU引脚1MCU引脚2MCU引脚3
CAN1_RXPA11PB8PD0
CAN1_TXPA12PB9PD1
CAN2_RXPB5PB12/
CAN2_TXPB6PB13/

我们这次选择:CAN1通信,PB8,PB9为通信引脚。
具体操作如下:

在这里插入图片描述

鼠标左键点击引脚,选择CAN通信功能。

在这里插入图片描述
在这里插入图片描述

最后结果如下:

在这里插入图片描述

2.配置参数

本次实验的APB1时钟频率 = 42MHz,在 步骤6设置时钟 中有介绍。
CAN波特率 = APB1时钟频率 / Prescaler / (1 + BS1 + BS2)

CAN波特率APB1时钟频率PrescalerBS1BS2
500KBPS42MHz792

具体操作如下:
在这里插入图片描述

3. 中断配置

勾选CAN通信接收中断RX0
在这里插入图片描述

步骤8:项目编辑

在这里插入图片描述

步骤9:代码生成编辑

在这里插入图片描述

步骤10:点击 GENERATE CODE 生成代码

在这里插入图片描述
新建的工程,已经生成,接下来就是对工程代码的编辑。

二、使用keil5----编辑程序

想要使用keil5打开工程,需要电脑先安装 keil5编译环境,具体操作流程。
可以点击下方文章链接:Keil5编译环境搭建流程

1. CAN相关HAL库函数说明

//开启CAN通讯
HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan);
//关闭CAN通讯	
HAL_StatusTypeDef HAL_CAN_Stop(CAN_HandleTypeDef *hcan);	
//进入休眠模式
HAL_StatusTypeDef HAL_CAN_RequestSleep(CAN_HandleTypeDef *hcan);
//从休眠模式中唤醒
HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef *hcan);	
//检查是否成功进入休眠模式
uint32_t HAL_CAN_IsSleepActive(CAN_HandleTypeDef *hcan);	
//向 Tx 邮箱中增加一个消息,并且激活对应的传输请求
HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox);	
//请求发送中断传输
HAL_StatusTypeDef HAL_CAN_AbortTxRequest(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes);	
//获取空闲Tx邮箱的数量
uint32_t HAL_CAN_GetTxMailboxesFreeLevel(CAN_HandleTypeDef *hcan);
//检查是否有传输请求在指定的 Tx 邮箱上等待
uint32_t HAL_CAN_IsTxMessagePending(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes);	
//如果启用时间触发通信模式,则返回发送的Tx消息的时间戳。
uint32_t HAL_CAN_GetTxTimestamp(CAN_HandleTypeDef *hcan, uint32_t TxMailbox);
//从Rx FIFO区域获取CAN帧到消息
HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[]);
//返回Rx FIFO填充水平
uint32_t HAL_CAN_GetRxFifoFillLevel(CAN_HandleTypeDef *hcan, uint32_t RxFifo);

2. CAN通信配置流程

STM32CubeMX生成CAN通信工程程序后,还需要做以下配置,才能实现CAN收发功能。
(1)配置过滤器
(2)启动CAN外围设备
(3)激活CAN接收中断
具体程序如下:

void User_CAN1_Init(void)
{/*配置CAN过滤器*/CAN_FilterTypeDef FilterConfig;FilterConfig.FilterBank = 0;         //过滤器组号FilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;	//过滤模式:屏蔽位模式--CAN_FILTERMODE_IDMASK,列表模式--CAN_FILTERMODE_IDLISTFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;	//过滤器位宽:32位FilterConfig.FilterIdHigh = 0x0000;               //32位IDFilterConfig.FilterIdLow = 0x0000;FilterConfig.FilterMaskIdHigh = 0x0000;           //32位MASKFilterConfig.FilterMaskIdLow = 0x0000;FilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;//过滤器0关联到FIFO0FilterConfig.FilterActivation = ENABLE;          //激活滤波器0FilterConfig.SlaveStartFilterBank = 14;		  //单CAN此参数无意义//过滤器配置if (HAL_CAN_ConfigFilter(&hcan1, &FilterConfig) != HAL_OK){Error_Handler();}//启动CAN外围设备if(HAL_CAN_Start(&hcan1) != HAL_OK) {Error_Handler();}//激活CAN接收中断if (HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK){Error_Handler();}
}

3. CAN通信----发送

CAN总线通信发送配置流程

  1. 写入标识符
  2. 写入标识符类型标准帧/扩展帧
  3. 写入帧类型远程帧/数据帧
  4. 写入数据长度
  5. 写入数据
  6. 发送数据

具体程序如下:

void CAN1_TX_Data(void)
{CAN_TxHeaderTypeDef	TxHeader;      uint8_t TX_data[8]={0,0,0,0,0,0,0,0};TxHeader.StdId = 0;							//标准标识符(11位)TxHeader.ExtId = 0x12345678; 		//扩展标识符(29位)TxHeader.IDE = CAN_ID_EXT ;			//扩展帧TxHeader.RTR = CAN_RTR_DATA;		//数据帧TxHeader.DLC = 8;								//数据个数TxHeader.TransmitGlobalTime = DISABLE;TX_data[0] = 0x11;TX_data[1] = 0x22;TX_data[2] = 0x33;TX_data[3] = 0x44;TX_data[4] = 0x55;TX_data[5] = 0x66;TX_data[6] = 0x77;TX_data[7] = 0x88;uint32_t TxMailbox;HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TX_data, &TxMailbox);
}

4. CAN通信----接收

CAN总线通信接收配置流程

  1. 进入CAN总线接收中断回调函数
  2. 从Rx FIFO区域获取数据
  3. 解析接收数据
  4. 实现对应功能

具体代码如下:

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *CanHandle)
{CAN_RxHeaderTypeDef	RxHeader;     uint8_t RX_data[8]={0,0,0,0,0,0,0,0};if(HAL_CAN_GetRxMessage(CanHandle, CAN_RX_FIFO0, &RxHeader, RX_data) != HAL_OK){Error_Handler();}/*处理接收到的数据*/
}

相关内容

热门资讯

感谢家长的话语 感谢家长的话语感谢家长的话语1.坐在电脑前敲打着键盘,出一张“两位数加减一位数、整十数”的口算练习。...
第一学期中班幼儿评语 第一学期中班幼儿评语(精选15篇)  在平平淡淡的日常中,大家都写过评语吧,评语的内容包括被考评者的...
王小波的经典语录100句   王小波的小说既继承了年代对爱情与革命权力关系的思考,具有强烈启蒙意味,也顺应了年代世俗化潮流。接...
经典祝愿高考成功寄语 经典祝愿高考成功寄语(通用90句)  六月参加高考,准备还得趁早,心态一定摆正,付出必有回报,毕竟熬...
电影的观后感 电影的观后感  在观看完一部作品以后,能够给我们不少启示,这时候最关键的观后感不能忘了。但是观后感有...
利益关系经典语录 利益关系经典语录  在日常的学习、工作、生活中,大家都知道一些经典的语录吧,语录是指一个人的说话记录...
哆啦a梦语录 哆啦a梦语录  01、骗人有风险,说谎要谨慎。  02、日子就像偷跑的小孩,无声地溜走。  03、知...
感人的情书经典语录   在很多超感人的情书中,是有一些情书经典语录起到关键作用。小编今天收集了超感人情书经典语录,希望得...
高中生毕业寄语 高中生毕业寄语4篇  在日常的学习、工作、生活中,大家总免不了要接触或使用寄语吧,寄语是所传的、寄托...
优秀班干部获奖感言 优秀班干部获奖感言优秀班干部获奖感言尊敬的老师,亲爱的同学: 大家晚上好!我是S,今天很高兴作为获奖...
最新感人经典语录 最新感人经典语录  1其实,我不是一定要等你,只是等上了,就等不了别人了。《朝露若颜》  2如果世界...
小说我的美女大小姐经典语录   揭穿谎言背后的谎言多累啊!还不如站的离你远点儿,看着你怎么在谎言中尽情的表演  ——李兴禹《我的...
个性早安寄语 常用个性早安寄语汇总75句  我只是想写一封信给你,寄信人在河这头,收信人在河那头。隔开我们的这条河...
假期家长评语怎么写 假期家长评语怎么写  假期我们家长任务是比较大的,许多家长都不知道怎么去写这个假期表现评语,假期家长...
一年级开学典礼校长致辞 一年级开学典礼校长致辞(精选5篇)  在平平淡淡的学习、工作、生活中,大家都对致辞很是熟悉吧,致辞是...
初中学生综合素质评语 初中学生综合素质评语大全  在生活、工作和学习中,大家总少不了要接触或使用评语吧,评语可有效引导被评...
毕业班主任寄语 毕业班主任寄语通用15篇  在平日的学习、工作和生活里,大家总少不了要接触或使用寄语吧,寄语的种类很...
谈“死亡”话题 谈“死亡”话题  死亡指丧失生命,生命终止,停止生存,是生存的反面。哲学上说,死亡是生命(或者事物件...
情人节温馨寄语 情人节温馨寄语集合15篇  在学习、工作、生活中,说到寄语,大家肯定都不陌生吧,寄语是所传的话语,有...
初中毕业寄语 初中毕业寄语(合集15篇)  在学习、工作或生活中,大家都尝试过写寄语吧,寄语是人们所传的话语,有时...