STM32F427 CAN总线配置

1. 配置参数

使用CubeMax进行参数配置,将端口重映射到PD0和PD1
在这里插入图片描述
配置其他参数
在这里插入图片描述

2. 添加过滤器、重写接收函数、发送函数

#include "bsp_can.h"
#include "can.h"
#include "stm32f4xx_hal_can.h"
#include <stdio.h>
/*******************************************************************************************
  * @Func		my_can_filter_init
  * @Brief    CAN1和CAN2滤波器配置
  * @Param		CAN_HandleTypeDef* hcan
  * @Retval		None
  * @Date     2015/11/30
 *******************************************************************************************/
void CAN1_Filter_Config(void)
{
	//can1 &can2 use same filter config
	CAN_FilterTypeDef		CAN_FilterConfigStructure;

	CAN_FilterConfigStructure.FilterMode = CAN_FILTERMODE_IDMASK;
	CAN_FilterConfigStructure.FilterScale = CAN_FILTERSCALE_32BIT;
	CAN_FilterConfigStructure.FilterIdHigh = 0x0000;
	CAN_FilterConfigStructure.FilterIdLow = 0x0000;
	CAN_FilterConfigStructure.FilterMaskIdHigh = 0x0000;
	CAN_FilterConfigStructure.FilterMaskIdLow = 0x0000;
	CAN_FilterConfigStructure.FilterFIFOAssignment = CAN_FilterFIFO0;
	CAN_FilterConfigStructure.FilterBank = 14;//can1(0-13)和can2(14-27)分别得到一半的filter
	CAN_FilterConfigStructure.FilterActivation = ENABLE;

	if(HAL_CAN_ConfigFilter(&hcan1, &CAN_FilterConfigStructure) != HAL_OK)
	{
		printf("CAN Filter Config Fail!\r\n");
    Error_Handler();
	}
}

static CAN_TxHeaderTypeDef        TxMessage;    //CAN发送的消息的消息头
static CAN_RxHeaderTypeDef        RxMessage;    //CAN接收的消息的消息头  
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
		uint8_t  data[8];
		HAL_StatusTypeDef	status;
			
		status = HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxMessage, data);
		printf("--->Data Receieve!\r\n");
		if (HAL_OK == status){                              			
			printf("--->Data Receieve!\r\n");
			printf("RxMessage.StdId is %#x\r\n",  RxMessage.StdId);
			printf("data[0] is 0x%02x\r\n", data[0]);
			printf("data[1] is 0x%02x\r\n", data[1]);
			printf("data[2] is 0x%02x\r\n", data[2]);
			printf("data[3] is 0x%02x\r\n", data[3]);
			printf("<---\r\n");
		}
}
uint32_t  CAN_TX_BOX;
/* CAN 发送数据测试函数 */
void CAN1_Send_Test(void)
{
	printf("----------------Start-------------------\r\n");
	
  uint8_t data[4] = {0x01, 0x02, 0x03, 0x04};
  TxMessage.IDE = CAN_ID_STD;     //设置ID类型
	TxMessage.StdId = 0x111;        //设置ID号
  TxMessage.RTR = CAN_RTR_DATA;   //设置传送数据帧
	TxMessage.DLC = 4;              //设置数据长度
	TxMessage.TransmitGlobalTime = DISABLE;
	HAL_Delay(100); 
	
	if (HAL_CAN_AddTxMessage(&hcan1, &TxMessage, data, &CAN_TX_BOX) != HAL_OK) {
        printf("Send mail is %d\r\n", CAN_TX_BOX);
        Error_Handler();
  }		
	uint32_t mail = HAL_CAN_GetTxMailboxesFreeLevel(&hcan1);
	printf("Send mail is %d\r\n", CAN_TX_BOX);
	printf("Free mail is %d\r\n", mail);
	printf("CAN send test data success!\r\n");
}

3. 在Main函数中添加以下内容

  • 配置过滤器
CAN1_Filter_Config();
  • 开启CAN
if (HAL_CAN_Start(&hcan1) != HAL_OK) {
      printf("CAN Start Fail\r\n");
      Error_Handler();
  }
  printf("CAN Start Success\r\n");
  • CAN接收中断使能
if (HAL_CAN_Start(&hcan1) != HAL_OK) {
      printf("CAN Start Fail\r\n");
      Error_Handler();
  }
  printf("CAN Start Success\r\n");

  • 在main函数中必须有内容
  • 如果是正常模式,必须有接收的外设,不然发送邮箱会满,一直处于发送状态
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值