打印
[APM32F1]

读写内部FLASH

[复制链接]
782|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mcufae|  楼主 | 2023-6-29 20:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.关于内部FLASH的介绍
(1)  FLASH的作用主要是当程序写好之后,使用下载器把编译好的代码烧录到内部FLASH里面,由于其断电后不丢失的特性,芯片复位之后,内核可以从内部FLASH中加载代码并且运行。
(2)在APM32F103中,例如:APM32F103CBT6,APM32 的内部 FLASH 包含主存储器、系统存储器以及选项字节区域。主存储器分为 128 页,每页大小为 1KB,共 128KB,若内部 FLASH 存储了应用程序后还有剩余的空间,我们可以把它像外部 FLASH 那样利用起来,存储一些程序运行时产生的需要掉电保存的数据。
2.对内部 FLASH 的写入过程
用户在每次 Flash 编程操作中必须按照“Flash 解锁一用户编程一 Flash 上锁”的步骤进行,以避免在 Flash 编程操作结束后,因 Flash 未上锁而带来的用户代码/数据被意外修改等风险。
(1)解锁
复位后 FMC 的 FMC_CTRL1 会被硬件锁定,此时不能直接对 FMC_CTRL1 进行写入操作,必须先按照正确的顺序向 FMC_KEY 写入对应的值来解锁 FMC。
KEY 值如下:
 KEY1=0x45670123
 KEY2=0xCDEF89AB
操作函数:
void FMC_Unlock(void)
{
    FMC->KEY = 0x45670123;
    FMC->KEY = 0xCDEF89AB;
}
(2)页擦除
在写入新的数据前,需要先擦除存储区域,APM32 提供了页(扇区)擦除指令和整个FLASH 擦除(批量擦除)的指令,批量擦除指令仅针对主存储区。
操作函数:
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;
}
(3)写入数据
擦除完毕后即可写入数据,写入数据的过程并不是仅仅使用指针向地址赋值,赋值前还还需要配置一系列的寄存器,步骤如操作函数 FMC_STATUS_T FMC_ProgramWord(uint32_t address, uint32_t data) 所示。
3.总结如下,对于新手而言,在操作内部FLASH的读写,需要注意的是区分FALSH的容量大小,对于大容量的FLASH,它的FLASH是2KB的一个页,对于小容量而言,它的FLASH是1KB,因此,在计算写入页数大小的时候,要注意区分。在APM32F103中,例如:APM32F103CBT6,主存储器分为 128 页,每页大小为 1KB,共 128KB。

使用特权

评论回复
沙发
cashrwood| | 2023-7-5 15:20 | 只看该作者
APM32F103CBT6如何读写芯片内部FLASH

使用特权

评论回复
板凳
averyleigh| | 2023-7-5 15:42 | 只看该作者
在写入新数据之前,需要先擦除对应的扇区。

使用特权

评论回复
地板
sdlls| | 2023-7-5 15:54 | 只看该作者
在进行数据更新时,需要注意只擦除需要修改的扇区,而不是整个FLASH。

使用特权

评论回复
5
fengm| | 2023-7-5 16:06 | 只看该作者
在写入新数据之前,通常需要先对目标FLASH区域进行擦除操作。擦除操作将目标FLASH区域的数据全部清除为初始值

使用特权

评论回复
6
tabmone| | 2023-7-5 16:10 | 只看该作者
正确选择和使用适当的算法,可以提高程序的效率和可靠性。

使用特权

评论回复
7
juliestephen| | 2023-7-5 16:37 | 只看该作者
避免在重复擦除同一FLASH页或频繁写入同一FLASH地址等操作。

使用特权

评论回复
8
abotomson| | 2023-7-5 16:48 | 只看该作者
在进行内部FLASH读写时,建议仔细阅读相关资料和参考手册

使用特权

评论回复
9
sesefadou| | 2023-7-6 12:00 | 只看该作者
确保正确配置写保护位,防止误操作导致数据丢失或无法修改。

使用特权

评论回复
10
hearstnorman323| | 2023-7-6 12:20 | 只看该作者
APM32F103CBT6支持写入保护机制,可防止对FLASH区域的误操作。

使用特权

评论回复
11
robincotton| | 2023-7-6 12:29 | 只看该作者
在读写FLASH时,确保数据地址按字节(byte)对齐。如果不按正确的地址对齐方式进行读写操作,可能会导致数据异常或错误。

使用特权

评论回复
12
modesty3jonah| | 2023-7-6 15:13 | 只看该作者
内部FLASH有一定的擦写寿命,使用时要注意合理分配扇区和擦写次数,避免过多擦写同一扇区。

使用特权

评论回复
13
adolphcocker| | 2023-7-6 15:20 | 只看该作者
FLASH默认是被锁定的,只有在解锁状态下才能进行写入和擦除操作

使用特权

评论回复
14
claretttt| | 2023-7-6 16:01 | 只看该作者
在进行FLASH编程时,要遵循特定的规则和限制。例如,编程的数据必须按字节、半字或字进行,不能跨越边界;不同扇区的编程不能同时进行等。

使用特权

评论回复
15
mickit| | 2023-7-6 16:34 | 只看该作者
读写flash,为什么读写会不一样

使用特权

评论回复
16
jimmhu| | 2023-7-6 17:01 | 只看该作者
在进行擦除操作之前,建议先将需要保留的数据备份到其他存储位置,以免丢失重要数据。

使用特权

评论回复
17
youtome| | 2023-7-6 17:08 | 只看该作者
提供正确的目标地址、数据和数据长度。请注意,写入操作是以半字(half-word)为单位进行的。

使用特权

评论回复
18
caigang13| | 2023-7-7 08:38 | 只看该作者
内部flash可以用来存储一些重要但不需经常改变的数据

使用特权

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

本版积分规则

8

主题

8

帖子

0

粉丝