stm32l476 内部flash HAL库操作方法

发布者:rockstar7最新更新时间:2018-08-19 来源: eefocus关键字:stm32l476  内部flash  HAL库 手机看文章 扫描二维码
随时随地手机看文章

stm32l476 FLASH特征


• Up to 1 Mbyte of Flash memory with dual bank architecture supporting read-while-write 

capability (RWW). 

• Memory organization: 2 banks (Bank 1 and Bank 2) 

– main memory: 512 Kbyte per bank 

– information block: 32 Kbyte per bank 

• 72-bit wide data read (64 bits plus 8 ECC bits) 

• 72-bit wide data write (64 bits plus 8 ECC bits) 

• Page erase (2 Kbyte), bank erase and mass erase (both banks) 

摘自 STM32 RM0351 Reference manual 文档

  • stm32l476 dual bank 地址表 
    地址表

写入操作流程

  1. FLASH解锁 

    HAL_FLASH_Unlock(); 

  2. 擦除FLASH 

    HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError); 

  3. 写入FLASH 

    HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data); 

  4. 锁定FLASH 

    HAL_FLASH_Lock(); 

读取操作


直接从目标地址读取, uint8_t* 按照1个字节读取,如果是uint32_t* 按照一个字读取


buff[i] = *(__IO uint8_t*)(dest_addr + i);

//直接从目标地址读取, uint8_t* 按照1个字节读取,如果是uint32_t* 按照一个字读取


具体实现


/**

  * @brief  Initializes Memory.

  * @param  None

  * @retval 0 if operation is successeful, MAL_FAIL else.

  */

flash_status_t Flash_If_Init(void)

{

  /* Unlock the internal flash */

  HAL_FLASH_Unlock();

  return FLASH_OK;

}


/**

  * @brief  De-Initializes Memory.

  * @param  None

  * @retval 0 if operation is successeful, MAL_FAIL else.

  */

flash_status_t Flash_If_DeInit(void)

{

  /* Lock the internal flash */

  HAL_FLASH_Lock();

  return FLASH_OK;

}


/**

  * @brief  Erases sector.

  * @param  Add: Address of sector to be erased.

  * @retval 0 if operation is successeful, MAL_FAIL else.

  */

flash_status_t Flash_If_Erase(uint32_t Add)

{

  uint32_t PageError = 0;

  /* Variable contains Flash operation status */

  HAL_StatusTypeDef status;

  FLASH_EraseInitTypeDef eraseinitstruct;


  /* Clear OPTVERR bit set on virgin samples */

  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);


   /* Get the number of sector to erase from 1st sector*/

  eraseinitstruct.Banks = GetBank(Add);

  eraseinitstruct.TypeErase = FLASH_TYPEERASE_PAGES;

  eraseinitstruct.Page = GetPage(Add);

  eraseinitstruct.NbPages = 1;

  status = HAL_FLASHEx_Erase(&eraseinitstruct, &PageError);


  if (status != HAL_OK)

  {

    return FLASH_ERR;

  }

  return FLASH_OK;

}


/**

  * @brief  Writes Data into Memory.

  * @param  src: Pointer to the source buffer. Address to be written to.

  * @param  dest: Pointer to the destination buffer.

  * @param  Len: Number of data to be written (in bytes).

  * @retval 0 if operation is successeful, MAL_FAIL else.

  */

flash_status_t Flash_If_Write(uint8_t *src, uint32_t dest_addr, uint32_t Len)

{

  uint32_t i = 0;


  /* Clear OPTVERR bit set on virgin samples */

  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);


  for(i = 0; i < Len; i += 8)

  {

    /* Device voltage range supposed to be [2.7V to 3.6V], the operation will

       be done by byte */

    if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, (uint32_t)(dest_addr+i), *(uint64_t*)(src+i)) == HAL_OK)

    {

     /* Check the written value */

      if(*(uint64_t *)(src + i) != *(uint64_t*)(dest_addr+i))

      {

        /* Flash content doesn't match SRAM content */


        return FLASH_CHECK_ERR;

      }


    }

    else

    {

      /* Error occurred while writing data in Flash memory */

      return FLASH_ERR;

    }

  }

  return FLASH_OK;

}


/**

  * @brief  Reads Data into Memory.

  * @param  src: Pointer to the source buffer. Address to be written to.

  * @param  dest: Pointer to the destination buffer.

  * @param  Len: Number of data to be read (in bytes).

  * @retval return FLASH_OK.

  */

flash_status_t Flash_If_Read(uint8_t* buff, uint32_t dest_addr, uint32_t Len)

{


    uint32_t i;

    for(i = 0; i < Len; i++){

            buff[i] = *(__IO uint8_t*)(dest_addr + i);

    }

  /* Return a valid address to avoid HardFault */

  return FLASH_OK;

}


/**

  * @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;

}


/**

  * @brief  Gets the bank of a given address

  * @param  Addr: Address of the FLASH Memory

  * @retval The bank of a given address

  */

static uint32_t GetBank(uint32_t Addr)

{

  uint32_t bank = 0;


  if (READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_FB_MODE) == 0)

  {

    /* No Bank swap */

    if (Addr < (FLASH_BASE + FLASH_BANK_SIZE))

    {

      bank = FLASH_BANK_1;

    }

    else

    {

      bank = FLASH_BANK_2;

    }

  }

  else

  {

    /* Bank swap */

    if (Addr < (FLASH_BASE + FLASH_BANK_SIZE))

    {

      bank = FLASH_BANK_2;

    }

    else

    {

      bank = FLASH_BANK_1;

    }

  }


  return bank;

}


