擦除TIVA TM4C123微控制器上的闪光灯



我一直在尝试理解以下写入微控制器闪存的代码。微控制器是TIVA ARM Cortex M4。我已经阅读了 Tiva™ TM4C123GH6PM 微控制器数据手册的内部存储器第 8 章。在高级别上,我了解闪存地址(FMA(,闪存数据(FMD(以及闪存控制(FMC(和启动配置(BOOTCFG(。

以下是函数中使用的一些变量的定义。

#define FLASH_FMA_R             (*((volatile uint32_t *)0x400FD000))
#define FLASH_FMA_OFFSET_MAX    0x0003FFFF  // Address Offset max
#define FLASH_FMD_R             (*((volatile uint32_t *)0x400FD004))
#define FLASH_FMC_R             (*((volatile uint32_t *)0x400FD008))
#define FLASH_FMC_WRKEY         0xA4420000  // FLASH write key (KEY bit of FLASH_BOOTCFG_R set)
#define FLASH_FMC_WRKEY2        0x71D50000  // FLASH write key (KEY bit of FLASH_BOOTCFG_R cleared)
#define FLASH_FMC_MERASE        0x00000004  // Mass Erase Flash Memory
#define FLASH_FMC_ERASE         0x00000002  // Erase a Page of Flash Memory
#define FLASH_FMC_WRITE         0x00000001  // Write a Word into Flash Memory
#define FLASH_FMC2_R            (*((volatile uint32_t *)0x400FD020))
#define FLASH_FMC2_WRBUF        0x00000001  // Buffered Flash Memory Write
#define FLASH_FWBN_R            (*((volatile uint32_t *)0x400FD100))
#define FLASH_BOOTCFG_R         (*((volatile uint32_t *)0x400FE1D0))
#define FLASH_BOOTCFG_KEY       0x00000010  // KEY Select

此功能用于擦除闪光灯的一部分。该函数从开始地址调用到结束地址。我还没有完全理解这段代码是如何工作的。

//------------Flash_Erase------------
// Erase 1 KB block of flash.
// Input: addr 1-KB aligned flash memory address to erase
// Output: 'NOERROR' if successful, 'ERROR' if fail (defined in FlashProgram.h)
// Note: disables interrupts while erasing
int Flash_Erase(uint32_t addr){
uint32_t flashkey;
if(EraseAddrValid(addr)){
DisableInterrupts();                            // may be optional step
// wait for hardware idle
while(FLASH_FMC_R&(FLASH_FMC_WRITE|FLASH_FMC_ERASE|FLASH_FMC_MERASE)){
// to do later: return ERROR if this takes too long
// remember to re-enable interrupts
};
FLASH_FMA_R = addr;
if(FLASH_BOOTCFG_R&FLASH_BOOTCFG_KEY){          // by default, the key is 0xA442
flashkey = FLASH_FMC_WRKEY;
} else{                                         // otherwise, the key is 0x71D5
flashkey = FLASH_FMC_WRKEY2;
}
FLASH_FMC_R = (flashkey|FLASH_FMC_ERASE);       // start erasing 1 KB block
while(FLASH_FMC_R&FLASH_FMC_ERASE){
// to do later: return ERROR if this takes too long
// remember to re-enable interrupts
};           // wait for completion (~3 to 4 usec)
EnableInterrupts();
return NOERROR;
}
return ERROR;
}

问题:函数如何退出两个 while 循环?变量FLASH_FMC_WRITE、FLASH_FMC_ERASE和FLASH_FMC_MERASE如何变化?"0"可以写为擦除过程的一部分吗?

FLASH_FMC_WRITE、FLASH_FMC_ERASE 和 FLASH_FMC_MERASE 是FLASH_FMC_R寄存器值(位字段(中的单个位。 查看器件的参考手册(或数据手册(中FLASH_FMC_R寄存器的说明,您将找到这些位的说明以及更多内容。

while 循环重复读取FLASH_FMC_R寄存器值,并在设置指定位时退出。 闪存控制器在适当的时候设置这些位(阅读参考手册(。

擦除闪存意味着将所有位设置为 1(所有字节设置为 0xFF(。 写入闪存意味着将选择位设置为 0。 不能通过写入将位从 0 更改为 1。 您需要擦除才能做到这一点。 这就是闪光灯的工作方式。

最新更新