STM32L431内部flash读写 示例代码

uint8_t Write_ST_Flash(uint32_t addr, uint64_t* ptr, uint16_t ndword)
{
  uint8_t page;
  uint32_t PAGEError=0;
  FLASH_EraseInitTypeDef EraseInitStruct;
  /**不能超4K */
  if(ndword > 512)
  {
    return 1;
  }
  /** 解锁FLASH寄存器 */
  HAL_FLASH_Unlock();
  /** 清除所有错误标志(如果不清除会导致写失败) */
  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS); 
  /** 计算用户编程地址在FLASH中哪个页(每页4K字节) */
  /** 如果地址在Bank1则用下面这个公式计算页 */
  page = (addr - FLASH_BASE) / FLASH_PAGE_SIZE;
  /** 如果地址在Bank2则用下面这个公式计算页 */
//  page = (addr - (FLASH_BASE + FLASH_BANK_SIZE)) / FLASH_PAGE_SIZE; 
 
  EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES; /* 擦除方式:页擦除 */
  EraseInitStruct.Banks       = FLASH_BANK_1;          /* 擦除页所在的区域:BANK1 */
  EraseInitStruct.Page        = page;                  /* 擦除页的编号 */
  EraseInitStruct.NbPages     = 1;                     /* 擦除页的数量:1 */
 
  if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
  {
    /* error */
    return 1;
  }
  for(uint16_t i=0; i<ndword; i++)
  {
    if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr, ptr[i]) == HAL_OK)
    {
      addr = addr + 8;
    }
    else
    {
      /* error */
      return 1;      
    }
  }
  HAL_FLASH_Lock();
  return 0;
}
————————————————
版权声明:本文为CSDN博主「学无-止境」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_27718231/article/details/113076284        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值