stm32f767 CAN初始化

该代码示例展示了在STM32中如何初始化CAN模块,设置过滤器,启动CAN功能并启用接收中断。当接收到数据时,程序会根据接收到的数据执行特定逻辑,并将处理后的数据通过CAN接口发送出去。如果发送失败,程序会打印错误信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://blog.csdn.net/prolop87/article/details/122671441?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168135467916800192285929%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=168135467916800192285929&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-122671441-null-null.142v83insert_down38,201v4add_ask,239v2insert_chatgpt&utm_term=cubemx%20can&spm=1018.2226.3001.4187

main.c

uint8_t Rx_Flag;
uint8_t Tx_Flag;
uint8_t RxBuf[8];
uint8_t TxBuf[8];
uint8_t key;


	  CAN_Filter_Init();  //设置CAN1过滤器
	  HAL_CAN_Start(&hcan1);  //使能CAN功能
  HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING); // 使能中断
//if(Rx_Flag)   //如果接收标志位被置1,则开展逻辑判断
//		{
			printf("Receive Succeed !\r\n");
			
			//接收数据执行逻辑判断,根据判断结果设置发送内容
//			if(RxBuf[2] == 0xAA && RxBuf[3] == 0xBB) TxBuf[2] = 0x01;
//			else if(RxBuf[2] == 0xAA && RxBuf[3] == 0xCC) TxBuf[3] = 0x03;
//			else if(RxBuf[2] == 0xAA && RxBuf[3] == 0xDD) TxBuf[4] = 0x05;
//			else
			TxBuf[0] = 0x1F, TxBuf[1] = 0x40, TxBuf[2] = 0x0F,TxBuf[3] = 0xA0, TxBuf[4] = 0x02,TxBuf[5] = 0xD0,TxBuf[6] = 0xD0;
			
			Tx_Flag = CAN_Send_Msg(TxBuf,8);       //发送数据,根据返回值判定发送是否异常
			if(Tx_Flag) printf("Send failed ,please check your data !\r\n");   //返回1代表数据发送异常
			else printf("Send completed !\r\n");
//			
			//清空接收、发送数组,保留Rxbuf内容
			memset(RxData,0,sizeof(RxData));
			memset(TxBuf,0,sizeof(TxBuf));
//			HAL_Delay(50);
			
//			Rx_Flag = 0;                 //标志位置0,等待下一次中断
//		}

can.c

/*CAN过滤器初始化*/
void CAN_Filter_Init(void)
{
	CAN_FilterTypeDef sFilterConfig;
	
  sFilterConfig.FilterBank = 0;                    /* 过滤器组0 */
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;  /* 屏蔽位模式 */
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; /* 32位。*/
  
  sFilterConfig.FilterIdHigh         = (((uint32_t)CAN_RxExtId<<3)&0xFFFF0000)>>16;				/* 要过滤的ID高位 */
  sFilterConfig.FilterIdLow          = (((uint32_t)CAN_RxExtId<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF; /* 要过滤的ID低位 */
  sFilterConfig.FilterMaskIdHigh     = 0xFFFF;			/* 过滤器高16位每位必须匹配 */
  sFilterConfig.FilterMaskIdLow      = 0xFFFF;			/* 过滤器低16位每位必须匹配 */
  sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;           /* 过滤器被关联到FIFO 0 */
  sFilterConfig.FilterActivation = ENABLE;          /* 使能过滤器 */ 
  sFilterConfig.SlaveStartFilterBank = 14;
	
	if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
  {
		/* Filter configuration Error */
    Error_Handler();
  }
	
  if (HAL_CAN_Start(&hcan1) != HAL_OK)
  {
    /* Start Error */
    Error_Handler();
  }
	
	  /*##-4- Activate CAN RX notification #######################################*/
  if (HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
  {
    /* Start Error */
    Error_Handler();
  }
	
	TxHeader.ExtId=CAN_TxExtId;        //扩展标识符(29位)
	TxHeader.IDE=CAN_ID_EXT;    //使用扩展帧
	TxHeader.RTR=CAN_RTR_DATA;  //数据帧
	TxHeader.DLC=8; 
	TxHeader.TransmitGlobalTime = DISABLE;


}

/*CAN发送数据,入口参数为要发送的数组指针,数据长度,返回0代表发送数据无异常,返回1代表传输异常*/
uint8_t CAN_Send_Msg(uint8_t* msg,uint8_t len)
{	
  uint8_t i=0;
	uint32_t TxMailbox;
	uint8_t message[8];
 
	TxHeader.ExtId=CAN_TxExtId;        //扩展标识符(29位)
	TxHeader.IDE=CAN_ID_EXT;    //使用扩展帧
	TxHeader.RTR=CAN_RTR_DATA;  //数据帧
	TxHeader.DLC=len;    
	
  for(i=0;i<len;i++)
  {
		message[i]=msg[i];
	}
	
  if(HAL_CAN_AddTxMessage(&hcan1, &TxHeader, message, &TxMailbox) != HAL_OK)//发送
	{
		return 1;
	}
	while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan1) != 3) {}
    return 0;
}
/*CAN接收中断函数*/
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *CanNum)
{
	uint32_t i;
	
	Rx_Flag =1;  //接收标志位
	HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, RxData);
	for(i=0;i<RxHeader.DLC;i++)  RxBuf[i]=RxData[i];  //用RxBuf转存RxData的数据
}

can.h

#define CAN_RxExtId 0x1800D8D0
#define CAN_TxExtId 0x1800D0D8


void CAN_Filter_Init(void);   //过滤器配置函数
uint8_t CAN_Send_Msg(uint8_t* msg,uint8_t len);  //数据发送函数
 
extern CAN_TxHeaderTypeDef	TxHeader;      //发送
extern CAN_RxHeaderTypeDef	RxHeader;      //接收
extern uint8_t	RxData[8];   //数据接收数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值