[STM32L4]

Page填啥

[复制链接]
228|15
手机看帖
扫描二维码
随时随地手机跟帖
morrisk|  楼主 | 2023-2-17 21:09 | 显示全部楼层 |阅读模式
stm32擦除flash的时候FLASH_EraseInitTypeDef结构的Page填啥?

使用特权

评论回复
happy_10| | 2023-2-17 21:13 | 显示全部楼层

看了网上的例子,填好像是地址
uint32_t writeFlashData = 0x55555555;
uint32_t addr = 0x08007000;

//FLASH写入数据测试
void writeFlashTest(void)
{
    //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烧写
    HAL_FLASH_Program(TYPEPROGRAM_WORD, addr, writeFlashData);

    //4、锁住FLASH
  HAL_FLASH_Lock();
}

可是官方给的例程里填的是第几页吧
/* Unlock the Flash to enable the flash control register access *************/
  HAL_FLASH_Unlock();

  /* Erase the user Flash area
    (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/

  /* Clear OPTVERR bit set on virgin samples */
  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
  /* Get the 1st page to erase */
  FirstPage = GetPage(FLASH_USER_START_ADDR);
  /* Get the number of pages to erase from 1st page */
  NbOfPages = GetPage(FLASH_USER_END_ADDR) - FirstPage + 1;
  /* Get the bank */
  BankNumber = GetBank(FLASH_USER_START_ADDR);
  /* Fill EraseInit structure*/
  EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
  EraseInitStruct.Banks       = BankNumber;
  EraseInitStruct.Page        = FirstPage;
  EraseInitStruct.NbPages     = NbOfPages;

/**
  * @brief  Gets the page of a given address
  * @param  Addr: Address of the FLASH Memory
  * @retval The page of a given address
  */
static uint32_t GetPage(uint32_t Addr)
{
  uint32_t page = 0;
  
  if (Addr < (FLASH_BASE + FLASH_BANK_SIZE))
  {
    /* Bank 1 */
    page = (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;
  }
  else
  {
    /* Bank 2 */
    page = (Addr - (FLASH_BASE + FLASH_BANK_SIZE)) / FLASH_PAGE_SIZE;
  }
  
  return page;
}

使用特权

评论回复
shimx| | 2023-2-17 21:17 | 显示全部楼层
uint32_t writeFlashData = 0x55555555;
uint32_t addr = 0x08007000;

//FLASH写入数据测试
void writeFlashTest(void)
{
    //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烧写
    HAL_FLASH_Program(TYPEPROGRAM_WORD, addr, writeFlashData);

    //4、锁住FLASH
  HAL_FLASH_Lock();
}

//FLASH读取数据测试
void printFlashTest(void)
{
  uint32_t temp = *(__IO uint32_t*)(addr);

    printf("addr:0x%x, data:0x%x\r\n", addr, temp);
}

使用特权

评论回复
yinxiangh| | 2023-2-17 21:25 | 显示全部楼层
具体用的是什么板子呢

使用特权

评论回复
songqian17| | 2023-2-17 21:27 | 显示全部楼层

其中比较特殊的是擦除步骤,需要定义个FLASH_EraseInitTypeDef的数据,FLASH_EraseInitTypeDef有三个成员:TypeErase、PageAddress和NbPages。

其中,TypeErase有两个选项,页擦除和块擦除:

#define FLASH_TYPEERASE_PAGES     ((uint32_t)0x00)  /*!<Pages erase only*/
#define FLASH_TYPEERASE_MASSERASE ((uint32_t)0x01)  /*!<Flash mass erase activation*/
1
2
PageAddress是设置FLASH地址,这里为0x8007000;

NbPages为擦除页数(块数),这里为1;

使用特权

评论回复
yinxiangh| | 2023-2-17 21:28 | 显示全部楼层
另外还需要定义一个uint32_t变量——PageError,如果出现错误这个变量会被设置为出错的FLASH地址。

使用特权

评论回复
jiaxw| | 2023-2-17 21:31 | 显示全部楼层
应该跟实际有关吧,看选择的哪个芯片。

使用特权

评论回复
wenfen| | 2023-2-17 21:33 | 显示全部楼层
引脚不一样地址不一样 楼主将详细点

使用特权

评论回复
chenho| | 2023-2-17 21:34 | 显示全部楼层
没明白楼主到底问的啥

使用特权

评论回复
zwll| | 2023-2-17 21:36 | 显示全部楼层
这个好像是一个他自己定义的数据类型

使用特权

评论回复
spark周| | 2023-2-17 21:39 | 显示全部楼层
感觉就是页数啊 第几页第几页那样的

使用特权

评论回复
chuxh| | 2023-2-17 21:41 | 显示全部楼层
填写你需要的第几页的数值就行应该

使用特权

评论回复
juventus9554| | 2023-2-17 21:42 | 显示全部楼层
自己定义的一直数据 就感觉像是整型之类的

使用特权

评论回复
spark周| | 2023-2-17 21:43 | 显示全部楼层
是不是就是64个字节啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

701

主题

6879

帖子

2

粉丝