利用CUBEMX生成CAN1和CAN的收发程序(STM32F429)

首先在RCC中把晶振设置为外部晶振

时钟图设置如下

can1和can2设置波特率250k,开接收中断,并配置IO

设置NVIC

配置路径,生成代码

 

打开MDK工程后,需要进行以下设置才可完成收发通讯

1、增加过滤器设置

2、开启启动函数

3、开启接收

4、编写回调函数

    //CAN1设置,注意FilterBank 为0-13
    CAN1_FilerConf.FilterFIFOAssignment = CAN_FILTER_FIFO0; //过滤器0关联到FIFO0
    CAN1_FilerConf.SlaveStartFilterBank = 0;        //过滤器0
    CAN1_FilerConf.FilterMode = CAN_FILTERMODE_IDMASK;
    CAN1_FilerConf.FilterScale = CAN_FILTERSCALE_32BIT;
    CAN1_FilerConf.FilterActivation = ENABLE; //激活滤波器0
    CAN1_FilerConf.FilterBank = 1;
    CAN1_FilerConf.FilterIdHigh = 0x00; //0XC007;     //32位ID
    CAN1_FilerConf.FilterIdLow = 0x00; //0X8200;
    CAN1_FilerConf.FilterMaskIdHigh = 0x00; //0XC007; //32位MASK
    CAN1_FilerConf.FilterMaskIdLow = 0x00; //0XFA00;

    if (HAL_CAN_ConfigFilter(&hcan1, &CAN1_FilerConf) != HAL_OK)
        Error_Handler();      //滤波器初始化
	
	HAL_CAN_Start(&hcan1);
	
	HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);

    //CAN设置,注意FilterBank 为14-27
    CAN2_FilerConf.FilterFIFOAssignment = CAN_FILTER_FIFO0; //过滤器0关联到FIFO0
    CAN2_FilerConf.SlaveStartFilterBank = 14;        //过滤器14
    CAN2_FilerConf.FilterMode = CAN_FILTERMODE_IDMASK;
    CAN2_FilerConf.FilterScale = CAN_FILTERSCALE_32BIT;
    CAN2_FilerConf.FilterActivation = ENABLE; //激活滤波器0
    CAN2_FilerConf.FilterBank = 14;
    CAN2_FilerConf.FilterIdHigh = 0x00; //0XC007;     //32位ID
    CAN2_FilerConf.FilterIdLow = 0x00; //0X8200;
    CAN2_FilerConf.FilterMaskIdHigh = 0x00; //0XC007; //32位MASK
    CAN2_FilerConf.FilterMaskIdLow = 0x00; //0XFA00;

    if (HAL_CAN_ConfigFilter(&hcan1, &CAN2_FilerConf) != HAL_OK)
        Error_Handler();      //滤波器初始化
	
	HAL_CAN_Start(&hcan2);
	
	HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING);

/**
  * @brief 中断回调函数
  */
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
	if (hcan->Instance == hcan1.Instance)
	{
		uint8_t buf[8];
		CAN_RxHeaderTypeDef CAN_RX_HDR;
		if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &CAN_RX_HDR, buf)			// 获得接收到的数据头和数据
				== HAL_OK)
		{
			HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING);	// 再次使能FIFO0接收中断
		}
	}
	if (hcan->Instance == hcan2.Instance)
	{
		uint8_t buf[8];
		CAN_RxHeaderTypeDef CAN_RX_HDR;
		if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &CAN_RX_HDR, buf)			// 获得接收到的数据头和数据
				== HAL_OK)
		{
			HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING);	// 再次使能FIFO0接收中断
		}
	}
}

剩下的只需要在main函数中编写发送函数即可,亲测可以实现CAN1和CAN2的数据收发

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值