stm32can通信实例hal库 HAL_CAN_Transmit
时间: 2025-06-28 11:19:36 浏览: 18
### STM32 HAL库 CAN通信 `HAL_CAN_Transmit` 示例代码
对于STM32微控制器系列,利用HAL库实现CAN总线消息传输是一项常见需求。下面展示如何通过`HAL_CAN_Transmit`函数来完成这一操作。
#### 初始化CAN外设配置
为了能够成功调用`HAL_CAN_Transmit`,首先需要初始化CAN模块并设置相应的参数:
```c
/* 定义全局变量 */
CAN_HandleTypeDef hcan;
void MX_CAN_Init(void)
{
/* 配置CAN初始化结构体 */
hcan.Instance = CAN1;
hcan.Init.Prescaler = 9;
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 = DISABLE;
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();
}
}
```
此部分代码负责设定波特率及时序等重要属性[^1]。
#### 创建和发送CAN帧
当CAN接口已经准备好之后,就可以创建要发送的消息,并将其传递给`HAL_CAN_Transmit`函数执行实际的数据传送过程了:
```c
#include "main.h"
#define TX_MAILBOX 0
int main(void)
{
uint8_t data[] = {0x01, 0x02, 0x03, 0x04};
CanTxMsgTypeDef TxMessage;
// ...省略其他初始化...
while (1)
{
/* 设置待发报文ID */
TxMessage.StdId = 0x321;
TxMessage.IDE = CAN_ID_STD;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.DLC = sizeof(data);
memcpy(TxMessage.Data, data, sizeof(data));
/* 调用API发送数据 */
if(HAL_CAN_AddTxMessage(&hcan, &TxMessage, NULL, TX_MAILBOX) != HAL_OK){
// 错误处理逻辑...
}
// 延迟一段时间再继续下一次循环
HAL_Delay(1000);
}
}
// 中断服务程序用于检测发送状态变化事件
void HAL_CAN_TxCpltCallback(CAN_HandleTypeDef *CanHandle)
{
// 当前缓冲区中的消息已成功发出后的回调动作
}
```
上述例子展示了怎样构建一个标准格式的CAN帧并通过指定邮箱索引号提交给硬件层去广播出去。同时定义了一个中断回调函数以便于得知何时完成了特定事务的操作[^2]。
请注意,在真实应用场景里还需要考虑更多细节比如错误恢复机制以及多任务环境下的同步等问题。
阅读全文
相关推荐


















