STM32F767IGT6的CAN通讯,CubeMAX(详细步骤_总结)

本文主要记录和总结STM32F767IGT6配置CAN通讯,参考正点原子的HAL库相关例程。工程中的串口配置和printf重定向不在总结。

步骤1:时钟配置

步骤2:CAN配置

波特率是500k

步骤3:TIM3配置

定时器配置作用是在,定时器中断中每1ms接收CAN数据一次

步骤4:CAN.c函数过滤器配置

extern uint8_t CANRecFlag ;     //CAN接收表示,完成 1 
extern uint8_t CANRec_buff[8];  //CAN接受到的数据位
extern CAN_RxHeaderTypeDef CANRec_msg; //接收消息
CAN_TxHeaderTypeDef     TxMessage;      //发送消息


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 = 6;
  hcan1.Init.Mode = CAN_MODE_NORMAL;
  hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan1.Init.TimeSeg1 = CAN_BS1_11TQ;
  hcan1.Init.TimeSeg2 = CAN_BS2_6TQ;
  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  CAN1_FilerConf;        
	CAN1_FilerConf.FilterBank 	= 0; 					//过滤器0
	CAN1_FilerConf.FilterMode		=	CAN_FILTERMODE_IDMASK;
	CAN1_FilerConf.FilterScale	=	CAN_FILTERSCALE_32BIT;
	CAN1_FilerConf.FilterIdHigh	=	0X0000;     //32位ID
	CAN1_FilerConf.FilterIdLow	=	0X0000;
	CAN1_FilerConf.FilterMaskIdHigh	=	0X0000; //32位MASK
	CAN1_FilerConf.FilterMaskIdLow	=	0X0000;  
	CAN1_FilerConf.FilterFIFOAssignment	=	CAN_FILTER_FIFO0;//过滤器0关联到FIFO0
	CAN1_FilerConf.FilterActivation	=	ENABLE; //激活滤波器0
	CAN1_FilerConf.SlaveStartFilterBank = 14;
	
	if(HAL_CAN_ConfigFilter(&hcan1,&CAN1_FilerConf)!=HAL_OK) 
	{
		 Error_Handler();//滤波器初始化
	}	
	if(HAL_CAN_Start(&hcan1)!=HAL_OK) 
	{
		 Error_Handler();//CAN打开
	}	
  /* USER CODE END CAN1_Init 2 */

}

发送函数

/**
 * @brief       CAN 发送一组数据
 * @note        ID_IDE: 标准ID, 数据帧
 * @param       ID   : 标准ID(11位)
 * @param       Msg  : 数据指针,最大为8个字节.
 * @param       Len  : 数据长度(最大为8)
 * @retval     
 */
uint8_t CAN_Send_Msg(uint32_t ID, uint8_t *Msg, uint8_t Len,uint32_t ID_IDE)
{
    uint32_t TxMailbox = CAN_TX_MAILBOX0;
    TxMessage.StdId = ID;                 /* 标准标识符 */
    TxMessage.ExtId = ID;                 /* 扩展标识符(29位) */
	/*表示CAN消息的标识符扩展位,用于指示标识符是标准标识符还是扩展标识符*/
    TxMessage.IDE = ID_IDE;            //CAN_ID_EXT ;CAN_ID_STD  						   	          
    TxMessage.RTR = CAN_RTR_DATA;         /* 数据帧 */
    TxMessage.DLC = Len;

    if (HAL_CAN_AddTxMessage(&hcan1, &TxMessage, Msg, &TxMailbox) != HAL_OK) /* 发送消息 */
    {
             /* Transmission request Error */
				Error_Handler();
    }   
    return 0;
}

接收函数

/**
 * @brief       CAN 接收数据查询
 * @retval      接收结果
 *   @arg       0   , 无数据被接收到;
 *   @arg       其他, 接收的数据长度
 */
uint8_t CAN_Recv_Msg(void)
{
    if (HAL_CAN_GetRxFifoFillLevel(&hcan1, CAN_RX_FIFO0) >=1)                                              /* 没有接收到数据 */
    {
        if (HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &CANRec_msg, CANRec_buff) == HAL_OK)                         /* 读取数据 */
				{
						CANRecFlag = 1;
				}
    }
    return CANRec_msg.DLC;
}

定时器初始化中打开定时器中断

在中断函数中添加接收函数

void TIM3_IRQHandler(void)
{
  /* USER CODE BEGIN TIM3_IRQn 0 */

  /* USER CODE END TIM3_IRQn 0 */
  HAL_TIM_IRQHandler(&htim3);
  /* USER CODE BEGIN TIM3_IRQn 1 */
	CAN_Recv_Msg();
  /* USER CODE END TIM3_IRQn 1 */
}

main.c函数中进行处理

