0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Flash编程的基础梳理

Geehy极海半导体 来源:Geehy极海半导体 作者:Geehy极海半导体 2022-11-01 09:49 次阅读

前言

最近拿到了一块APM32F103VC的MINI开发板,在学习了一段时间后发现其有非常丰富的外设资源,主频能达到96Mhz。最近在项目中使用到了IAP(In Application Programming)功能,特来评估一下APM32F103的IAP实现方式。

在应用编程IAP(In-Application Programming)是应用在Flash程序存储器的一种编程模式。它可以在应用程序正常运行的情况下,通过调用特定的IAP程序对另外一段程序Flash空间进行读/写操作,甚至可以控制对某段、某页甚至某个字节的读/写操作,这为数据存储和固件的现场升级带来了更大的灵活性。

话接上回,我们提及到了 程序跳转运行就是修改PC指针至我们的APP程序,然后修改我们的中断向量寄存器以使得我们的APP程序能够正确相应中断。

那我们本章节就在IAP实现的第三部分内容,Flash编程的基础进行梳理。

1 为什么要编程Flash?

众所周知,MCU的Flash保存着我们的程序,一般情况下我们在生产或者调试的时候是通过我们的烧录器或者仿真器对MCU的Flash进行编程。在这个过程中我们无需关系Flash的编程流程,仅需要通过工具即可完成对Flash的编程操作。

d288777c-5986-11ed-a3b6-dac502259ad0.jpg

那为什么做IAP需要关心Flash编程呢?因为IAP的一个关键因素就能够通过BootLoader去编程我们的APP区域的内容。

d291ace8-5986-11ed-a3b6-dac502259ad0.jpg

即我们需要实现对MCU的Flash编程操作。

2 Flash的编程流程

在APM32F103的手册,我们可以看到Flash编程一共分为解锁,擦除,编程,上锁的四个步骤。下面我们一步步看一下我们需要完成哪些操作。

d29bf66c-5986-11ed-a3b6-dac502259ad0.jpg

2.1 Flash解锁与上锁

Flash是我们程序保存的地方,需要编程FLash必须是“确定的”,而不是我们“一时兴起”。所以涉及较为繁琐的“解锁”步骤,以防我们重要的程序内容被改动。

d2ae47b8-5986-11ed-a3b6-dac502259ad0.jpg

APM32F1的标准库函数如下所示:

/*!

* [url=home.php?mod=space&uid=247401]@brief[/url] Unlocks the FMC Program Erase Controller

*

* @param None

*

* @retval None

*/

void FMC_Unlock(void)

{

FMC->KEY = 0x45670123;

FMC->KEY = 0xCDEF89AB;

}

/*!

* [url=home.php?mod=space&uid=247401]@brief[/url] Locks the FMC Program Erase Controller.

*

* @param None

*

* @retval None

*/

void FMC_Lock(void)

{

FMC->CTRL2_B.LOCK = BIT_SET;

}

2.2 Flash的擦除

由于APM32F1 的Flash的特性,对Flash写入数据的地址内容必须是0xFFFF,打个比方来说,我们要在一张纸上画一幅精彩的画作,那我们的纸张必须要是空白的,这样子才能不受纸张上的污渍影响我们。

那对于APM32F1的Flash来说,0xFFFF是“空白”状态,这个状态下我们才能尽情的“书写”内容。

那Flash的擦除操作,便是把Flash变回“空白”的操作。

擦除有分“全擦除”和“页擦除”,由于我们的BootLoader也是存储于Flash中的,我们若是使用“全擦除”操作我们的BootLoader程序也会被擦除掉,使得MCU处于“空片”状态。所以我们会使用“页擦除”完成对APP存储的区域进行擦除操作。

d2c24876-5986-11ed-a3b6-dac502259ad0.jpg

APM32F1的标准库函数如下所示:

/*!

* @brief Erases a specified FMC page.

*

* @param pageAddr: The page address to be erased.

*

* @retval Returns the flash state.It can be one of value:

* [url=home.php?mod=space&uid=2817080]@ARG[/url] FMC_STATUS_BUSY

* [url=home.php?mod=space&uid=2817080]@ARG[/url] FMC_STATUS_ERROR_PG

* @arg FMC_STATUS_ERROR_WRP

* @arg FMC_STATUS_COMPLETE

* @arg FMC_STATUS_TIMEOUT

*/

FMC_STATUS_T FMC_ErasePage(uint32_t pageAddr)

{

FMC_STATUS_T status = FMC_STATUS_COMPLETE;

status = FMC_WaitForLastOperation(0x000B0000);

if(status == FMC_STATUS_COMPLETE)

{

FMC->CTRL2_B.PAGEERA = BIT_SET;

FMC->ADDR = pageAddr;

FMC->CTRL2_B.STA = BIT_SET;

status = FMC_WaitForLastOperation(0x000B0000);

FMC->CTRL2_B.PAGEERA = BIT_RESET;

}

return status;

}

