yincheng.zhong
昨天 c8240d55741f0ed86099a0a8c616f4fc68372134
STM32H743/HAL/MCUFlash.c
@@ -10,6 +10,7 @@
 *******************************************************************************/
#include "MCUFlash.h"
#include "stm32h7xx_hal.h"
#include "HIDO_Debug.h"
/*******************************************************************************
 *                                  Macro                                      *
@@ -124,25 +125,23 @@
    }
    else
    {
#if 0
        /* Bank 2 ���� 8-15 */
        /* Bank 2 扇区 0-7 (实际编号8-15,但HAL库使用0-7) */
        if (address <= FLASH_SECTOR8_END)
            return FLASH_SECTOR_8;
            return FLASH_SECTOR_0;
        else if (address <= FLASH_SECTOR9_END)
            return FLASH_SECTOR_9;
            return FLASH_SECTOR_1;
        else if (address <= FLASH_SECTOR10_END)
            return FLASH_SECTOR_10;
            return FLASH_SECTOR_2;
        else if (address <= FLASH_SECTOR11_END)
            return FLASH_SECTOR_11;
            return FLASH_SECTOR_3;
        else if (address <= FLASH_SECTOR12_END)
            return FLASH_SECTOR_12;
            return FLASH_SECTOR_4;
        else if (address <= FLASH_SECTOR13_END)
            return FLASH_SECTOR_13;
            return FLASH_SECTOR_5;
        else if (address <= FLASH_SECTOR14_END)
            return FLASH_SECTOR_14;
            return FLASH_SECTOR_6;
        else if (address <= FLASH_SECTOR15_END)
            return FLASH_SECTOR_15;
#endif
            return FLASH_SECTOR_7;
    }
    return 0xFFFFFFFF;
@@ -292,7 +291,10 @@
    HIDO_UINT32 remaining = _u32WriteLen;
    HIDO_UINT32 addr = _u32WriteAddr;
    HIDO_UINT8 const *src = _pu8WriteData;
    HIDO_UINT8 wordBuf[MCU_FLASH_WORD_BYTES];
    /* 使用32位数组确保4字节对齐,避免HAL_FLASH_Program中出现非对齐访问导致的HardFault */
    HIDO_UINT32 wordBuf32[MCU_FLASH_WORD_BYTES / 4];
    HIDO_UINT8 *wordBuf = (HIDO_UINT8 *)wordBuf32;
    while (remaining > 0)
    {
@@ -315,8 +317,20 @@
        /* 已擦除校验:当前 Flash 中该 32 字节必须全为 0xFF */
        for (HIDO_UINT32 i = 0; i < MCU_FLASH_WORD_BYTES; i++)
        {
            if (*(volatile HIDO_UINT8 *)(addr + i) != 0xFF)
            HIDO_UINT8 byteVal = *(volatile HIDO_UINT8 *)(addr + i);
            if (byteVal != 0xFF)
            {
                /* 打印详细的擦除检查失败信息 */
                HIDO_Debug("[MCUFlash] Write failed: Address 0x%08X+%d not erased (value=0x%02X, expected=0xFF)\r\n",
                           addr, i, byteVal);
                /* 打印周围8字节的内容 */
                HIDO_UINT32 dumpStart = (i >= 4) ? (i - 4) : 0;
                HIDO_Debug("[MCUFlash] Context[%d-%d]: ", dumpStart, dumpStart + 7);
                for (HIDO_UINT32 j = dumpStart; j < dumpStart + 8 && j < MCU_FLASH_WORD_BYTES; j++)
                {
                    HIDO_Debug("%02X ", *(volatile HIDO_UINT8 *)(addr + j));
                }
                HIDO_Debug("\r\n");
                return HIDO_ERR; /* 未擦除或脏数据,需先调用 MCUFlash_Erase */
            }
        }