STM32+Cube mx hal库实现CAN通信收发实验

这篇具有很好参考价值的文章主要介绍了STM32+Cube mx hal库实现CAN通信收发实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

      关于CAN通信的入门教程和基本原理在其他博主发的文章里面都有介绍,笔者只是简单记录下学习过程,文章用到的是正点原子的阿波罗F429开发板,另一个设备是中盛科技的继电器模块(CAN版)。

      实现之前看一下继电器模块相关信息

hal库can收发例程,stm32,单片机,嵌入式硬件

 hal库can收发例程,stm32,单片机,嵌入式硬件

       发送数据的格式官方文档已经给与说明,帧ID的格式就是功能码+地址码,地址码默认是0x01,例如想让继电器由闭合转为断开状态,只需要向继电器模块发送0x0101(写继电器状态功能码+默认地址码) 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00即可。

       然后打开Cube开始简单配置

1.CAN功能引脚选择PA11,PA12(对照开发板原理图),因为继电器模块默认波特率是250kbps,所以配置的一定要把波特率配好。时钟配置就默认流程

hal库can收发例程,stm32,单片机,嵌入式硬件

 

hal库can收发例程,stm32,单片机,嵌入式硬件

       另外配置了按键和LED作为提示

      代码部分:

can.c

void MX_CAN1_Init(void)
{

  /* USER CODE BEGIN CAN1_Init 0 */

  /* USER CODE END CAN1_Init 0 */

  /* USER CODE BEGIN CAN1_Init 1 */

  /* USER CODE END CAN1_Init 1 */
  hcan1.Instance = CAN1;
  hcan1.Init.Prescaler = 36;
  hcan1.Init.Mode = CAN_MODE_NORMAL;
  hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan1.Init.TimeSeg1 = CAN_BS1_3TQ;
  hcan1.Init.TimeSeg2 = CAN_BS2_1TQ;
  hcan1.Init.TimeTriggeredMode = DISABLE;
  hcan1.Init.AutoBusOff = DISABLE;
  hcan1.Init.AutoWakeUp = DISABLE;
  hcan1.Init.AutoRetransmission = DISABLE;
  hcan1.Init.ReceiveFifoLocked = DISABLE;
  hcan1.Init.TransmitFifoPriority = DISABLE;
  if (HAL_CAN_Init(&hcan1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN CAN1_Init 2 */
	CAN_FilterTypeDef CAN_FilterInitStructure;
	
	CAN_FilterInitStructure.FilterBank = 0;
	CAN_FilterInitStructure.FilterMode = CAN_FILTERMODE_IDMASK;
	CAN_FilterInitStructure.FilterScale = CAN_FILTERSCALE_32BIT;
	CAN_FilterInitStructure.FilterIdHigh = 0x0000;
	CAN_FilterInitStructure.FilterIdLow = 0x0000;
	CAN_FilterInitStructure.FilterMaskIdHigh = 0x0000;
	CAN_FilterInitStructure.FilterMaskIdLow = 0x0000;
	
	CAN_FilterInitStructure.FilterFIFOAssignment = CAN_FilterFIFO0;
	CAN_FilterInitStructure.FilterActivation = ENABLE;
	
	HAL_CAN_ConfigFilter(&hcan1,&CAN_FilterInitStructure);
	HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
  /* USER CODE END CAN1_Init 2 */

}

      因为Cube并不会帮我们生成筛选器配置的相关代码,所以我们要在初始化-用户代码区域自己添加代码

main.c

/*CAN发送*/
void CAN_SEND(void)
{

	CAN_TxHeaderTypeDef CAN_TX;
	uint32_t TX_MAILBOX;
	uint8_t TX_DATA[8] = {0x03,0x00,0x00,0x00,0x00,0xf0,0x00,0x00};//继电器模块
    //手册有说明,该段表示1-2号继电器得电,45-48号继电器得电。
	
	
	
	CAN_TX.DLC = 8;
	CAN_TX.ExtId = 0x0000;
	CAN_TX.StdId = 0x0101;//标准帧ID
	CAN_TX.IDE = CAN_ID_STD;//标准帧
	CAN_TX.RTR = CAN_RTR_DATA;//数据帧
	CAN_TX.TransmitGlobalTime = DISABLE;
	
	HAL_CAN_AddTxMessage(&hcan1,&CAN_TX,TX_DATA,&TX_MAILBOX);
}

/*CAN接收*/
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan1)
{	

   CAN_RxHeaderTypeDef  RxMessage;
   uint8_t Data[2];
	
   RxMessage.DLC = 2;
   RxMessage.StdId = 0x00;
   RxMessage.ExtId = 0x0000;
   RxMessage.IDE=CAN_ID_EXT;
   RxMessage.RTR=CAN_RTR_DATA;
	 if (HAL_CAN_GetState(hcan1)!= RESET)
	 {
		 HAL_CAN_GetRxMessage(hcan1, CAN_RX_FIFO0, &RxMessage, Data);    			
		 
		 if (Data[0] == 0x99) 
		 {
			 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);
            //第一位数据是0x99,LED灭
		 }
		 if(Data[1] == 0x99)
		 {
			 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
            //第二位数据是0x99,LED亮
		 }
		 
   }
 
}

      不需要写在大循环里,每次发送按下复位就行。

