本帖最后由 mrliosen 于 2024-10-22 18:25 编辑
你好硬汉哥,这里将写内部寄存器函数设置成byte类型,为什么要只能将写入个数限制成偶数个?万一有写奇数个字节的要求呢?

[C] 纯文本查看 复制代码 /*
*********************************************************************************************************
* 函 数 名: bsp_WriteCpuFlash
* 功能说明: 写数据到CPU 内部Flash。
* 形 参: _ulFlashAddr : Flash地址
* _ucpSrc : 数据缓冲区
* _ulSize : 数据大小(单位是字节)
* 返 回 值: 0-成功,1-数据长度或地址溢出,2-写Flash出错(估计Flash寿命到)
*********************************************************************************************************
*/
uint8_t bsp_WriteCpuFlash(uint32_t _ulFlashAddr, uint8_t *_ucpSrc, uint32_t _ulSize)
{
uint32_t i;
uint8_t ucRet;
uint16_t usTemp;
//FLASH_Status status = FLASH_COMPLETE;
HAL_StatusTypeDef status = HAL_OK;
/* 如果偏移地址超过芯片容量,则不改写输出缓冲区 */
if (_ulFlashAddr + _ulSize > FLASH_BASE_ADDR + FLASH_SIZE)
{
return 1;
}
/* 长度为0 时不继续操作 */
if (_ulSize == 0)
{
return 0;
}
/* 长度为奇数时不继续操作 */
if ((_ulSize % 2) != 0)
{
return 1;
}
ucRet = bsp_CmpCpuFlash(_ulFlashAddr, _ucpSrc, _ulSize);
if (ucRet == FLASH_IS_EQU)
{
return 0;
}
__set_PRIMASK(1); /* 关中断 */
/* FLASH 解锁 */
HAL_FLASH_Unlock();
/* Clear pending flags (if any) */
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
/* 需要擦除 */
if (ucRet == FLASH_REQ_ERASE)
{
status = FLASH_ErasePage(bsp_GetSector(_ulFlashAddr));
if (status != HAL_OK)
{
return 2;
}
}
/* 按字节模式编程(为提高效率,可以按字编程,一次写入4字节) */
for (i = 0; i < _ulSize / 2; i++)
{
//FLASH_ProgramByte(_ulFlashAddr++, *_ucpSrc++);
usTemp = _ucpSrc[2 * i];
usTemp |= (_ucpSrc[2 * i + 1] << 8);
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, _ulFlashAddr, usTemp);
if (status != HAL_OK)
{
break;
}
_ulFlashAddr += 2;
}
/* Flash 加锁,禁止写Flash控制寄存器 */
HAL_FLASH_Lock();
__set_PRIMASK(0); /* 开中断 */
if (status == HAL_OK)
{
return 0;
}
return 2;
}
|