標(biāo)題: STM32學(xué)習(xí)-Flash讀寫 [打印本頁(yè)]

作者: xiongxiao    時(shí)間: 2015-5-27 16:24
標(biāo)題: STM32學(xué)習(xí)-Flash讀寫
一直是使用野火的例程學(xué)習(xí)STM32,而他的書里面沒有講到STM32的Flash操作,所以一直以為STM32不能對(duì)Flash進(jìn)行操作。后來想到連STC這等國(guó)產(chǎn)8位機(jī)都可以進(jìn)行Flash操作,想必STM32也可以,所以對(duì)此進(jìn)行了一番小研究。

其實(shí)STM32的庫(kù)里面就有專門針對(duì)Flash的程序,還有一個(gè)專門的文檔,且的中文版本,名字叫《PM0042 STM32F10xxx閃存編程》(見附件)。
手頭開發(fā)板上芯片是STM32F103C8T6,片上Flash為64KB,按ST定義,屬于中容量的,下表就是中容量?jī)?nèi)存組織。


文檔中對(duì)寫Flash有專門的描述,重要的知識(shí)點(diǎn)包括但不限于:
1)擦除操作只能是頁(yè)擦除或全部擦除。
2)寫操作只能是每次寫入16-bit,即雙字節(jié)。
3)在擦除之前,要先寫兩個(gè)鍵值KEY1(0x45670123)和KEY2(0xCDEF89AB)到FLASH_KEYR寄存器,以解除閃存鎖。
我們的程序基本流程是,先讀取Flash中一個(gè)固定地址的數(shù)據(jù),然后通過串口打印,再修改此數(shù)據(jù),修改后再讀回來。
這是寫Flash的程序:
void Writeflash(void)
{
        FLASH_Unlock();
        FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
            FLASHStatus = FLASH_ErasePage(StartAddress);

        if(FLASHStatus == FLASH_COMPLETE)
        {
                FLASHStatus = FLASH_ProgramWord(StartAddress, 0x12345678);
                USART1_printf(USART1, "\r\n");
        }
}

FLASH_Unlock()就是完成解除閃存鎖的工作,以下是FLASH_Unlock()函數(shù)的實(shí)現(xiàn)。
void FLASH_Unlock(void)
{
  /* Authorize the FPEC of Bank1 Access */
  FLASH->KEYR = FLASH_KEY1;
  FLASH->KEYR = FLASH_KEY2;

  #ifdef STM32F10X_XL
  /* Authorize the FPEC of Bank2 Access */
  FLASH->KEYR2 = FLASH_KEY1;
  FLASH->KEYR2 = FLASH_KEY2;
  #endif /* STM32F10X_XL */
}
FLASH_ErasePage()函數(shù)就是完成擦除整頁(yè)數(shù)據(jù)功能,F(xiàn)LASH_ProgramWord()是向Flash固定的地址寫入一個(gè)32-bit數(shù)據(jù)。



程序進(jìn)行相應(yīng)修改可以做成通過USART對(duì)Flash操作,比如,通過串口發(fā)送數(shù)據(jù),修改Flash中的數(shù)據(jù)。
對(duì)Flash的操作用處很多,比如在CAN網(wǎng)絡(luò)中可以在Flash中預(yù)先設(shè)置CAN的地址,也可以通過can通信在線修改地址,再比如在溫度測(cè)量控制系統(tǒng)中可以在Flash預(yù)置傳感器的標(biāo)定值等。







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1