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

时间:2018-06-11 23:44:13

标签: embedded

我一直试图理解以下代码写入微控制器闪存。微控制器是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”写入擦除过程的一部分吗?

1 个答案:

答案 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。 你需要擦除才能做到这一点。这就是闪存的工作方式。