STM32
直播中

刘浩

7年用户 1047经验值
私信 关注
[问答]

STM32F4 HAL库下CAN发送导致FLASH报错怎么解决?

[td]                                                                                                                        芯片型号为:STM32F407VET6。使用CubeMX配置并生成HAL库。
在工程中,配置了CAN1和CAN2。并且调用了函数HAL_CAN_AddTxMessage( hcan2,  xCAN2.TxHead, xCAN2.TxdBuf, (uint32_t *)CAN_TX_MAILBOX1);该函数的第4个形参是邮箱号,值为2.
在HAL_CAN_AddTxMessage函数中,将邮箱号重映射为一个地址,然后对这个地址(0x00000002)进行数据写入。

系统硬件设计的自举模式为主FLASH,如下图所示。

每次调用HAL_CAN_AddTxMessage发送函数,都会向0x00000002U的地址中写入一个值,导致FLASH报错,具体错误如下图所示

发生FLASH故障后,会导致FLASH操作失败。
解决方法:操作FLASH时,禁用CAN功能;操作FLASH结束,开启CAN功能。


回帖(1)

马占云

2024-9-9 18:21:48
在STM32F4 HAL库下,CAN发送导致FLASH报错的问题可能是由于以下几个原因导致的。请按照以下步骤进行排查和解决:

1. 检查CAN配置:
确保CAN控制器的配置正确,包括波特率、工作模式、过滤器等。错误的配置可能导致CAN通信异常,从而引发FLASH报错。

2. 检查FLASH写入保护:
在进行CAN发送操作时,确保FLASH没有被写入保护。如果FLASH被写入保护,尝试写入数据时会触发保护机制,导致报错。可以通过以下代码解除写入保护:
```c
HAL_FLASH_Unlock();
__HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
__HAL_FLASH_DATA_CACHE_DISABLE();
FLASH_OB_Unlock();
OB->WRP1 = 0x00; // 清除写保护区域
FLASH_OB_Lock();
__HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
__HAL_FLASH_DATA_CACHE_ENABLE();
HAL_FLASH_Lock();
```

3. 检查中断优先级:
确保CAN发送操作的中断优先级设置正确。如果中断优先级设置不当,可能导致中断嵌套,从而引发FLASH报错。可以通过以下代码设置中断优先级:
```c
HAL_NVIC_SetPriority(CANx_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(CANx_IRQn);
```

4. 检查CAN发送缓冲区:
确保CAN发送缓冲区没有被占用或者溢出。如果缓冲区被占用或者溢出,可能导致CAN发送失败,从而引发FLASH报错。可以通过以下代码检查CAN发送缓冲区:
```c
uint32_t TxMailbox;
HAL_CAN_GetTxMailboxesFreeLevel(&hcan, &TxMailbox);
if (TxMailbox == 0) {
    // 缓冲区已满,等待缓冲区空闲
    while (TxMailbox == 0) {
        HAL_CAN_GetTxMailboxesFreeLevel(&hcan, &TxMailbox);
    }
}
```

5. 检查CAN发送回调函数:
确保CAN发送回调函数没有触发FLASH写入操作。如果在回调函数中进行FLASH写入,可能导致FLASH报错。可以尝试将回调函数中的FLASH写入操作移至其他位置。

6. 检查代码优化:
确保代码中没有使用到优化指令,如跳转、循环展开等。这些优化指令可能导致FLASH报错。可以尝试关闭编译器优化,或者手动优化代码。

7. 检查硬件连接:
确保CAN控制器与外部CAN网络的硬件连接正确,包括CAN收发器、终端电阻等。错误的硬件连接可能导致CAN通信异常,从而引发FLASH报错。

通过以上步骤进行排查和解决,应该可以解决STM32F4 HAL库下CAN发送导致FLASH报错的问题。如果问题仍然存在,建议联系硬件供应商或者寻求专业人士的帮助。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分