STM32F042 基于CubeMX HAL库CAN的配置

STM32F042 基于CubeMX  HAL库CAN的配置

首先说说使用时候的两个坑。

(1)要使能Swap PA9/10 –>PA11/12,这个时候PA11和PA12引脚才能出现。


(2)我第一步用的是回环模式。

大致是这样的。

 

While

{

SendCanMessage();

}

 

Can_interrupt

{

HAL_CAN_Receive_IT(hcan,CAN_FIFO0);

}

 

却发现只能中断一次不能返回了。

原因,配置好CAN后状态为HAL_CAN_STATE_READY。

 

设置为接收,

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CAN总线是一种高速、可靠的通信协议,可用于连接多个节点,例如汽车电子和工业控制系统。在STM32CubeMXHAL库中,使用CAN总线需要以下步骤: 1. 配置CAN硬件 在STM32CubeMX中,选择正确的芯片型号并打开CAN总线选项卡。在该选项卡中,您可以配置CAN的时钟、波特率和过滤器等参数。根据您的具体应用需求进行配置。 2. 初始化CAN总线 使用HAL库的CAN初始化函数`HAL_CAN_Init()`初始化CAN总线。该函数需要传入CAN_HandleTypeDef结构体,该结构体包含了CAN的基本参数。 ```c CAN_HandleTypeDef hcan; hcan.Instance = CANx; hcan.Init.Prescaler = 10; hcan.Init.Mode = CAN_MODE_NORMAL; hcan.Init.SyncJumpWidth = CAN_SJW_1TQ; hcan.Init.TimeSeg1 = CAN_BS1_13TQ; hcan.Init.TimeSeg2 = CAN_BS2_2TQ; hcan.Init.TimeTriggeredMode = DISABLE; hcan.Init.AutoBusOff = ENABLE; hcan.Init.AutoWakeUp = DISABLE; hcan.Init.AutoRetransmission = ENABLE; hcan.Init.ReceiveFifoLocked = DISABLE; hcan.Init.TransmitFifoPriority = DISABLE; if (HAL_CAN_Init(&hcan) != HAL_OK) { Error_Handler(); } ``` 3. 配置CAN过滤器 使用HAL库的CAN过滤器配置函数`HAL_CAN_ConfigFilter()`配置CAN过滤器,以确保只有特定的消息可以通过。该函数需要传入CAN_HandleTypeDef结构体和CAN_FilterTypeDef结构体,后者包括过滤器的掩码和ID等参数。 ```c CAN_FilterTypeDef sFilterConfig; sFilterConfig.FilterBank = 0; sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; sFilterConfig.FilterIdHigh = 0x0000; sFilterConfig.FilterIdLow = 0x0000; sFilterConfig.FilterMaskIdHigh = 0x0000; sFilterConfig.FilterMaskIdLow = 0x0000; sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; sFilterConfig.FilterActivation = ENABLE; sFilterConfig.SlaveStartFilterBank = 14; if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK) { Error_Handler(); } ``` 4. 发送CAN消息 使用HAL库的CAN消息发送函数`HAL_CAN_AddTxMessage()`发送CAN消息。该函数需要传入CAN_HandleTypeDef结构体和CAN_TxHeaderTypeDef结构体,后者包括消息的ID和数据等参数。 ```c CAN_TxHeaderTypeDef TxHeader; uint8_t aData[8]; TxHeader.StdId = 0x123; TxHeader.ExtId = 0x00; TxHeader.IDE = CAN_ID_STD; TxHeader.RTR = CAN_RTR_DATA; TxHeader.DLC = 8; TxHeader.TransmitGlobalTime = DISABLE; aData[0] = 0x01; aData[1] = 0x02; aData[2] = 0x03; aData[3] = 0x04; aData[4] = 0x05; aData[5] = 0x06; aData[6] = 0x07; aData[7] = 0x08; if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, aData, &TxMailbox) != HAL_OK) { Error_Handler(); } ``` 5. 接收CAN消息 使用HAL库的CAN消息接收函数`HAL_CAN_GetRxMessage()`接收CAN消息。该函数需要传入CAN_HandleTypeDef结构体和CAN_RxHeaderTypeDef结构体,后者包括消息的ID和数据等参数。 ```c CAN_RxHeaderTypeDef RxHeader; uint8_t aData[8]; if (HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &RxHeader, aData) != HAL_OK) { Error_Handler(); } ``` 以上就是使用STM32CubeMXHAL库的CAN总线应用教程。根据您的应用需求,您可以进一步优化CAN总线的配置和使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值