/*!

* @brief Erases all FMC pages.

*

* @param None

*

* @retval Returns the flash state.It can be one of value:

* @arg FMC_STATUS_ERROR_PG

* @arg FMC_STATUS_ERROR_WRP

* @arg FMC_STATUS_COMPLETE

* @arg FMC_STATUS_TIMEOUT

*/

FMC_STATUS_T FMC_EraseAllPage(void)

{

FMC_STATUS_T status = FMC_STATUS_COMPLETE;

status = FMC_WaitForLastOperation(0x000B0000);

if(status == FMC_STATUS_COMPLETE)

{

FMC->CTRL2_B.MASSERA = BIT_SET;

FMC->CTRL2_B.STA = BIT_SET;

status = FMC_WaitForLastOperation(0x000B0000);

FMC->CTRL2_B.MASSERA = BIT_RESET;

}

return status;

}

2.3 Flash的编程

在上面我们完成对目标区域的擦除操作后,便可以对Flash进行编程操作了。

d2d289c0-5986-11ed-a3b6-dac502259ad0.jpg

在APM32F1的标准库函数中给我们提供了字编程与半字编程操作。

/*!

* @brief Programs a word at a specified address.

*

* @param address:the address to be programmed.

*

* @param data: the data to be programmed.

*

* @retval Returns the flash state.It can be one of value:

* @arg FMC_STATUS_ERROR_PG

* @arg FMC_STATUS_ERROR_WRP

* @arg FMC_STATUS_COMPLETE

* @arg FMC_STATUS_TIMEOUT

*/

FMC_STATUS_T FMC_ProgramWord(uint32_t address, uint32_t data)

{

FMC_STATUS_T status = FMC_STATUS_COMPLETE;

__IOM uint32_t temp = 0;

#ifdef APM32F10X_HD

__set_PRIMASK(1);

#endif

status = FMC_WaitForLastOperation(0x000B0000);

if(status == FMC_STATUS_COMPLETE)

{

FMC->CTRL2_B.PG = BIT_SET;

*(__IOM uint16_t *)address = data;

status = FMC_WaitForLastOperation(0x000B0000);

if(status == FMC_STATUS_COMPLETE)

{

temp = address + 2;

*(__IOM uint16_t*) temp = data >> 16;

status = FMC_WaitForLastOperation(0x000B0000);

FMC->CTRL2_B.PG = BIT_RESET;

}

else

{

FMC->CTRL2_B.PG = BIT_RESET;

}

}

#ifdef APM32F10X_HD

__set_PRIMASK(0);

#endif

return status;

}

/*!

* @brief Programs a half word at a specified address.

*

* @param address:the address to be programmed.

*

* @param data: the data to be programmed.

*

* @retval Returns the flash state.It can be one of value:

* @arg FMC_STATUS_ERROR_PG

* @arg FMC_STATUS_ERROR_WRP

* @arg FMC_STATUS_COMPLETE

* @arg FMC_STATUS_TIMEOUT

*/

FMC_STATUS_T FMC_ProgramHalfWord(uint32_t address, uint16_t data)

{

FMC_STATUS_T status = FMC_STATUS_COMPLETE;

#ifdef APM32F10X_HD

__set_PRIMASK(1);

#endif

status = FMC_WaitForLastOperation(0x000B0000);

if(status == FMC_STATUS_COMPLETE)

{

FMC->CTRL2_B.PG = BIT_SET;

*(__IOM uint16_t *)address = data;

status = FMC_WaitForLastOperation(0x000B0000);

FMC->CTRL2_B.PG = BIT_RESET;

}

#ifdef APM32F10X_HD

__set_PRIMASK(0);

#endif

return status;

}

3 Flash的读取

完成对目标区域的Flash的编程后,我们一般情况下都需要进行校验,校验我们写入到Flash的实际内容与我们的期望内容是否一致。

我们可以使用直接读取比较,或者CRC校验的方式进行校验。校验的方法多种多样,但是都离不开Flash的读取。APM32F1的Flash读取较为简单,可以直接使用地址指针直接读取相应地址的内容。

data = *(__IOM uint16_t *)address;

data = *(__IOM uint32_t *)address;

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储器
    +关注

    关注

    38

    文章

    7534

    浏览量

    164489
  • 编程
    +关注

    关注

    88

    文章

    3642

    浏览量

    94104
  • 开发板
    +关注

    关注

    25

    文章

    5144

    浏览量

    98446

原文标题:APM32芯得 EP.13 | APM32F103_IAP的简单实现_flash编程基础

