STM32CubeIDE中STM32F105的FLASH操作方法

1. 说明

本文使用的芯片型号为:STM32F105RBT6,FLASH大小128KB, 如果使用STM32F105RCT6,则FLASH为256KB,增加一个128KB的FLASH页。

2. FLASH地址判断

第0页起始地址 0x08000000 //16K
第1页起始地址 0x08004000 //16K
第2页起始地址 0x08008000 //16K
第3页起始地址 0x0800C000 //16K
第4页起始地址 0x08010000 //16K
第4页最终地址 0x0801FFFF // 64K

共计128KB。

/*以下为单页写入,注意不要产出页范围*/
uint32_t FLASH_WAITETIME = 1000;  //FLASH写入超时时间
void STMFLASH_Write_Halfword(uint32_t WriteAddr, uint8_t *pBuffer) //写入1个字节
{
	//定义各种变量
	FLASH_EraseInitTypeDef FlashEraseInit;        //擦除结构体
	HAL_StatusTypeDef FlashStatus=HAL_OK;    //状态指示
	uint32_t SectorError=0;
	//解锁FLASH
	HAL_FLASH_Unlock();
	//判断地址合法
	if(WriteAddr<0X1FFF0000)
	{
		//初始化擦除变量
		FlashEraseInit.TypeErase= FLASH_TYPEERASE_PAGES;  //擦除类型 按页擦除
		FlashEraseInit.Banks = FLASH_BANK_1;  //批量擦除
		FlashEraseInit.NbPages=1;   //要擦除的页面数量
		FlashEraseInit.PageAddress = ADDR_FLASH_SERTOR_4;   //擦除页面 
		if(HAL_FLASHEx_Erase(&FlashEraseInit,&SectorError)!=HAL_OK)
		{
			printf("Erase failed! \r\n");
		}
		//FLASH操作是否完成
		FlashStatus=FLASH_WaitForLastOperation(FLASH_WAITETIME);            //
		if(FlashStatus==HAL_OK)
		{
				//写操作,按半字16位写入,F105最小的就是半字,不能写入单字节
				if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, WriteAddr, *pBuffer)!=HAL_OK)//
				{
					printf("write failed! \r\n");
				}
				else
				{
					printf("write successed! \r\n");
				}
		}
		else
		{

		}
		//FLASH上锁
		HAL_FLASH_Lock();           //
	}
}


3. 读取

/*
 * 读取  16位
 * faddr - 地址
 * */
uint16_t STMFLASH_ReadHalfword(uint32_t faddr)
{
	return *(__IO uint16_t*)faddr;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LuDvei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值