打印
[STM32L4]

Page填啥

[复制链接]
1057|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
morrisk|  楼主 | 2021-1-4 23:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32擦除flash的时候FLASH_EraseInitTypeDef结构的Page填啥?

使用特权

评论回复
沙发
ousj| | 2021-1-4 23:34 | 只看该作者
还有什么现象?能再详细描述下吗?

使用特权

评论回复
板凳
zyf部长| | 2021-1-4 23:37 | 只看该作者

看了网上的例子,填好像是地址
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;
}

使用特权

评论回复
地板
xxmmi| | 2021-1-4 23:43 | 只看该作者
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);
}

使用特权

评论回复
5
BettyBerry| | 2021-1-4 23:45 | 只看该作者
具体用的是什么板子呢

使用特权

评论回复
6
kangzj| | 2021-1-4 23:46 | 只看该作者

其中比较特殊的是擦除步骤,需要定义个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;

使用特权

评论回复
7
kangzj| | 2021-1-4 23:50 | 只看该作者
另外还需要定义一个uint32_t变量——PageError,如果出现错误这个变量会被设置为出错的FLASH地址。

使用特权

评论回复
8
gongche| | 2021-1-4 23:53 | 只看该作者
应该跟实际有关吧,看选择的哪个芯片。

使用特权

评论回复
9
索尼法| | 2021-1-4 23:55 | 只看该作者
引脚不一样地址不一样 楼主将详细点

使用特权

评论回复
10
houcs| | 2021-1-4 23:55 | 只看该作者
没明白楼主到底问的啥

使用特权

评论回复
11
morrisk|  楼主 | 2021-1-4 23:59 | 只看该作者

唉,还是没有什么结果,算了,多谢大家啦

使用特权

评论回复
12
xiaoqizi| | 2021-2-1 22:57 | 只看该作者
这个好像是一个他自己定义的数据类型

使用特权

评论回复
13
木木guainv| | 2021-2-1 23:01 | 只看该作者
感觉就是页数啊 第几页第几页那样的

使用特权

评论回复
14
磨砂| | 2021-2-1 23:04 | 只看该作者
填写你需要的第几页的数值就行应该

使用特权

评论回复
15
晓伍| | 2021-2-1 23:07 | 只看该作者
自己定义的一直数据 就感觉像是整型之类的

使用特权

评论回复
16
八层楼| | 2021-2-1 23:11 | 只看该作者
是不是就是64个字节啊

使用特权

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

本版积分规则

701

主题

6879

帖子

2

粉丝