STM32 HAL FLASH 读写例程

//FLASH写入数据测试
void Flash_WriteData(uint32_t addr,uint16_t *data,uint16_t Size)
{
    //1、解锁FLASH
  HAL_FLASH_Unlock();

    //2、擦除FLASH
    //初始化FLASH_EraseInitTypeDef
    FLASH_EraseInitTypeDef f;
    f.TypeErase = FLASH_TYPEERASE_PAGES;
    f.PageAddress = addr;
    f.NbPages = 1;
    //设置PageError
    uint32_t PageError = 0;
    //调用擦除函数
    HAL_FLASHEx_Erase(&f, &PageError);

    //3、对FLASH烧写
	  uint32_t TempBuf = 0;
	  for(uint32_t i = 0;i< Size ;i++)
	 {
		 TempBuf = ~(*(data+i));
		 TempBuf <<= 16;
		 TempBuf += *(data+i); //取反校验
		 HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD , addr + i * 4, TempBuf);
	 }
  
    //4、锁住FLASH
  HAL_FLASH_Lock();
}

//FLASH读取数据测试,成功返回1
uint8_t Flash_ReadData(uint32_t addr,uint16_t *data,uint16_t Size)
{
  uint32_t temp;
	uint8_t result = 1;
  for(uint32_t i = 0;i< Size ;i++)
	{
			temp = *(__IO uint32_t*)(addr + i * 4);
		  if((uint16_t)temp == (uint16_t)(~(temp>>16)))
			{
				*(data+i) = (uint16_t)temp;
			}
			else
			{
				result = 0;
			}
	}
  return result;
}


### STM32 HAL 库内部 Flash 读写示例 对于STM32系列微控制器而言,在使用HAL库进行内部Flash操作时,通常会涉及到初始化、擦除页、编程以及验证数据等功能。下面提供一段基于STM32 HAL库实现内部Flash读写的C语言代码示例。 #### 初始化Flash接口 在执行任何Flash操作之前,需要先调用`HAL_FLASH_Unlock()`解锁Flash访问权限;完成所有操作后再通过`HAL_FLASH_Lock()`锁定以保护存储区域不受意外更改的影响[^1]。 ```c // 解锁闪存程序/擦除控制寄存器 if (HAL_FLASH_Unlock() != HAL_OK) { // 错误处理... } ``` #### 擦除指定页面 由于Flash是以页为单位管理的,所以在写入新数据前可能需要先清除目标位置所在的整个页面。这一步骤由函数`HAL_FLASHEx_Erase()`负责完成,并接受指向结构体FLASH_EraseInitTypeDef实例的指针作为参数之一,该结构包含了要擦除的具体配置信息如起始地址和结束地址等。 ```c FLASH_EraseInitTypeDef eraseInitStruct; uint32_t pageError; eraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; eraseInitStruct.PageAddress = ADDR_FLASH_PAGE_127; // 假设我们要擦除第127页 eraseInitStruct.NbPages = 1; if (HAL_FLASHEx_Erase(&eraseInitStruct, &pageError) != HAL_OK) { // 处理错误情况... } // 如果有多个连续页面,则增加NbPages的数量即可一次性全部清空。 ``` #### 编程(即写入) 当准备就绪后就可以向已擦除过的空间内写入新的字节序列了。注意每次只能按半字(word)或双字(double word)的形式传递给`HAL_FLASH_Program()`方法,因此如果打算保存字符串或其他形式的数据则需提前做好转换工作。 ```c uint32_t address = ADDR_FLASH_PAGE_127 + OFFSET_INTO_PAGE; uint64_t dataToWrite = 0xAABBCCDDEEFF1122ULL; for(int i=0;i<sizeof(dataToWrite)/sizeof(uint64_t);i++){ if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,address,dataToWrite)!=HAL_OK){ // 再次尝试或者报告失败... } address += sizeof(uint64_t); } ``` #### 验证写入结果 最后建议再次从相同的位置读取回刚刚写进去的内容并与预期值对比确认无误。这部分可以通过简单的循环语句配合标准I/O指令轻松达成目的。 ```c volatile uint64_t readBackData; address = ADDR_FLASH_PAGE_127 + OFFSET_INTO_PAGE; readBackData = *(__IO uint64_t*)address; if(readBackData!=dataToWrite){ // 数据校验未通过... }else{ // 成功匹配! } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值