程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

STM32F427 CAN总线配置

发布于2021-05-30 20:22     阅读(1183)     评论(0)     点赞(5)     收藏(1)


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函数中必须有内容
  • 如果是正常模式,必须有接收的外设,不然发送邮箱会满,一直处于发送状态


所属网站分类: 技术文章 > 博客

作者:天神下凡

链接:http://www.phpheidong.com/blog/article/86847/320d65b0d47a9bf060f7/

来源:php黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

5 0
收藏该文
已收藏

评论内容:(最多支持255个字符)