文章出处:【微信号:geehysemi,微信公众号:Geehy极海半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    AN-881: 通过LIN—协议4进行Flash/EE存储器编程

    电子发烧友网站提供《AN-881: 通过LIN—协议4进行Flash/EE存储器编程.pdf》资料免费下载
    发表于 01-14 16:12 0次下载
    AN-881: 通过LIN—协议4进行<b class='flag-5'>Flash</b>/EE存储器<b class='flag-5'>编程</b>

    EE-231:带SHARC处理器的SPI Flash在线编程

    电子发烧友网站提供《EE-231:带SHARC处理器的SPI Flash在线编程.pdf》资料免费下载
    发表于 01-06 15:31 0次下载
    EE-231:带SHARC处理器的SPI <b class='flag-5'>Flash</b>在线<b class='flag-5'>编程</b>

    Flash语音芯片相比OTP语音芯片的优势

    ‌。No.1可重复擦写Flash语音芯片的最大特点是支持多次编程和擦除,这意味着用户可以根据需要随时更新语音内容,实现定制化和灵活的语音交互。相比之下,OTP语音芯
    的头像 发表于 12-16 16:02 212次阅读
    <b class='flag-5'>Flash</b>语音芯片相比OTP语音芯片的优势

    Flash语音芯片相比OTP语音芯片的优势

    ‌。 1‌.可重复擦写‌:Flash语音芯片的最大特点是支持多次编程和擦除,这意味着用户可以根据需要随时更新语音内容,实现定制化和灵活的语音交互。相比之下,OTP语音芯片只能编程一次,无法更改存储的音频数据,灵活性较差‌。 ‌2
    的头像 发表于 12-16 15:44 212次阅读

    使用SD Flash为TMS320C28x器件编程外部非易失性存储器

    电子发烧友网站提供《使用SD Flash为TMS320C28x器件编程外部非易失性存储器.pdf》资料免费下载
    发表于 10-15 11:48 0次下载
    使用SD <b class='flag-5'>Flash</b>为TMS320C28x器件<b class='flag-5'>编程</b>外部非易失性存储器

    NAND Flash和NOR Flash哪个更好

    在讨论NAND Flash和NOR Flash哪个更好时,我们需要从多个维度进行深入分析,包括它们的技术特性、应用场景、成本效益以及未来发展趋势等。
    的头像 发表于 07-29 16:59 1835次阅读

    NAND Flash上的Vpp是什么?有何功能?

    NAND Flash上的,指的是用于向闪存单元写入数据时使用的较高编程电压。通常高于用于其他操作如读取或擦除的正常工作电压。
    的头像 发表于 05-30 09:07 2503次阅读

    STM32L475VE内部Flash编程出现ECCD错误的原因?

    使用的芯片型号 STM32L475VE,使用 HAL 库 `HAL_FLASH_Program` API 对 内部 Flash 进行编程,出现 ECCD 错误。 返回错误的代码摘要如下:(在
    发表于 04-26 07:21

    【GD32H757Z海棠派开发板使用手册】第四讲 FMC-片内Flash擦写读实验

    编程操作。 Flash读取可以支持64字节双字、32位整字、16位半字或字节读操作;Flash编程可以支持64位双字、32位整字编程
    的头像 发表于 04-19 10:09 1446次阅读
    【GD32H757Z海棠派开发板使用手册】第四讲 FMC-片内<b class='flag-5'>Flash</b>擦写读实验

    stm32g030f6p6 flash快速编程总是失败的原因?

    使用stm32g030f6p6 对flash快速编程时总是第一次可以正常的写,第二次写就失败,失败地方总在 HAL_FLASH_Program这条函数,这个地方卡了好几个星期了,现在请广大的坛友帮忙
    发表于 04-07 07:32

    Flash存储芯片:NOR Flash、NAND Flash、UFS和eMMC的比较与解析

    前言 在数字化时代的今天,数据的存储和管理变得越来越重要。各种各样的存储技术应运而生,以满足不同的使用场景和需求。其中,Flash存储芯片以其非易失性、可擦写性和可编程性等优势,占据了重要地位。本
    的头像 发表于 04-03 12:02 4781次阅读
    <b class='flag-5'>Flash</b>存储芯片:NOR <b class='flag-5'>Flash</b>、NAND <b class='flag-5'>Flash</b>、UFS和eMMC的比较与解析

    STM32关于FLASH编程对齐错误标志位(PGAERR)的疑问求解

    大神们,我现在正在做一个应用,需要熟悉STM32F4的FLASH的任何错误标识,以用于特殊情况下的错误标识判断做相应处理,但是针对FLASH编程对齐错误标志(PGAERR)与我理解不同。 原文
    发表于 03-22 07:59

    CW32L052 FLASH存储器

    CW32L052内部集成了64KB嵌入式FLASH供用户使用,可用来存储应用程序和用户数据。芯片支持对 FLASH 存储器的读、擦除和写操作,支持擦写保护和读保护。芯片内置 FLASH 编程
    的头像 发表于 02-28 17:43 797次阅读
    CW32L052 <b class='flag-5'>FLASH</b>存储器

    RL78系列 Flash编程库01型日语版本用户手册

    电子发烧友网站提供《RL78系列 Flash编程库01型日语版本用户手册.pdf》资料免费下载
    发表于 02-19 10:17 0次下载
    RL78系列 <b class='flag-5'>Flash</b>自<b class='flag-5'>编程</b>库01型日语版本用户手册

    RL78系列Flash编程库Type01软件包Ver.4.00发布说明

    电子发烧友网站提供《RL78系列Flash编程库Type01软件包Ver.4.00发布说明.pdf》资料免费下载
    发表于 02-19 10:08 1次下载
    RL78系列<b class='flag-5'>Flash</b>自<b class='flag-5'>编程</b>库Type01软件包Ver.4.00发布说明