本帖最后由 mrliosen 于 2024-10-29 11:38 编辑
[C] 纯文本查看 复制代码
uint8_t bsp_WriteCpuFlash(uint32_t _ulFlashAddr, uint8_t *_ucpSrc, uint32_t _ulSize)
{
uint32_t i;
uint8_t ucRet;
uint16_t usTemp;
HAL_StatusTypeDef status = HAL_OK;
uint32_t _ulFlashAddrTemp = _ulFlashAddr;
SEGGER_RTT_SetTerminal(1);
SEGGER_RTT_printf(0,"flash writing front!\n");
/* 如果偏移地址超过芯片容量,则不改写输出缓冲区 */
if (_ulFlashAddr + _ulSize > FLASH_BASE_ADDR + FLASH_SIZE)
{
return 1;
}
/* 长度为0 时不继续操作 */
if (_ulSize == 0)
{
return 0;
}
ucRet = bsp_CmpCpuFlash(_ulFlashAddr, _ucpSrc, _ulSize);
if (ucRet == FLASH_IS_EQU)
{
return 0;
}
__set_PRIMASK(1); /* 关中断 */
/* FLASH 解锁 */
HAL_FLASH_Unlock();
/
/*boot里擦除快一些*/
for (i = 0; i < _ulSize / 4; i++) /* 未处理非4字节整数倍个数情况 */
{
//uint32_t FlashWord[4];
uint32_t FlashWord;
memcpy((char *)&FlashWord, _ucpSrc, 4);
_ucpSrc += 4; /*对传入的地址也+4*/
//FLASH_TYPEPROGRAM_WORD
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, _ulFlashAddr, ((uint32_t)FlashWord)) == HAL_OK)
{
_ulFlashAddr = _ulFlashAddr + 4; /* increment for the next Flash word*/
}
else
{
goto err;
}
}
/* 2019-10-03 长度不是4字节整数倍 */
if (_ulSize % 4)
{
uint8_t FlashWord[4];
FlashWord[0] = 0;
FlashWord[1] = 0;
FlashWord[2] = 0;
FlashWord[3] = 0;
memcpy((char *)FlashWord, _ucpSrc, _ulSize % 4);
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, _ulFlashAddr, ((uint32_t)FlashWord)) == HAL_OK)
{
; // _ulFlashAddr = _ulFlashAddr + 32; /* increment for the next Flash word*/
}
else
{
goto err;
}
}
/* Flash 加锁,禁止写Flash控制寄存器 */
HAL_FLASH_Lock();
__set_PRIMASK(0); /* 开中断 */
/*检查写入和内存中的数据是否一样*/
ucRet = bsp_CmpCpuFlash(_ulFlashAddrTemp, _ucpSrc, _ulSize);
if (ucRet == FLASH_IS_EQU)
{
return 0; /* 成功 */
}
return 2; /* 错误 */
err:
/* Flash 加锁,禁止写Flash控制寄存器 */
HAL_FLASH_Lock();
__set_PRIMASK(0); /* 开中断 */
return 2;
}
硬汉哥,为什么这个写入奇数字节时比如3字节,做了末尾补0,但是就是写入后,读出来的东西就是乱码,调试后发现是%4取余这段代码除了问题,这时什么情况?可以帮忙看一吗?
比如写入的数据是字符 “hel”读出来的数据缺失乱码。
[C] 纯文本查看 复制代码 /* 2019-10-03 长度不是4字节整数倍 */
if (_ulSize % 4)
{
uint8_t FlashWord[4];
FlashWord[0] = 0;
FlashWord[1] = 0;
FlashWord[2] = 0;
FlashWord[3] = 0;
memcpy((char *)FlashWord, _ucpSrc, _ulSize % 4);
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, _ulFlashAddr, ((uint32_t)FlashWord)) == HAL_OK)
{
; // _ulFlashAddr = _ulFlashAddr + 32; /* increment for the next Flash word*/
}
else
{
goto err;
}
}
|