使用HAL库开发STM32F103的CAN总线

配置接口

例程使用的是STM32F103C8T6

使用STM32CubeMX配置HAL的CAN

波特率的计算方式:

CAN波特率 = 总传输比特数 / 传输时间

CAN波特率 = CAN时钟 / ( (1 + CAN_BS1 + CAN_BS2) * CAN_Prescaler)

= 32M / ((1 + 1 + 2) * 8 ) = 1000000 bit / s

中断接收函数

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *h_can)
{
    int i = 0;
    uint8_t Data[8] = {0};
	CAN_RxHeaderTypeDef RxMessage;

    if (h_can == &hcan){
        // 获得接收到的数据头和数据
		if (HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &RxMessage, Data) == HAL_OK){		
			printf("\r\n################### CAN RECV ###################\r\n");
			printf("STID:0x%X\r\n",RxMessage.StdId);
			printf("EXID:0x%X\r\n",RxMessage.ExtId);
			printf("DLC :%d\r\n", RxMessage.DLC);
            // CAN_ID_STD 标准帧 或者  CAN_ID_EXT 扩展帧
			printf("IDE :%d %d %d\r\n", RxMessage.IDE, CAN_ID_STD, CAN_ID_EXT); 
            // CAN_RTR_DATA 数据帧 或者 CAN_RTR_REMOTE 远程帧
            printf("RTR :%d %d %d\r\n", RxMessage.RTR, CAN_RTR_DATA, CAN_RTR_REMOTE); 
			printf("DATA:");
			for(i = 0; i < RxMessage.DLC; i++){
				printf("0x%02X ", Data[i]);
			}
			printf("\r\n");
		}
    }
}

发送函数

// 透传数据格式
typedef struct _DataFormat{
	uint8_t m_Mode;  // 数据模式 (0:远程帧 1:数据帧)
    uint8_t m_Type;  // 帧类型 (0:标准数据帧 1:扩展数据帧)
    uint32_t m_STID; // 标准数据帧 ID 范围 (0x0000      - 0x07FF)
    uint32_t m_EXID; // 扩展数据帧 ID 范围 (0x0000_0000 - 0x1FFF_FFFF)
}DataFormat;

/**
 * @brief CAN 发送数据
 *
 * @param m_DataFormat
 * @param buff
 * @param len
 */
void BatCanTxData(DataFormat m_DataFormat,uint8_t buff[], uint8_t len)
{
    uint32_t TxMailbox;
    CAN_TxHeaderTypeDef TxHeader;

    // 标准数据帧 ID 范围 (0x0000      - 0x07FF) (要转为10进制)
	TxHeader.StdId = m_DataFormat.m_STID;
    // 扩展数据帧 ID 范围 (0x0000_0000 - 0x1FFF_FFFF) (要转为10进制)
	TxHeader.ExtId = m_DataFormat.m_EXID;
    // 帧类型 (0:标准数据帧 1:扩展数据帧)
    if(m_DataFormat.m_Type == 0)
	    TxHeader.IDE   = CAN_ID_STD;		// 标准帧
    else
	    TxHeader.IDE   = CAN_ID_EXT;		// 扩展帧
    // 数据模式 (0:远程帧 1:数据帧)
    if(m_DataFormat.m_Mode == 1)
	    TxHeader.RTR   = CAN_RTR_DATA;		// 数据帧
    else
	    TxHeader.RTR   = CAN_RTR_REMOTE;	// 远程帧

	TxHeader.DLC   = len;			// 帧长
	TxHeader.TransmitGlobalTime = DISABLE;

	HAL_StatusTypeDef state = HAL_CAN_AddTxMessage(
		&hcan,
		&TxHeader,
		buff,
		&TxMailbox
	);
	if(state != HAL_OK){
		printf("[%s]:> Can1 Tx ERROR<%02X>!\r\n", __func__, state);
	}
}

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32F103 HAL CAN是指基于STM32F103系列微控制器的HAL库函数对CAN通信进行支持。CAN(Controller Area Network)是一种常用的串行通信协议,广泛应用于汽车、工业控制和物联网等领域。 STM32F103 HAL CAN提供了一系列函数,用于配置STM32F103微控制器的CAN接口,实现CAN通信的发送和接收功能。通过HAL库函数,我们可以轻松地进行CAN通信的配置和使用STM32F103 HAL CAN的主要特点包括: 1. 灵活的配置:HAL库函数提供了丰富的配置选项,可以配置CAN通信的波特率、工作模式、过滤器等参数,以适应不同的应用需求。 2. 简化编程:HAL库函数封装了底层的寄存器操作和配置过程,简化了编程的复杂度,使开发者能够更加便捷地完成CAN通信的编程。 3. 多种发送模式:HAL库函数支持多种CAN发送模式,包括单次发送、自动重传和FIFO队列发送等,以满足不同应用场景的要求。 4. 接收过滤:HAL库函数提供了多种接收过滤模式,可以根据ID、数据内容和数据长度等条件进行过滤,以便只接收感兴趣的CAN帧。 5. 错误管理:HAL库函数具备完善的错误管理机制,能够实时监测CAN通信的错误情况,并提供相应的错误处理函数。 总之,STM32F103 HAL CAN是一套功能强大的库函数,为开发者提供了高效、可靠的CAN通信解决方案。使用STM32F103 HAL CAN,开发者可以轻松实现各种CAN通信应用,提升开发效率和产品可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值