这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【转】STM32G070的flash读写问题

共1条 1/1 1 跳转至

【转】STM32G070的flash读写问题

菜鸟
2021-01-16 13:38:01     打赏
STM32G070的flash读写问题

STM32G070xx的flash分布如下图,打算将Page 63用于保存用户数据。
在这里插入图片描述

问题

开始一直出现flash写入失败,从返回码来看是FLASH_FLAG_PGSERR,一直找不到原因,代码如下:

#define ADDR_USER_DATA  0x0801F800

HAL_FLASH_Unlock();
FLASH_PageErase(63);
ret = HAL_FLASH_Program(TYPEPROGRAM_DOUBLEWORD, ADDR_USER_DATA, (uint64_t)data);
HAL_FLASH_Lock();

if (ret != HAL_OK)
{
   printf("\r\nuser data save failed, ret = %u, flash err = 0x%x", ret, HAL_FLASH_GetError());
}1234567891011

flash写入失败
后来终于在community.st找到了答案:
在这里插入图片描述

STM32G070 flash驱动代码

好了,话不多说,直接上最终的代码,亲测有效:

HAL_StatusTypeDef flash_write(uint32_t address, uint64_t data)
{
   HAL_StatusTypeDef ret = HAL_OK;

   HAL_FLASH_Unlock();
   ret = HAL_FLASH_Program(TYPEPROGRAM_DOUBLEWORD, address , data);
   HAL_FLASH_Lock();

   return ret;
}

void flash_page_erase(uint32_t page)
{
   HAL_StatusTypeDef test = HAL_FLASH_Unlock();

   test = FLASH_WaitForLastOperation(1000); //1s timeout
   __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR);
   FLASH_PageErase(page);
   test = FLASH_WaitForLastOperation(1000);
   CLEAR_BIT(FLASH->CR, FLASH_CR_PER);

   HAL_FLASH_Lock();
}

   /* 调用上述两个函数即可实现flash的擦除和写入 */
   flash_page_erase(63);
   ret = flash_write(ADDR_USER_DATA, (uint32_t)u_data);
   
   /* 读取的话就简单了,直接使用地址即可 */
   uint32_t u_data1 = 0;
   u_data1 = *((uint32_t*)ADDR_USER_DATA);

注意点

flash_write每次写入的是一个uint64_t类型的数据,其最终调用的函数为:

static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data)
{
 /* Set PG bit */
 SET_BIT(FLASH->CR, FLASH_CR_PG);

 /* Program first word */
 *(uint32_t *)Address = (uint32_t)Data;

 /* Barrier to ensure programming is performed in 2 steps, in right order
   (independently of compiler optimization behavior) */
 __ISB();

 /* Program second word */
 *(uint32_t *)(Address + 4U) = (uint32_t)(Data >> 32U);
}

该函数每调用一次,其实是写入了2个word,所以在使用时需要注意Address的递增。

转自:https://blog.csdn.net/crazy_kismet/article/details/102739562?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522161077474116780277069978%252522%25252C%252522scm%252522%25253A%25252220140713.130102334..%252522%25257D&request_id=161077474116780277069978&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-102739562.pc_search_result_hbase_insert&utm_term=stm32G070



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]