CAN总线学习笔记 | STM32CubeMX配置CAN环回测试

这篇具有很好参考价值的文章主要介绍了CAN总线学习笔记 | STM32CubeMX配置CAN环回测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

CAN基础知识介绍文中介绍了CAN协议的基础知识,以及STM32F4芯片的CAN控制器相关知识,下面将通过实例,利用STM32CubeMX图形化配置工具,来实现CAN通讯的环回测试

一、STM32CubeMX配置

  • CAN是挂载在APB1总线上,设置PCLK1时钟频率到最大45MHz

can回环测试,stm32,单片机,CAN通讯,CAN,环回测试

  • 激活CAN1,配置位时序参数,其他基本参数以及工作模式(此处设置为Loopback环回模式

can回环测试,stm32,单片机,CAN通讯,CAN,环回测试

CAN波特率的计算公式:只需要知道BS1和BS2的设置,以及APB1的时钟频率,就可以方便的计算出波特率。比如设置TS1=8、TS2=6和BRP=6,在APB1频率为45Mhz的条件下,即可得到CAN通信的波特率=45000/6/(8+6+1)=500Kbps
can回环测试,stm32,单片机,CAN通讯,CAN,环回测试

  • 激活USART1作为调试串口,配置相关LED对应的GPIO引脚作为指示灯

二、MDK-ARM编程

2.1 几个重要的结构体
  • CAN 初始化结构体:此结构体内容,可由STM32CubeMX工具进行配置
typedef struct
{
  uint32_t Prescaler;  					/* 配置 CAN 外设的时钟分频,可设置为 1-1024*/
  uint32_t Mode;       					/* 配置 CAN 的工作模式,回环或正常模式 */
  uint32_t SyncJumpWidth;  				/* 配置 SJW 极限值 */
  uint32_t TimeSeg1;   					/* 配置 BS1 段长度 */
  uint32_t TimeSeg2;   					/* 配置 BS2 段长度 */
  FunctionalState TimeTriggeredMode;   	/* 是否使能 TTCM 时间触发功能 */
  FunctionalState AutoBusOff;     		/* 是否使能 ABOM 自动离线管理功能 */
  FunctionalState AutoWakeUp;   		/* 是否使能 AWUM 自动唤醒功能 */
  FunctionalState AutoRetransmission;  	/* 是否使能 NART 自动重传功能 */
  FunctionalState ReceiveFifoLocked;   	/* 是否使能 RFLM 锁定 FIFO 功能 */
  FunctionalState TransmitFifoPriority;	/* 配置 TXFP 报文优先级的判定方法 */
} CAN_InitTypeDef;
  • 发送及接收头结构体:主要用于构造发送报文,以及接收报文。收发发文时,需要自定义头结构体变量
typedef struct
{
  uint32_t StdId;    			/* 存储报文的标准标识符 11 位,0-0x7FF. */
  uint32_t ExtId;    			/* 存储报文的扩展标识符 29 位,0-0x1FFFFFFF. */
  uint32_t IDE;     			/* 存储 IDE 扩展标志 */
  uint32_t RTR;    				/* 存储 RTR 远程帧标志 */
  uint32_t DLC;    				/* 存储报文数据段的长度,0-8 */
  FunctionalState TransmitGlobalTime; 
} CAN_TxHeaderTypeDef;

typedef struct
{
  uint32_t StdId;    			/* 存储报文的标准标识符 11 位,0-0x7FF. */
  uint32_t ExtId;    			/* 存储报文的扩展标识符 29 位,0-0x1FFFFFFF. */
  uint32_t IDE;     			/* 存储 IDE 扩展标志 */
  uint32_t RTR;      			/* 存储 RTR 远程帧标志 */
  uint32_t DLC;     			/* 存储报文数据段的长度,0-8 */
  uint32_t Timestamp; 
  uint32_t FilterMatchIndex; 
} CAN_RxHeaderTypeDef;
  • 过滤器结构体:STM32CubeMX不会初始化过滤器的相关内容,需要自己添加
typedef struct
{
  uint32_t FilterIdHigh;         	/*CAN_FxR1 寄存器的高 16 位 */
  uint32_t FilterIdLow;         	/*CAN_FxR1 寄存器的低 16 位 */
  uint32_t FilterMaskIdHigh;   		/*CAN_FxR2 寄存器的高 16 位 */
  uint32_t FilterMaskIdLow;    		/*CAN_FxR2 寄存器的低 16 位 */
  uint32_t FilterFIFOAssignment;  	/* 设置经过筛选后数据存储到哪个接收 FIFO */
  uint32_t FilterBank;            	/* 筛选器编号,范围 0-27,数据手册上说0-27是CAN1/CAN2共享,但是实测发现并不是这样,CAN1是0-13,CAN2是14-27 */
  uint32_t FilterMode;            	/* 筛选器模式 */
  uint32_t FilterScale;           	/* 设置筛选器的尺度 */
  uint32_t FilterActivation;      	/* 是否使能本筛选器 */
  uint32_t SlaveStartFilterBank;  	/* CAN2起始过滤器组 */
} CAN_FilterTypeDef;
2.2 程序编写
  • 生成工程后,打开can.c文件,可见STM32CubeMX已经对位时序参数、其他基本参数以及工作模式进行了初始化。但是并没有初始化过滤器的相关内容,因此需要我们自己添加,并在CAN初始化时调用
//下面的设置只使能了FIFO0,并不过滤任何消息
void CAN_Filter_Config(){
	CAN_FilterTypeDef sFilterConfig;
	
	sFilterConfig.FilterBank = 0;						//筛选器编号, CAN1是0-13, CAN2是14-27
	sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;	//采用掩码模式
	sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;	//设置筛选器的尺度, 采用32位
	sFilterConfig.FilterIdHigh = 0X0000;				//过滤器ID高16位,即CAN_FxR1寄存器的高16位
	sFilterConfig.FilterIdLow = 0X0000;					//过滤器ID低16位,即CAN_FxR1寄存器的低16位
	sFilterConfig.FilterMaskIdHigh = 0X0000;			//过滤器掩码高16位,即CAN_FxR2寄存器的高16位
	sFilterConfig.FilterMaskIdLow = 0X0000;				//过滤器掩码低16位,即CAN_FxR2寄存器的低16位
	sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;	//设置经过筛选后数据存储到哪个接收FIFO
	sFilterConfig.FilterActivation = ENABLE;			//是否使能本筛选器
	sFilterConfig.SlaveStartFilterBank = 14;			//指定为CAN1分配多少个滤波器组
	
	if(HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
	{
		Error_Handler();
	}
}
  • 编写发送和接收数据函数:此处将格式固定为标准数据帧,ID为12
uint8_t CAN1_Send_Msg(uint8_t *msg, uint8_t len){
	uint16_t i = 0;
	uint32_t txMailBox;
	uint8_t send_buf[8];
	
	txHeader.StdId = 12;
	txHeader.ExtId = 12;
	txHeader.IDE = CAN_ID_STD;
	txHeader.RTR = CAN_RTR_DATA;
	txHeader.DLC = len;
	
	for(i = 0; i < len; i++)
		send_buf[i] = msg[i];
	
	if(HAL_CAN_AddTxMessage(&hcan1, &txHeader, send_buf, &txMailBox) != HAL_OK)
		return 1;	
	return 0;
}

uint8_t CAN1_Recv_Msg(uint8_t *buf){
	uint16_t i = 0;	
	HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &rxHeader, buf);
	
	if(rxHeader.IDE == CAN_ID_STD)
		printf("StdId ID: %d\r\n", rxHeader.StdId);
	else
		printf("ExtId ID: %d\r\n", rxHeader.ExtId);
	
	printf("CAN IDE: %d\r\n", rxHeader.IDE);
	printf("CAN RTR: %d\r\n", rxHeader.RTR);
	printf("CAN DLC: %d\r\n", rxHeader.DLC);
	printf("Recv Data: ");
	
	for(i = 0; i < rxHeader.DLC; i++)
		printf("%c",buf[i]);
	
	printf("\n");
	return rxHeader.DLC;
}
  • 默认Cubemx生成的代码并没有can start,没有调用HAL_CAN_Start(&hcan1) 来使能CAN,因此需要在CAN初始化代码中添加
void MX_CAN1_Init(void){
	......
	/* USER CODE BEGIN CAN1_Init 2 */
	CAN_Filter_Config();
	HAL_CAN_Start(&hcan1);	
  	/* USER CODE END CAN1_Init 2 */
}
  • 主函数main.c中,代码如下
int main(void){
  	HAL_Init();
  	SystemClock_Config();
 	MX_GPIO_Init();
  	MX_CAN1_Init();
  	MX_USART1_UART_Init();
  	/* USER CODE BEGIN 2 */
	uint8_t ret,i;
	printf("CAN Testing....!\r\n");
	uint8_t txdata[8] = {76, 79, 79, 80, 66, 65, 67, 75};
	uint8_t rxdata[8];
  	/* USER CODE END 2 */
  	/* Infinite loop */
  	/* USER CODE BEGIN WHILE */
  	while (1)
  	{
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
		HAL_Delay(1000);
		printf("Start Send data...\r\n");
		
		ret = CAN1_Send_Msg(txdata, 8);
		if(ret == 0)
			printf("CAN Send success!\r\n");
		else 
			printf("CAN Send failed!\r\n");
		
		CAN1_Recv_Msg(rxdata);	
		printf("+++++++++++++++++++++++++++++++\r\n");
    	/* USER CODE END WHILE */
    	/* USER CODE BEGIN 3 */
  	}
  	/* USER CODE END 3 */
}

三、下载测试

编译无误后下载到开发板,可以看到系统运行时D1指示灯不断闪烁,串口不断的打印CAN环回测试的数据

can回环测试,stm32,单片机,CAN通讯,CAN,环回测试文章来源地址https://www.toymoban.com/news/detail-676855.html

到了这里,关于CAN总线学习笔记 | STM32CubeMX配置CAN环回测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记7 - STM32的CAN学习与测试2

    根据《KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记6 - STM32的CAN学习与测试1》的讨论,我实现了单机的回环模式的CAN测试。后来在测试中又有下面的积累。 在回环模式下,不会有ACK检定,也不会有ACK不应答的报警。 由于CANTX实际上并不把数据发给CAN收发器,只是在芯片里面转一圈就

    2024年02月22日
    浏览(37)
  • STM32 cubemx CAN STM32 CAN初始化详解

    接收用到的结构体如下: CAN概念:         全称Controller Area Network,是一种半双工,异步通讯。 物理层:         闭环:允许总线最长40m,最高速1Mbps,规定总线两端各有一个120Ω电阻,闭环        开环:最大传输距离1Km,最高速125Kbps,规定每根线串联一个2.2kΩ的电阻,

    2024年02月13日
    浏览(47)
  • STM32CubeMX学习笔记16--- STM32内部FLASH

    1. 内部FLASH简介         之前的文章中介绍过STM32F1利用SPI与外部FLASH(W25QXX芯片)通讯的例程,本例程将介绍STM32F1的内部FLASH,通过内部FLASH实现数据读写操作。 不同型号的STM32,其FLASH容量也有所不同,最小的只有16K字节,最大的则达到了1024K字节。此处我们使用的是ST

    2024年04月09日
    浏览(37)
  • STM32 cubemx CAN

    接收用到的结构体如下: CAN概念:         全称Controller Area Network,是一种半双工,异步通讯。 物理层:         闭环:允许总线最长40m,最高速1Mbps,规定总线两端各有一个120Ω电阻,闭环        开环:最大传输距离1Km,最高速125Kbps,规定每根线串联一个2.2kΩ的电阻,

    2024年01月18日
    浏览(27)
  • STM32初学入门笔记(2):STM32CubeMX配置STM32输出可调PWM方波

    PWM是一种应用广泛的利用微处理器的数字输出来对模拟电路进行控制的一种技术(即对脉冲宽度的控制)PWM同时也是驱动蜂鸣器,驱动舵机,通信等重要的一环,而对于初学者而言,点完灯的下一个程序就是驱动蜂鸣器,本篇将讲述如何使用及调整PWM输出频率,占空比 工程文

    2024年02月14日
    浏览(37)
  • CAN总线详解及STM32的CAN通信编程指南

    对于CAN通信而言,本人之前也未接触了解过,由于实习的技术要求,因此也花费了一段时间对CAN通信进行学习,并且实现了基于STM32的CAN环回静默模式通信,因此写一遍比较详细的文章对该内容进行总结。本文的参考资料有STM32的中文参考手册、协议手册等。话不多说开始吧!

    2024年02月11日
    浏览(31)
  • STM32的CAN总线调试经验分享

    CAN总线简易入门教程 CAN总线显性电平和隐性电平详解 STM32的CAN总线调试经验分享 最近负责的一个项目用的主控芯片是 STM32F407IGT6 ,需要和几个电机控制器进行通讯,有很多参数需要进行监控。负责固件开发的同事一直搞不定一个问题。就是开启 CAN 的接收中断,接收不到数据

    2024年01月20日
    浏览(36)
  • STM32 CAN总线过滤器设置

                                                                                                         CAN过滤器配置以及常见问题总结 过滤器组 在具有两个CAN的产品中,CAN1和CAN2分享28个过滤器组,只有一个CAN的系列产品中有14个过滤器组,用以对接收到的帧进行过

    2024年01月17日
    浏览(28)
  • CAN总线基础详解以及stm32的CAN控制器

    目录 CAN简介 CAN总线拓扑图 CAN总线特定 CAN应用场景 CAN的物理层 CAN的协议层 CAN数据帧介绍 CAN位时序介绍 数据同步过程 硬件同步 再同步 CAN总线仲裁 stm32的CAN控制器 CAN控制器介绍 CAN控制器模式 CAN控制器框图 接收过滤器 CAN控制器波特率计算 CAN相关寄存器 CAN主控制寄存器(

    2024年01月25日
    浏览(37)
  • STM32CubeIDE开发(二十六), STM32的CAN总线开发要点

    目录 一、CAN总线简介         1.1 CAN概述         1.2 CAN总线较其他串行通信优势         1.3 CAN总线通信          1.4 报文种类及格式          1.5 CAN应用 二、CAN工程创建及配置         2.1 工程设计及原理框图          2.2 工程创建接配置 三、代码设计

    2023年04月15日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包