VeryDelicious 2024-12-01 17:14 采纳率: 0%
浏览 119

STM32:HAL_CAN_AddTxMessage()函数,最后一个参数即发送邮箱的传参是否可以填0问题!

问题:

关于STM32 CAN通信 发送函数 HAL_CAN_AddTxMessage()的最后一个参数填0和定义一个变量取地址的问题,如果直接传0,我实验发现 STM32F103C8T6 会出现卡死的情况,进入了硬件中断,而对于STM32F429IGT6则不会卡死,能够正常运行;如果定义一个uint32_t类型的变量,取变量的地址传参进去,两个片子都能够正常运行,目前搞不懂什么原因,对于直接传0进去,我知道这是不规范的,相当于传入了一个空指针进去,而跳到函数内部发现,HAL_CAN_AddTxMessage()函数还对此指针进行了解引用,这肯定是非法,但是同样的情况对于F429IGT6却能正常运行,这令我非常不解。望请道友解答!

下面是我自己写的CAN2发送函数:

uint32_t mailbox = 10;

void CAN2_UsrSendTest(void)
{
 CAN_TxHeaderTypeDef TxHead;
 TxHead.IDE = CAN_ID_STD;
 TxHead.StdId = 0x10;
 TxHead.RTR = CAN_RTR_DATA;
 TxHead.DLC = 8;

 uint8_t payload[8];

 if(HAL_CAN_AddTxMessage(&hcan2, &TxHead, payload, 0) != HAL_OK)
 {
     Error_Handler();
     }
}

源码中HAL_CAN_AddTxMessage()函数对pTxMailbox进行了解引用

img

  • 写回答

2条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    在STM32中,使用HAL库进行CAN通信时,HAL_CAN_AddTxMessage()函数的最后一个参数是一个指向uint32_t类型的指针,这个指针用来存储所选的邮箱地址。当你想发送一个CAN消息时,你需要为这个函数提供一个有效的邮箱地址。

    关于你的问题,直接传0进去导致的问题可能有以下几种原因:

    1. 非法解引用:正如你所说,直接传0相当于传入了一个空指针。在函数内部对这个指针进行解引用操作会导致未定义的行为,可能是导致程序崩溃或进入死循环的原因。尽管某些MCU可能允许这样的操作而不出现问题(可能是因为有特定的错误处理机制),但这并不是一种良好的编程实践。
    2. 硬件差异:不同型号的STM32可能会有不同的内部实现和错误处理机制。即使函数内部对传入的指针进行了错误处理,不同型号的MCU可能处理方式不同。这可能是为什么STM32F429IGT6能够正常运行而STM32F103C8T6出现卡死情况的原因。

    解决建议:

    • 始终为HAL_CAN_AddTxMessage()的最后一个参数提供一个有效的变量地址,而不是直接传0。这样可以确保代码的健壮性和可移植性。
    • 检查你的CAN初始化配置和中断处理函数是否正确配置和实现了。不正确的配置或中断处理可能会导致意外的行为。
    • 如果可能的话,查阅STM32的参考手册和HAL库的源代码,了解HAL_CAN_AddTxMessage()函数内部如何处理这个参数以及是否有关于邮箱地址的特殊要求。

    最后,如果代码有异常表现(如卡死或崩溃),建议使用调试器进行调试,查看具体是哪一行代码或哪个操作导致了问题。这有助于更准确地定位问题原因。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月1日