while (1)
  {
		if(CANRecFlag)
		{
			CANRecFlag = 0;
			if(CANRec_msg.IDE == CAN_ID_EXT)
			{
				CAN_Send_Msg(CANRec_msg.ExtId,CANRec_buff,8,CAN_ID_EXT);
				for(int i=0;i < 8;i++)
				{							
					printf("CANRec_buff[%d]==%d \r\n",i,CANRec_buff[i]);
				}
			}
			else if (CANRec_msg.IDE == CAN_ID_STD)
			{
				CAN_Send_Msg(CANRec_msg.StdId,CANRec_buff,8,CAN_ID_STD);
				for(int i=0;i < 8;i++)
				{							
					printf("CANRec_buff[%d]==%d \r\n",i,CANRec_buff[i]);
				}
			}
		}
}

效果

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32F767IGT6STM32F429IGT6是STMicroelectronics推出的两款32位ARM Cortex-M微控制器。下面是两者的比较: 1. 处理器性能:STM32F767IGT6采用了ARM Cortex-M7内核,主频可达216 MHz,提供了更高的处理能力和更快的执行速度。而STM32F429IGT6使用了ARM Cortex-M4内核,主频为180 MHz。 2. 存储容量:STM32F767IGT6具有1MB的闪存和320KB的SRAM,而STM32F429IGT6则仅有1MB的闪存和256KB的SRAM。因此,前者提供了更大的存储容量,可以用于存储更多的程序和数据。 3. 外设和接口:两者均具有丰富的外设和接口,如多个USART、SPI、I2C、USB等。然而,STM32F767IGT6还拥有更多的接口和外设,如以太网MAC、SDIO、SDMMC、QSPI等,可以提供更多的连接和扩展选项。 4. 电源管理:STM32F767IGT6支持更多的低功耗模式,包括多个待机模式和休眠模式。这样可以进一步降低功耗,延长电池寿命。 5. 其他特性:STM32F767IGT6在外设和性能方面拥有一些额外的特性,如更多的定时器、DMA通道和ADC转换通道。同时,它还提供了更多的扩展功能,如温度传感器和自检。 综上所述,STM32F767IGT6在处理能力、存储容量、外设和接口等方面都更为强大,适用于对性能要求较高的应用场景。而STM32F429IGT6则适用于对功耗和成本有更高要求的应用。选择适合的芯片需根据具体应用需求来决定。 ### 回答2: STM32F767IGT6STM32F429IGT6是两种不同型号的STM32单片机。它们在处理器核心、性能、外设等方面存在一些不同。 首先,STM32F767IGT6采用了ARM Cortex-M7内核,而STM32F429IGT6采用了ARM Cortex-M4内核。相对于Cortex-M4内核,Cortex-M7内核具有更强大的计算性能和更高的操作速度。 其次,STM32F767IGT6拥有更大的闪存和SRAM容量。它有2MB的闪存和512KB的SRAM,而STM32F429IGT6只有1MB的闪存和256KB的SRAM。更大的存储容量使得STM32F767IGT6能够运行更复杂的应用程序和存储更多的数据。 此外,STM32F767IGT6STM32F429IGT6在外设方面也有一些差异。两者都配备了通用I/O端口、定时器、串行通信接口、USB接口等常见外设,但STM32F767IGT6还集成了以太网控制器、SDIO接口、CAN接口等更多功能。 总体上看,STM32F767IGT6相对于STM32F429IGT6具有更强大的处理器和更大的存储空间,可以支持更复杂的应用程序,并且集成了更多的外设功能。然而,选择适合的型号还要根据具体的应用需求和成本考虑。 ### 回答3: STM32F767IGT6STM32F429IGT6是STM32系列微控制器的两个不同型号。以下是它们之间的比较: 处理器性能:STM32F767IGT6采用Cortex-M7内核,主频为216 MHz,而STM32F429IGT6采用Cortex-M4内核,主频为180 MHz。因此,STM32F767IGT6具有更高的处理性能和更快的时钟速度。 存储容量:STM32F767IGT6具有更大的Flash存储器,容量为2 MB,而STM32F429IGT6的Flash容量为1 MB。此外,STM32F767IGT6还具有更大的RAM容量,为512 KB,而STM32F429IGT6的RAM容量为256 KB。 外设功能:STM32F767IGT6STM32F429IGT6都具有许多通用和专用外设,如UART、SPI、I2C、ADC和定时器等。然而,STM32F767IGT6具有更多的GPIO脚,为216个,比STM32F429IGT6的112个更多。此外,STM32F767IGT6还具有更多的专用外设,如以太网MAC、USB OTG等。 功耗:由于采用了不同的内核和处理器架构,STM32F767IGT6在性能方面可能会更耗电。对于更低功耗要求的应用,STM32F429IGT6可能是更好的选择。 总结STM32F767IGT6STM32F429IGT6在处理器性能、存储容量、外设功能和功耗方面有所区别。选择哪个型号主要取决于具体的应用需求和性能要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值