hal库can收发例程,stm32,单片机,嵌入式硬件

因为只需要控制继电器模块,所以按照使用手册来修改或添加发送的数据就行了。

本文只用于记录,工程文档不一定具有参考意义。文章来源地址https://www.toymoban.com/news/detail-592235.html

到了这里,关于STM32+Cube mx hal库实现CAN通信收发实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 HAL库 CAN双机通信接收无法进入中断、中断没有反应的解决方法

    在调试HAL库下的CAN双机(双F103ZET6)通信时,阻塞轮询接收完全正常,但是中断接收没有反应。翻看了GL的烧脑之路总结(一):Cubemx创建CAN通信工程,无法进入CAN中断的原因这篇文章以后,核实自己的硬件电路没有问题,于是对自己的工程文件进行整理,把 ①HAL_CAN_ConfigFi

    2024年02月04日
    浏览(62)
  • STM32 Cube MX 之hal库软件模拟IIC 可直接移植使用

    此为软件模拟IIC,可以直接移植到HAL库使用。.h文件需要自己做函数声明这里就不再放出,如有问题大家可以讨论。 使用的时候只需要更改SDA 和SCL引脚的宏定义就可以移植使用,当然IIC协议其实就是根据IIC的时序图编写代码,主要内容就是包括开始信号,停止信号以及发送数

    2024年02月15日
    浏览(59)
  • GD32F30x系列---CAN通信收发配置

    GD32F30x系列CAN通信配置: 先找到CAN模块时钟时挂载在APB1总线上的,如下图所示: APB1总线的最大频率为60MHz,如下图所示: 根据总线频率可以计算出对应波特率的配置BS1,BS2等; 如果不会计算的话也可以直接使用工具,如下图所示: 这里工具会直接帮你你计算好BS1、BS2、P

    2024年01月19日
    浏览(103)
  • 入门stm32:STM32hal库实现ESP8266与手机通信(不定长数据收发和ESP8266使用的一些问题)

    目录 前言 一、stm32cubeMX的串口配置 二、空闲中断+dma接收 三、ESP8266.c和ESP8266.h ESP8266.h ESP8266.c 注意事项 四、与手机通信例程 步骤:  例程代码main.c 运行结果 五、相关问题 总结 相关的app和源码         前提: 1.掌握串口通信和ESP8266的使用方法 串口通信:单片机串口通信

    2024年02月04日
    浏览(93)
  • STM32 CAN快速配置(HAL库版本)

    控制器局域网总线(CAN,Controller Area Network)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。CAN协议用于汽车中各种不同元件之间的通信,以此取代昂贵而笨重的配电线束。该协议的健壮性使其用途延伸到其他

    2024年02月09日
    浏览(32)
  • STM32-CAN配置与库函数解析,实现环回模式通信

    CAN总线介绍:https://blog.csdn.net/weixin_46251230/article/details/129147612 STM32-CAN控制器介绍:https://blog.csdn.net/weixin_46251230/article/details/129150872 STM32CubeMx配置 因为bxCAN是挂载在APB1总线上的,所以设置APB1总线的时钟为36M 选择CAN接口进行配置 勾选主CAN模式,这里并不是主机的意思 配置位时

    2024年02月02日
    浏览(47)
  • STM32 CAN/CANFD软件快速配置(HAL库版本)

    控制器局域网总线(CAN,Controller Area Network)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。CAN协议用于汽车中各种不同元件之间的通信,以此取代昂贵而笨重的配电线束。该协议的健壮性使其用途延伸到其他

    2024年02月09日
    浏览(40)
  • 入门小白:STM32hal库实现ESP8266与手机通信(不定长数据收发和ESP8266使用的一些问题)

    目录 前言 一、stm32cubeMX的串口配置 二、空闲中断+dma接收 三、ESP8266.c和ESP8266.h ESP8266.h ESP8266.c 注意事项 四、与手机通信例程 步骤:  例程代码main.c 运行结果 五、相关问题 总结 相关的app和源码         前提: 1.掌握串口通信和ESP8266的使用方法 串口通信:单片机串口通信

    2024年02月07日
    浏览(65)
  • STM32——CAN通信

    STM32F103有两个CAN,都分别有自己的发送接收邮箱。 发送邮箱共有3个来发送报文,发送调度器根据优先级决定哪个邮箱的报文先被发送。 共有2个接收FIFO,每个FIFO都可以存放3个完整的报文。它们完全由硬件来管理。 CAN通信通过CAN_H、CAN_L两根线实现通信,电平特性分为显性电

    2024年02月08日
    浏览(46)
  • STM32—CAN通信

    🎀 文章作者:二土电子 🌸 关注文末公众号获取其他资料和工程文件! 🐸 期待大家一起学习交流! CAN全称是Controller Area Network,控制器局域网络,是ISO国际标准化的串行通信协议。CAN是国际上应用最广泛的现场总线之一。CAN通信只有两根信号线,分别是CAN_H和CAN_L,CAN 控制

    2024年02月16日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包