我一直试图理解以下代码写入微控制器闪存。微控制器是TIVA ARM Cortex M4。我已经阅读了Tiva™ TM4C123GH6PM Microcontroller Data sheet的内部记忆第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”写入擦除过程的一部分吗?
答案 0 :(得分:0)
FLASH_FMC_WRITE,FLASH_FMC_ERASE和FLASH_FMC_MERASE是FLASH_FMC_R寄存器值(位域)中的各个位。在FLASH_FMC_R寄存器的描述中查看器件的参考手册(或数据手册),您将找到这些位的描述等。
while循环重复读取FLASH_FMC_R寄存器值,并在指定位置1时退出。闪存控制器在适当时设置这些位(阅读参考手册)。
擦除闪存意味着将所有位设置为1(所有字节都设置为0xFF)。写入闪存意味着将选择位设置为0.通过写入不能将位从0更改为1。 你需要擦除才能做到这一点。这就是闪存的工作方式。