打印
[STM32L4]

Page填啥

[复制链接]
740|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
morrisk|  楼主 | 2019-2-20 11:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32擦除flash的时候FLASH_EraseInitTypeDef结构的Page填啥?
沙发
ousj| | 2019-2-20 11:13 | 只看该作者

还有什么现象?能再详细描述下吗?

使用特权

评论回复
板凳
zyf部长| | 2019-2-20 11:16 | 只看该作者
看了网上的例子,填好像是地址
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| | 2019-2-20 11:19 | 只看该作者
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
kangzj| | 2019-2-20 11:22 | 只看该作者
其中比较特殊的是擦除步骤,需要定义个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;

使用特权

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

使用特权

评论回复
7
gongche| | 2019-2-20 11:28 | 只看该作者
应该跟实际有关吧,看选择的哪个芯片。

使用特权

评论回复
8
morrisk|  楼主 | 2019-2-20 11:33 | 只看该作者

好的,我明天去单位试一下,多谢各位大侠了哈,结贴了先        

使用特权

评论回复
9
wowu| | 2019-3-6 12:15 | 只看该作者
没明白楼主到底问的啥

使用特权

评论回复
10
xiaoqizi| | 2019-3-6 12:52 | 只看该作者
这个我不懂 帮楼主顶一下

使用特权

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

本版积分规则

701

主题

6879

帖子

2

粉丝