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。 |