STR710的內部Flash讀寫

        我是初學者,寫這篇僅是個人理解。內部FLASH的讀寫不同與一般的Nand Flash的讀寫。我們下載程序大多數是下到內部Flash的 BANK 0中,一般的讀寫數據在BANK 1的0扇區和1扇區中,總共可以儲存16K的數據。內部Flash具有寫保護,任何對內部FLASH的寫操作都必須在RAM中進行。當進行寫操作以後內部FLASH中的FLASH_CR0寄存器的LOCK位會被置位後,任何讀寫都是無效的。只有等到該位被清零以後才能進行其他操作。所以必須把清零這段代碼放在RAM中進行。

      方法:如果是直接調用KEIL中的庫函數,就在加載文件(.sct)文件中添加

LR_IROM1 0x40000000 0x00040000  {    ; load region size_region
  ER_IROM1 0x40000000 0x00040000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00010000  {  ; RW data
  
flash.o(i.FLASH_WaitForLastTask)   ;添加代碼
   .ANY (+RW +ZI)
  }
}

在main()中的程序爲:

void flash(void)
{
 uint32 Read_Data;
 uint8  readnum[8];

 FLASH_Init();           //初始化
 FLASH_WritePrConfig (FLASH_B1F0, DISABLE) ;   //取消寫保護
 FLASH_WaitForLastTask();
 FLASH_SectorErase (FLASH_B1F0) ;  //  擦除 Bank 1 sector 0
 FLASH_WaitForLastTask();
 FLASH_WordWrite (0x0C0000, 0x12345678) ;  //  寫 0x12345678 到 Bank 1 sector 0
 FLASH_WaitForLastTask();
  

    Read_Data = FLASH_WordRead(0x0C0000); // 在地址0x0C0000讀數據

}

如果是用庫中的調用.c文件中改爲:

#pragma arm section code= "RAM_Function"     //添加的內容

void FLASH_WaitForLastTask(void)
{
  /* Wait until the Flash controller acknowledges the end of the last
    operation resetting the BSYAs and LOCK bits in the CR0 register */
  while((FLASH->CR0 & FLASH_FLAG_LOCKBSY) != RESET);
}

#pragma arm section                                //添加的內容

在加載文件中改爲:

RW_IRAM1 0x20000000 0x00010000   64K RAM
   {     
      *.o(RAM_Function)                   
//添加的內容
      .ANY (+RW +ZI)   
   }

同時keil中的設置如下:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章