关键字:stm32l476  内部flash  HAL库 引用地址:stm32l476 内部flash HAL库操作方法

上一篇:STOP状态下通过串口唤醒MCU
下一篇:stm32时钟分割

推荐阅读最新更新时间:2024-03-16 16:11

STM32Cube HAL库中断处理机制,以及回调函数实现原理
1写在前面 很多人都知道STM32CubeMX这套工具的一个目的:减少开发者对STM32底层驱动的开发时间,把重心放在应用代码上。 但是,STM32CubeMX只是生成了底层驱动的初始化代码。所以,我们还需要掌握:应用层代码如何调用HAL库函数接口,以及HAL库中断处理机制等相关知识。 HAL库牵涉的内容较多,本文拿HAL库中断处理来讲解,以及相关的回调函数。 HAL库中断处理机制 之前使用标准外设库开发时,中断程序(函数)由我们自己实现。 而HAL库的中断处理函数是按照HAL处理机制来实现,如USART1,统一由HAL_UART_IRQHandler来进行处理,如下图: 其它大部分外设(TIM、SPI、CAN
[单片机]
stm32CubeMX HAL库中延时的几种方式解析
HAL_Dalay()是毫秒级延时,为了使用微秒级延时最近学习了一下,总结如下,推荐使用最后一种方式。 /* * 本文件包括四种延时方式: * 1. 原来的HAL库函数HAL_Delay() 2. 采用定时器2设置延时函数 3. 采用系统滴答中断方式的ms和us级延时 * 4. 采用系统滴答非中断方式的ms和us级延时(在一次计数值范围内的延时) */ /* Includes ------------------------------------------------------------------*/ #include stm32l1xx_hal.h #include tim.h #inclu
[单片机]
MSP430F149内部Flash操作
一般,在单片机中的Flash存储器用于存放程序代码,属于只读型存储器。而在MSP430些列的单片机中,都可以通过内置的Flash控制器擦除或改写任何一段的内容。另外,msp430的单片机内部还专门留有一段Flash区域(information memory),用于存放掉电后需要永久保存的数据。利用430内部的Flash控制器,可以完成较大容量的数据记录、用户设置参数在掉电后的保存等功能。 硬件介绍: 要对Flash读写,首先要了解MSP430的存储器组织。430单片机的存储器组织结构采用冯诺依曼结构,RAM和ROM统一编址在同一寻址空间中,没有代码空间和数据空间之分。 一般430的单片机都统一编址在0-64k地址范围中,
[单片机]
MSP430F149<font color='red'>内部</font><font color='red'>Flash</font>操作
stm32的HAL库i2c从机实现
stm32的i2c默认就是slave模式,本文基于HAL库实现中断方式的接收和发送,首先是初始化gpio和i2c,代码如下: I2C_HandleTypeDef I2cHandle; void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOA_CLK_ENABLE() ; __HAL_RCC_GPIOC_CLK_ENABLE() ; /**I2C3 GPIO Configuration PA8 ------ I2C3_SCL PC9 -----
[单片机]
stm32的<font color='red'>HAL库</font>i2c从机实现
STM32 HAL库学习系列第8篇---回调函数总结
普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数 对普通函数的调用: 调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行。从发出调用的程序的角度看,这个过程为“调用-- 等待被调用函数执行完毕-- 继续执行” 对回调函数调用: 调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样,调用程序执和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。 位置:stm32f4xx_hal_xxx.c
[单片机]
学习STM32CubeMX与HAL库吐槽
最近因为一个小项目(智能穿戴),用到了STM32L0(低功耗 Cortex M0)系列的MCU, 查了官网,居然没有提供固件库,只有HAL库,于是STM32CubeMX生成了HAL库的工程,学习HAL的使用: STM32CubeMX与HAL库的优点: 1、降低了使用外设的门槛,所有时钟设置等一目了然。 2、统一了代码的架构、风格,让源代码的可读性“保底线“提高。 吐槽如下: 1、工程的架构很死了,只能在框框条条里填写内容,这完全违背了C程序员们的习惯。例如,要自己加上OS,代码结构会很难看。 2、但一但遇上了坑,就无法解决。 3、依赖性更高了,而且这工具有BUG,例如:在生成代码时,终止ST
[单片机]
stm32F4XX之窗口看门狗 HAL库
首先讲一下独立看门狗和窗口看门狗之间的区别。 独立看门狗Iwdg——独立于系统之外,因为有独立时钟,一般是外部低速时钟。主要用于监视硬件错误。 窗口看门狗wwdg——系统内部的故障探测器,采用内部RCC时钟,时钟与系统相同。如果系统时钟不走了,这个狗也就失去作用了。主要用于监视软件错误 1)独立看门狗没有中断,窗口看门狗有中断 2)独立看门狗有硬件软件之分,窗口看门狗只能软件控制 3)独立看门狗只有下限,窗口看门狗又下限和上限 4)独立看门狗是12位递减的。窗口看门狗是7位递减的 5)独立看门狗是用的内部的大约40KHZ RC振荡器(不受系统时钟限制,即使系统时钟坏了也能工作),窗口看门狗是用的系统时钟
[单片机]
stm32F4XX之窗口看门狗 <font color='red'>HAL库</font>
STM32 对内部FLASH读写接口函数
简介:因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序。 原理:先要把整页FLASH的内容搬到RAM中,然后在RAM中改动,然后擦除整页FLASH,再把改动后的内容写入原Flash页。下面程序调试通过。 /******************************************************************************* * Function Name : I2C_EE_BufferRead * Description : Reads a block of data from th
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved