STM32CubeMX生成CAN相关程序二(发送中断与接收中断)

一、使用simulink对can信号进行拆包解析

/*__weak */void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
	// CAN数据接收
	uint8_t ind;
	if (hcan->Instance == hcan1.Instance)
	{
		if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &hcan1_rx_temp.can_rx_temp, hcan1_rx_temp.can_rx_arry) == HAL_OK)		// 获得接收到的数据头和数据
		{
			if(hcan1_rx_temp.can_rx_temp.StdId == 0x2A2)
			{

				CAN_s_Siganal_2A2.ID = 0x2A2;
				CAN_s_Siganal_2A2.Length = hcan1_rx_temp.can_rx_temp.DLC;
				for(ind = 0; ind < CAN_s_Siganal_2A2.Length; ind++)
				{
					CAN_s_Siganal_2A2.Data[ind] = hcan1_rx_temp.can_rx_arry[ind];
				}
			}
			HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING);						// 再次使能FIFO0接收中断
		}
	}
}

在CAN接收中断回调函数中对ID为0x2A2的报文进行处理,将数据传递给应用层全局变量CAN_s_Siganal_2A2。

void Task_For_100ms(void)
{	

	APP_Can_step();
	
	APP_Mannual_Tx_Deal();
	
	APP_Mannual_Rx_Deal();
	
	
}
void APP_Mannual_Rx_Deal(void)
{
	if(CAN_MMI_Gclean_Key > 0)
	{
		HAL_GPIO_WritePin(GPIOB, LED_DS0_Pin, GPIO_PIN_RESET);
	}
	else
	{
		if(CAN_MMI_SceneModeReq ==1 || CAN_MMI_SceneModeReq == 3 || CAN_MMI_SceneModeReq == 5)
		{
			HAL_GPIO_WritePin(GPIOB, LED_DS0_Pin, GPIO_PIN_RESET);
		}
		else
		{
			HAL_GPIO_WritePin(GPIOB, LED_DS0_Pin, GPIO_PIN_SET);
		}
	}
	
}

应用层变量CAN_s_Siganal_2A2会被应用层进行解析拆包,CAN_MMI_Gclean_Key 与CAN_MMI_SceneModeReq 即为拆包后的两个变量。LED0会根据CAN_MMI_Gclean_Key 与CAN_MMI_SceneModeReq 进行响应。

二、使用simulink对信号进行打包发现can

  while (1)
  {
    /* USER CODE END WHILE */
#if 1	
		if(KEY_Scan(0) > 0)
		{
			LIN_FCP_FrDefScan_Value = 1;
		}
#endif

    /* USER CODE BEGIN 3 */
  }
void APP_Mannual_Tx_Deal(void)
{
	static uint8_t index = 0;
	
	hcan1_tx_temp.can_tx_temp.StdId = CAN_s_Siganal_2A5.ID;
	for(uint8_t i = 0; i < CAN_s_Siganal_2A5.Length; i++)
	{
		hcan1_tx_temp.can_tx_arry[i] = CAN_s_Siganal_2A5.Data[i];
	}
	
	CAN1_Send_Msg(&hcan1_tx_temp);
	
	if((LIN_FCP_FrDefScan_Value>0)&& (index < 3))
	{
		index++;
		if(index > 3 - 1)
		{
			LIN_FCP_FrDefScan_Value = 0;
			index = 0;
		}
	}

}

按键按下后,LIN_FCP_FrDefScan_Value变量置1,LIN_FCP_FrDefScan_Value经过应用层打包后传递给CAN_s_Siganal_2A5。在100ms task中,CAN_s_Siganal_2A5传递给hcan1_tx_temp,然后进行发送。LIN_FCP_FrDefScan_Value的positive信号只发送3帧,3帧后清零。

APP_Can_step()即为应用层代码。

代码记录:
STM32_Deal_A004

以上,仅为本人自用。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值