硬汉嵌入式论坛

 找回密码
 立即注册
查看: 858|回复: 1
收起左侧

[技术讨论] 关于写内部flash设置成字节类型,写入只能是偶数字节的一些疑问

[复制链接]

2

主题

11

回帖

17

积分

新手上路

积分
17
发表于 2024-10-22 18:24:17 | 显示全部楼层 |阅读模式
本帖最后由 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;
}

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-10-23 10:07:16 | 显示全部楼层
可以补充0,

因为程序里面做了个字编程来加速操作。

[C] 纯文本查看 复制代码
 /* 按字节模式编程(为提高效率,可以按字编程,一次写入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;
    }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:03 , Processed in 0.044598 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表