cubemx配置can通信教程(stm32)(带项目工程文件)

项目完整工程文件百度网盘自取

链接:https://pan.baidu.com/s/10pxsGElFsUCfuDcg2kwmcA 
提取码:83ue

      本教程详细介绍了CAN通信配置过程,具体包括cubemx配置以及keil程序编写两部分。项目使用stm32f103c8单片机作为主控芯片,通过在cubemx软件上实现时钟、CAN、GPIO口等配置的初始化,并通过在keil5软件上调用hal库实现CAN通信的相关功能。具体功能如下:

1、CAN心跳发送,波特率250k,周期200ms,ID为0x010,数据位byte0-byte7中的byte7字节每次发送累加1,加满后归零重复累加,其余数据位保持0x00;

2、通过K1按键切换CAN发送内容,当K1按下后超过5s且一直保持按下状态,CAN切换周期为50ms,ID为0x020,数据位byte0-byte7中的byte6字节每次发送累加1,加满后归零重复累加,byte0-5保持0x00状态,byte7保持K1按下后之前的状态不变,并且K1抬起后恢复要求1的功能,byte6数据清零;

3、通过K2按键切换CAN数据波特率,当K2按下超过1s后抬起,则切换CAN波特率为500k,再次按下K2超过1s后抬起,则切换CAN波特率为250k。

0 预备知识

   stm 32 基础知识、can基础知识、C语言

基础知识可参考如下链接,感谢如下三篇文章大神的帮助!

(66条消息) 秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4 CAN!_Wireless_Link的博客-CSDN博客_can控制器与can收发器

(66条消息) 第4课【STM32的时钟】时钟 时钟源 内外部时钟 高低速时钟_PORKWOTONLEE的博客-CSDN博客_stm32外部时钟和内部时钟

(66条消息) STM32CUBEMX系列——CAN通讯的配置_渔泽的博客-CSDN博客_stm32cubemx 配置can

  1. cubemx配置流程
  • ①选择芯片型号

 ②配置系统时钟

  • ③打开调试接口(非必要)

  • ④端口配置:这里包括CAN端口配置和GPIO口配置

 

  • ⑤配置系统中断优先级

  • ⑥输出选项设置

  • ⑦点击GENERATE CODE,生成工程文件

2.  keil5代码编写部分

  • ①main函数

  • ②can函数

过滤器配置

