首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在TIVA TM4C123单片机上擦除闪光灯

在TIVA TM4C123单片机上擦除闪光灯
EN

Stack Overflow用户
提问于 2018-06-11 23:44:13
回答 1查看 930关注 0票数 1

我一直在尝试理解下面的代码,这是写到微控制器闪光灯。单片机为TIVA臂皮质M4。我读过Tiva TM4C123GH6PM™单片机数据表的内部记忆第8章。在高层次上,我了解Flash内存地址(FMA)、Flash内存数据(FMD)、Flash内存控制(FMC)和引导配置(BOOTCFG)。

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

代码语言:javascript
复制
#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

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

代码语言:javascript
复制
//------------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”可以写成擦除过程的一部分吗?

EN

回答 1

Stack Overflow用户

发布于 2018-06-12 03:27:18

FLASH_FMC_WRITE、FLASH_FMC_ERASE和FLASH_FMC_MERASE是FLASH_FMC_R寄存器值(位字段)中的单个位。在部件的参考手册(或者数据表)中查看FLASH_FMC_R寄存器的描述,您会发现这些位元的描述等等。

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

擦除闪存意味着将所有位设置为1(所有字节都设置为0xFF)。写入闪存意味着将select位设置为0。您不能用写从0更改为1。你得抹去才行。这就是闪光灯的工作方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50807464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档