void CAN_Config(void)
{	

	CAN_FilterTypeDef  sFilterConfig;

  /*配置CAN过滤器*/
  sFilterConfig.FilterBank = 0;                     //过滤器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;//过滤器0关联到FIFO0
  sFilterConfig.FilterActivation = ENABLE;          //激活滤波器0
  sFilterConfig.SlaveStartFilterBank = 14;
	
	
 if(HAL_CAN_ConfigFilter(&hcan,&sFilterConfig) != HAL_OK)//初始化过滤器
 {
  Error_Handler();
 }
 if(HAL_CAN_Start(&hcan) != HAL_OK)//打开can
 {
  Error_Handler();
 }
 if(HAL_CAN_ActivateNotification(&hcan,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;
}

CAN发送函数

void CAN_senddata(CAN_HandleTypeDef *hcan,uint32_t can_id)
{
   TXHeader.StdId=can_id ;
	 TXHeader.ExtId=0x12345000;//0x12345000
	 TXHeader.DLC=8;
	 TXHeader.IDE=CAN_ID_EXT;
	 TXHeader.RTR=CAN_RTR_DATA;
	 TXHeader.TransmitGlobalTime = DISABLE;
	 if(KEY == 0)
    	HAL_CAN_AddTxMessage(hcan,&TXHeader,TXmessage,&pTxMailbox);
   else if(KEY == 1)
			
	 {
		 HAL_CAN_AddTxMessage(hcan,&TXHeader,RXmessage,&pTxMailbox);
		 KEY = 0;
	 }
}

CAN接收函数

uint32_t CAN1_Receive_Msg(u8 *buf)
{
 	u32 i;
	u8	RxData[8];

	if(HAL_CAN_GetRxFifoFillLevel(&hcan, CAN_RX_FIFO0) != 1)//没有接收到数据,直接退出 
	{
		return 0xF1;
	}

	if(HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &RXHeader, RxData) != HAL_OK)
	{
		return 0xF2;
	}
	
    for(i=0;i<RXHeader.DLC;i++)
    buf[i]=RxData[i];
	  return RXHeader.DLC;
}

  • ③中断服务函数编写(编写在stm32f1xx_it.c中)

  • ④在相关头文件添加声明

注意事项:

  1. 在配置波特率时,一定要明确时钟树的的频率,确保硬件的晶振参数和芯片分频参数的正确。
  2. 调节can的波特率可以在CubeMx中进行。软件可以帮助计算,这样可以节省时间去确定brp,tbs1,tbs2,三个参数。
  3. 对于接收数据只能使用中断去接收数据,倘若直接放在while循环中,接收不到,并且会使得程序卡死。
  4. 在程序中改变波特率时,一定要重新初始化,并且将所有的参数初始化,包括滤波器,邮箱等。
  5. 发送数据的频率不能太大,否则接收会存在丢数据的情况。

     6. 中断优先级需要配置,否则会冲突,根据需求去配置。

作者声明:第一次使用cubemx配置can通信工程文件,走了一些弯路,但是最后终于配置成功。在此,特别感谢CSDN各位大神各种知识帖以及宿友佳神的指导!本文撰写目的为帮助入门级嵌入式开发者上手CAN通信,无商业用途。如有侵权,请联系作者删除,谢谢。

### 回答1: STM32CubeMXSTMicroelectronics推出的一款用于生成STM32微控制器的初始化代码的图形化工具。它可以帮助您配置微控制器的各种硬件功能,包括CAN通信。 为了配置STM32CAN通信,您可以使用STM32CubeMX以下步骤: 1. 创建一个新项目 2. 选择您要使用的STM32微控制器 3. 在"配置"窗口中打开"外设"选项卡 4. 找到"CAN"选项,将其从"不使用"更改为"使用" 5. 配置CAN通信的具体参数,如波特率等 6. 生成代码并导入您的开发环境 7. 编写应用程序代码并使用它来发送和接收CAN消息 注意:这仅是一个大致的步骤,具体步骤可能因您所使用的STM32型号和开发环境而有所不同。请确保阅读STM32CubeMX的文档以获得最准确的信息。 ### 回答2: STM32CubeMX是ST公司推出的一个基于GUI的可视化开发工具,它可以帮助开发者快速生成STM32系列芯片的初始化代码,极大地提高了嵌入式软件开发的效率和质量。 在STM32CubeMX中,我们可以使用CAN协议实现嵌入式系统之间的通信,以下是如何在STM32CubeMX中进行通信配置的步骤: 1. 打开STM32CubeMX软件,选择想要进行通信的芯片型号,例如STM32F4。 2. 在左侧的Pinout选项卡中,选择CAN1或CAN2,将其重映射到想要使用的GPIO上。需要注意,重映射是必要的,否则默认的GPIO与CAN相关的引脚可能会被占用。 3. 在左侧的RCC选项卡中,使能CAN模块的时钟,设置CAN模式,例如为自发自收模式。 4. 在中间的Configuration选项卡中,对CAN进行详细的配置,包括波特率、过滤器、中断、DMA等参数。 5. 在中间的Code Generator选项卡中,选择所需的开发环境和代码生成方式,并生成初始化代码。 6. 将生成的代码添加到工程中,并根据需求进行修改和调整。 完成上述步骤后,就可以开始使用CAN协议进行通信了。需要注意的是,在通信过程中,需要对接收到的CAN消息进行解析和处理,以满足具体的应用需求。 总之,STM32CubeMX提供了极其方便和快捷的CAN通信配置方式,开发者可以大大缩短嵌入式系统开发的时间和精力,提高开发效率和质量。 ### 回答3: STM32CubeMX是ST公司推出的一款针对STM32系列微控制器的图形化配置软件,主要用于生成C代码的初始化代码和工程文件,简化了开发人员的工作流程。在开发STM32中,CAN通信是一种非常常用的通信方式。因此,本文主要介绍如何在STM32CubeMX配置CAN通信。 1. 创建新项目 首先,我们需要创建一个新的STM32项目。在STM32CubeMX主界面上,点击“New Project”按钮来创建一个新项目。然后,选择芯片型号和所需的工程文件夹位置。 2. 配置硬件 接下来,在“Pinout & Configuration”界面中配置硬件。首先,需要到“Connectivity”标签页下选择所需的CAN模块, 并将其和所需的GPIO引脚进行连接。在本例中,我们选择了CAN1模块,并将其与PA11和PA12 GPIO引脚连接。 3. 配置CAN参数 在“Configuration”标签页下,选择“CAN”开关并配置CAN参数。在本例中,我们选择了CAN1模块,并设置了以下参数: • Mode: Normal mode • Baudrate: 500 kbps • Time Quanta in Bit Segment 1: 13 • Time Quanta in Bit Segment 2: 2 • Prescaler: 4 4. 生成代码 完成上述配置之后,点击“Generate Code”按钮,STM32CubeMX会自动生成C代码的初始化代码和工程文件。 5. 编写CAN通信代码 在工程文件中添加CAN应用代码。在本例中,我们将使用HAL库,首先需要初始化CAN模块: /*CAN初始化*/ CAN_HandleTypeDef hcan1; CAN_FilterTypeDef can_filter; .... hcan1.Instance = CAN1; hcan1.Init.TimeTriggeredMode = DISABLE; hcan1.Init.AutoBusOff = DISABLE; hcan1.Init.AutoWakeUp = DISABLE; hcan1.Init.AutoRetransmission = DISABLE; hcan1.Init.ReceiveFifoLocked = DISABLE; hcan1.Init.TransmitFifoPriority = DISABLE; hcan1.Init.Mode = CAN_MODE_NORMAL; hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ; hcan1.Init.TimeSeg1 = CAN_BS1_13TQ; hcan1.Init.TimeSeg2 = CAN_BS2_2TQ; hcan1.Init.Prescaler = 4; if (HAL_CAN_Init(&hcan1) != HAL_OK) { Error_Handler(); } /*CAN过滤器初始化*/ can_filter.FilterBank = 0; can_filter.FilterMode = CAN_FILTERMODE_IDMASK; can_filter.FilterScale = CAN_FILTERSCALE_32BIT; can_filter.FilterIdHigh = 0x0000; can_filter.FilterIdLow = 0x0000; can_filter.FilterMaskIdHigh = 0x0000; can_filter.FilterMaskIdLow = 0x0000; can_filter.FilterFIFOAssignment = CAN_FILTER_FIFO0; can_filter.FilterActivation = ENABLE; can_filter.SlaveStartFilterBank = 14U; if (HAL_CAN_ConfigFilter(&hcan1, &can_filter) != HAL_OK) { Error_Handler(); } 接着,我们可以发送数据和接收数据: /*CAN发送数据*/ CAN_TxHeaderTypeDef TxHeader; TxHeader.StdId = 0x321; TxHeader.ExtId = 0x01; TxHeader.RTR = CAN_RTR_DATA; TxHeader.IDE = CAN_ID_STD; TxHeader.DLC = 8; TxHeader.TransmitGlobalTime = DISABLE; uint8_t TxData[8] = {0}; if (HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox) != HAL_OK) { Error_Handler(); } /*CAN接收数据*/ CAN_RxHeaderTypeDef RxHeader; uint8_t RxData[8]; if (HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK) { Error_Handler(); } 至此,我们成功完成了在STM32CubeMX中的CAN通信配置。但是,需要注意的是,本例只是一个简单的示例,实际的CAN通信可能需要更多的配置和调试。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值