国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

STM32F103學(xué)習(xí)筆記(3)——讀寫(xiě)內(nèi)部Flash

發(fā)布者:Enchanted2023最新更新時(shí)間:2025-02-21 來(lái)源: jianshu關(guān)鍵字:STM32F103  讀寫(xiě)內(nèi)部Flash 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

一、簡(jiǎn)介

在STM32芯片內(nèi)部有一個(gè) FLASH 存儲(chǔ)器,它主要用于存儲(chǔ)代碼,我們?cè)陔娔X上編寫(xiě)好應(yīng)用程序后,使用下載器把編譯后的代碼文件燒錄到該內(nèi)部 FLASH 中,由于 FLASH 存儲(chǔ)器的內(nèi)容在掉電后不會(huì)丟失,芯片重新上電復(fù)位后,內(nèi)核可從內(nèi)部 FLASH 中加載代碼并運(yùn)行。


STM32 的內(nèi)部 FLASH 包含主存儲(chǔ)器、系統(tǒng)存儲(chǔ)器以及選項(xiàng)字節(jié)區(qū)域,它們的地址分布及大小見(jiàn)下表


  • 主存儲(chǔ)器

一般我們說(shuō) STM32 內(nèi)部 FLASH 的時(shí)候,都是指這個(gè)主存儲(chǔ)器區(qū)域,它是存儲(chǔ)用戶應(yīng)用程序的空間,芯片型號(hào)說(shuō)明中的 256K FLASH、512K FLASH 都是指這個(gè)區(qū)域的大小。

主存儲(chǔ)器分為 256 頁(yè),每頁(yè)大小為 2KB,共 512KB。這個(gè)分頁(yè)的概念,實(shí)質(zhì)就是 FLASH 存儲(chǔ)器的扇區(qū),與其它 FLASH 一樣,在寫(xiě)入數(shù)據(jù)前,要先按頁(yè)(扇區(qū))擦除。

注意上表中的主存儲(chǔ)器是本實(shí)驗(yàn)板使用的 STM32VET6 型號(hào)芯片的參數(shù),即 STM32F1 大容量產(chǎn)品。若使用超大容量、中容量或小容量產(chǎn)品,它們主存儲(chǔ)器的頁(yè)數(shù)量、頁(yè)大小均有不同,使用的時(shí)候要注意區(qū)分。
主存儲(chǔ)器是以頁(yè)為單位劃分的。stm32根據(jù)FLASH主存儲(chǔ)塊容量、頁(yè)面的不同,系統(tǒng)存儲(chǔ)器的不同,分為小容量、中容量、大容量、互聯(lián)型,共四類(lèi)產(chǎn)品。

  • 小容量產(chǎn)品:主存儲(chǔ)塊1-32KB,     每頁(yè)1KB。系統(tǒng)存儲(chǔ)器2KB

  • 中容量產(chǎn)品:主存儲(chǔ)塊64-128KB,   每頁(yè)1KB。系統(tǒng)存儲(chǔ)器2KB

  • 大容量產(chǎn)品:主存儲(chǔ)塊256KB以上,  每頁(yè)2KB。系統(tǒng)存儲(chǔ)器2KB

  • 互聯(lián)型產(chǎn)品:主存儲(chǔ)塊256KB以上,  每頁(yè)2KB。系統(tǒng)存儲(chǔ)器18KB

  • 系統(tǒng)存儲(chǔ)區(qū)

系統(tǒng)存儲(chǔ)區(qū)是用戶不能訪問(wèn)的區(qū)域,它在芯片出廠時(shí)已經(jīng)固化了啟動(dòng)代碼,它負(fù)責(zé)實(shí)現(xiàn)串口、USB 以及 CAN 等 ISP 燒錄功能。

  • 選項(xiàng)字節(jié)

選項(xiàng)字節(jié)用于配置 FLASH 的讀寫(xiě)保護(hù)、待機(jī)/停機(jī)復(fù)位、軟件/硬件看門(mén)狗等功能,這部分共 16 字節(jié)。可以通過(guò)修改 FLASH 的選項(xiàng)控制寄存器修改。

二、查看工程的空間分布

由于內(nèi)部 FLASH 本身存儲(chǔ)有程序數(shù)據(jù),若不是有意刪除某段程序代碼,一般不應(yīng)修改程序空間的內(nèi)容,所以在使用內(nèi)部 FLASH 存儲(chǔ)其它數(shù)據(jù)前需要了解哪一些空間已經(jīng)寫(xiě)入了程序代碼,存儲(chǔ)了程序代碼的扇區(qū)都不應(yīng)作任何修改。通過(guò)查詢(xún)應(yīng)用程序編譯時(shí)產(chǎn)生
的“*.map”后綴文件,可以了解程序存儲(chǔ)到了哪些區(qū)域。


打開(kāi) map 文件后,查看文件最后部分的區(qū)域,可以看到一段以 “Memory Map of the image” 開(kāi)頭的記錄(若找不到可用查找功能定位)

觀察表中的最后一項(xiàng),它的基地址是 0x0800175c,大小為 0x00000020,可知它占用的
最高的地址空間為 0x0800177c,跟執(zhí)行區(qū)域的最高地址 0x0000177c 一樣,但它們比加載
區(qū)域說(shuō)明中的最高地址 0x80017a8 要小,所以我們以加載區(qū)域的大小為準(zhǔn)。對(duì)比表 45-1 的
內(nèi)部 FLASH 頁(yè)地址分布表,可知僅使用頁(yè) 0 至頁(yè) 2 就可以完全存儲(chǔ)本應(yīng)用程序,所以從頁(yè)
3(地址 0x08001800)后的存儲(chǔ)空間都可以作其它用途,使用這些存儲(chǔ)空間時(shí)不會(huì)篡改應(yīng)用程
序空間的數(shù)據(jù)。

三、寫(xiě)入Flash

3.1 寫(xiě)入過(guò)程

3.1.1 解鎖

由于內(nèi)部 FLASH 空間主要存儲(chǔ)的是應(yīng)用程序,是非常關(guān)鍵的數(shù)據(jù),為了防止誤操作修改了這些內(nèi)容,芯片復(fù)位后默認(rèn)會(huì)給控制寄存器 FLASH_CR 上鎖,這個(gè)時(shí)候不允許設(shè)置 FLASH 的控制寄存器,從而不能修改 FLASH 中的內(nèi)容。

所以對(duì) FLASH 寫(xiě)入數(shù)據(jù)前,需要先給它解鎖。解鎖的操作步驟如下:

  1. 往 FPEC 鍵寄存器 FLASH_KEYR 中寫(xiě)入 KEY1 = 0x45670123

  2. 再往 FPEC 鍵寄存器 FLASH_KEYR 中寫(xiě)入 KEY2 = 0xCDEF89AB

3.1.2 頁(yè)擦除

在寫(xiě)入新的數(shù)據(jù)前,需要先擦除存儲(chǔ)區(qū)域,STM32 提供了頁(yè)(扇區(qū))擦除指令和整個(gè) FLASH 擦除(批量擦除)的指令,批量擦除指令僅針對(duì)主存儲(chǔ)區(qū)。
頁(yè)擦除的過(guò)程如下:

  1. 檢查 FLASH_SR 寄存器中的“忙碌寄存器位 BSY”,以確認(rèn)當(dāng)前未執(zhí)行任何 Flash 操作;

  2. 在 FLASH_CR 寄存器中,將“激活頁(yè)擦除寄存器位 PER ”置 1;

  3. 用 FLASH_AR 寄存器選擇要擦除的頁(yè);

  4. 將 FLASH_CR 寄存器中的“開(kāi)始擦除寄存器位 STRT ”置 1,開(kāi)始擦除;

  5. 等待 BSY 位被清零時(shí),表示擦除完成。

3.1.3 寫(xiě)入數(shù)據(jù)

擦除完畢后即可寫(xiě)入數(shù)據(jù),寫(xiě)入數(shù)據(jù)的過(guò)程并不是僅僅使用指針向地址賦值,賦值前還需要配置一系列的寄存器,步驟如下:

  1. 檢查 FLASH_SR 中的 BSY 位,以確認(rèn)當(dāng)前未執(zhí)行任何其它的內(nèi)部 Flash 操作;

  2. 將 FLASH_CR 寄存器中的 “激活編程寄存器位 PG” 置 1;

  3. 向指定的 FLASH 存儲(chǔ)器地址執(zhí)行數(shù)據(jù)寫(xiě)入操作,每次只能以 16 位的方式寫(xiě)入;

  4. 等待 BSY 位被清零時(shí),表示寫(xiě)入完成。

3.2 寫(xiě)入函數(shù)

/* STM32大容量產(chǎn)品每頁(yè)大小2KByte,中、小容量產(chǎn)品每頁(yè)大小1KByte */

#if defined (STM32F10X_HD) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) || defined (STM32F10X_XL)

  #define FLASH_PAGE_SIZE       ((uint16_t)0x800)   // 2048

#else

  #define FLASH_PAGE_SIZE       ((uint16_t)0x400)   // 1024

#endif


#define WRITE_START_ADDR        ((uint32_t)0x08008000)

#define WRITE_END_ADDR          ((uint32_t)0x0800C000)


/**

 @brief 內(nèi)部Flash寫(xiě)入

 @param address -[in] 寫(xiě)入的地址

 @param pData -[in&out] 指向需要操作的數(shù)據(jù)

 @param dataLen -[in] 數(shù)據(jù)長(zhǎng)度

 @return true - 成功;false - 失敗

*/

bool Internal_WriteFlash(uint32_t addrStart, uint32_t *pData, uint32_t dataLen)

{   

    uint32_t i = 0;

    uint32_t eraseCounter = 0x00;                                                               // 記錄要擦除多少頁(yè)

    uint32_t address = 0x00;                                                                    // 記錄寫(xiě)入的地址

    uint32_t numberOfPage = 0x00;                                                               // 記錄寫(xiě)入多少頁(yè)

    FLASH_Status flashStatus = FLASH_COMPLETE;                                                  // 記錄每次擦除的結(jié)果

    

    address = addrStart;

    

    FLASH_Unlock();                                                                             // 解鎖

    numberOfPage = (WRITE_END_ADDR - address) / FLASH_PAGE_SIZE;                                // 計(jì)算要擦除多少頁(yè)

    FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);  // 清除所有標(biāo)志

    

    // 按頁(yè)擦除

    for(eraseCounter = 0; (eraseCounter < numberOfPage) && (flashStatus == FLASH_COMPLETE); eraseCounter++)

    {

        flashStatus = FLASH_ErasePage(address + (FLASH_PAGE_SIZE * eraseCounter));

    }

    

    for(i = 0; (i < dataLen)&&(flashStatus == FLASH_COMPLETE); i++)

    {

        flashStatus = FLASH_ProgramWord(address, pData[i]);                                     // 寫(xiě)入一個(gè)字(32位)的數(shù)據(jù)入指定地址

        address = address + 4;                                                                  // 地址偏移4個(gè)字節(jié) 

    }

    

    FLASH_Lock();                                                                               // 重新上鎖

    

    if(flashStatus == FLASH_COMPLETE)

    {

        return true;

    }

    return false;

}


四、讀取Flash

4.1 讀取函數(shù)

/**

 @brief 內(nèi)部Flash讀取

 @param address -[in] 讀取的地址

 @param pData -[in&out] 指向需要操作的數(shù)據(jù)

 @param dataLen -[in] 數(shù)據(jù)長(zhǎng)度

 @return true - 成功;false - 失敗

*/

bool Internal_ReadFlash(uint32_t addrStart, uint32_t *pData, uint32_t dataLen)

{

    uint32_t i = 0;

    uint32_t address = 0x00;

    

    address = addrStart;

    

    for(i = 0; i < dataLen; i++)

    {

        pData[i] = (*(__IO uint32_t*) address);                                                 // 讀指定地址的一個(gè)字的數(shù)據(jù)

        address += 4;                                                                           // 地址偏移4個(gè)字節(jié)        

    }

    

    return true;

}


五、舉例

int main(void)

{    

    u32 in_data[5]={11,22,33,44,55};//要寫(xiě)入的數(shù)據(jù)

    u32 out_data[5];//讀存放

    int i;

    u8 STATUS=0;

    USART1_Config();//串口1配置

    GPIO_Configuration();//GPIO配置,用于點(diǎn)亮led

    STATUS=Internal_WriteFlash(0x08001800,in_data,5);

    Delay(0x02FFFF);

    if(STATUS)

    {

            GPIO_SetBits(GPIOD, GPIO_Pin_13);//點(diǎn)亮led1

            Internal_ReadFlash(0x08001800,out_data,5);

            printf('rn The Five Data Is : rn');

            for(i=0;i<5;i++)

            {

                    printf('r %d r',out_data[i]);

            }

    }

    while(1);

}


關(guān)鍵字:STM32F103  讀寫(xiě)內(nèi)部Flash 引用地址:STM32F103學(xué)習(xí)筆記(3)——讀寫(xiě)內(nèi)部Flash

上一篇:STM32F103學(xué)習(xí)筆記(4)——LCD段碼屏HT1621使用
下一篇:STM32F103學(xué)習(xí)筆記(2)——收音機(jī)模塊TEA5767使用

推薦閱讀最新更新時(shí)間:2025-06-27 19:54

stm32f030和stm32f103功能差異
stm32f030和stm32f103功能差異主要表現(xiàn)在哪? stm32f030和stm32f103功能差異最大的區(qū)別就是IO作為雙向IO使用時(shí),每個(gè)GPI/O端口有兩個(gè)32位配置寄存器是可以自由編程的,而030系列把IO口作為雙向IO使用并且可以直接配置為上拉開(kāi)漏輸出,stm32f030在模擬IIC時(shí)序中使用的時(shí)候最實(shí)用。 030系列的在輸入和輸出都有效,103系列的上下拉僅限在工作時(shí)的輸入通道有效,030系列在浮空輸出時(shí)也可以使用上下拉電阻,在103系列單片機(jī)中浮空輸出是不能使用上下拉的,必須使用外部電阻輔助才能有效進(jìn)行工作。
[單片機(jī)]
stm32f103 flash模擬eeprom
STM32F103是意法半導(dǎo)體(STMicroelectronics)推出的一款32位單片機(jī)系列,該系列芯片具有高性能和豐富的外設(shè)接口,廣泛應(yīng)用于工業(yè)控制、消費(fèi)電子、汽車(chē)電子等領(lǐng)域。其中,STM32F103的Flash存儲(chǔ)器可以模擬EEPROM的功能,在本文中我們將詳細(xì)介紹如何使用STM32F103的Flash存儲(chǔ)器來(lái)實(shí)現(xiàn)EEPROM。 概述 EEPROM(Electrically Erasable Programmable Read-Only Memory)是一種可擦寫(xiě)的非易失性存儲(chǔ)器,可以在不使用外部電壓的情況下對(duì)其進(jìn)行擦除和編程。它不同于Flash存儲(chǔ)器的主要特點(diǎn)是可以對(duì)單個(gè)字節(jié)進(jìn)行隨機(jī)讀寫(xiě)操作。而STM32F103的Fl
[單片機(jī)]
STM32F103單片機(jī)驅(qū)動(dòng)TM1637數(shù)碼管顯示模塊
最近項(xiàng)目中需要用到數(shù)碼管顯示,于是買(mǎi)了一個(gè)TM1637芯片驅(qū)動(dòng)的四位數(shù)碼顯示模塊,現(xiàn)將調(diào)試過(guò)程記錄一下,方便以后參考。 使用的單片機(jī)是STM32F103C8T6最小系統(tǒng) 使用的數(shù)碼管模塊是TM1637四位數(shù)碼管顯示模塊 實(shí)際運(yùn)行效果 下面先看一下TM1637和數(shù)碼管連接的具體線路圖 實(shí)際使用的模塊沒(méi)有帶按鍵,只用了4個(gè)數(shù)碼管,模塊和單片機(jī)連接只需要4根線VCC、GND、CLK、DIO。芯片和單片機(jī)通信使用的是I2C總線,下面就來(lái)說(shuō)一下如何通過(guò)I2C總線驅(qū)動(dòng)這個(gè)數(shù)碼管模塊。 為了方便移植,這里使用 IO口模擬I2C總線,所以首先要將延時(shí)函數(shù)準(zhǔn)備好,延時(shí)函數(shù)使用任何一種方式都可以,可以根據(jù)自己的習(xí)慣使用自己的
[單片機(jī)]
<font color='red'>STM32F103</font>單片機(jī)驅(qū)動(dòng)TM1637數(shù)碼管顯示模塊
STM32F103C8T6定時(shí)器TIM4通道1、2輸出PWM
這美妙的波形,真好,我他喵的終于把你弄出來(lái)了。 STM32F103C8T6使用定時(shí)器TIM4進(jìn)行雙通道的PWM輸出: 下面的圖是從STM32中文參考手冊(cè)中截取的,定時(shí)器TIM4的通用和復(fù)用功能I/O 我選用的是TIM4_CH1和TIM4_CH2也就是PB6和PB7輸出。 注意事項(xiàng): 輸出PWM是屬于IO口的復(fù)用功能,所以在設(shè)置GPIO_Mode的時(shí)候一定要設(shè)置為GPIO_Mode_AF_PP也就是推挽復(fù)用。 我就是被這個(gè)卡了好長(zhǎng)時(shí)間……,感覺(jué)自己蠢到家了。 我是用的正點(diǎn)原子的精英板學(xué)的32,所以一些寫(xiě)代碼的習(xí)慣都是學(xué)的正點(diǎn)原子的。 下面是代碼 timer.c #include timer.h //TIM
[單片機(jī)]
<font color='red'>STM32F103</font>C8T6定時(shí)器TIM4通道1、2輸出PWM
STM32F103 PB3 PB4使用方法
今天調(diào)試PB3,用戶普通IO,調(diào)試半天,還以為PCB問(wèn)題,問(wèn)題找了許久也沒(méi)找到。有時(shí)候人麻木了,思考問(wèn)題的思路就受限了,習(xí)慣性以為配置一下IO就可以用了,沒(méi)有注意到PB3為JTAG共用IO,默認(rèn)為JTAG狀態(tài),需要禁用JTAG才能使用。 DelayMS(2000); //建議延時(shí)一下,否則導(dǎo)致無(wú)法jtag、sw連接CPU,處理起來(lái)比較麻煩哦。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //必須執(zhí)行這句 //GPIO_PinRemapConfig(GPIO_Rem
[單片機(jī)]
STM32F103ZET6 —— GPIO
STM32 的 GPIO 可以由軟件配置成為幾種不同的模式,每個(gè)I/O端口位可以自由編程,然而I/0端口寄存器必須按32位字被訪問(wèn): A. 芯片側(cè): 1. 輸入: MODE Descriptions 輸入浮空 引腳配置成為浮空狀態(tài),接施密特觸發(fā)器,常用的場(chǎng)景是外接按鍵 輸入上拉 輸入接上拉電阻,將不確定的信號(hào)鉗位到高電平 輸入下拉 輸入接下拉電阻,將不確定的信號(hào)鉗位到低電平 模擬輸入 信號(hào)直接進(jìn)入ADC模塊,即無(wú)法再輸入寄存器中讀到IO口的狀態(tài) 2. 輸出: MODE Descriptions 開(kāi)漏輸出 所謂開(kāi)漏,指MOSFET漏極。IO輸出1時(shí),懸空,需要外部電路上拉電
[單片機(jī)]
基于STM32F103的水動(dòng)力測(cè)控系統(tǒng)設(shè)計(jì)的解決方案
測(cè)控系統(tǒng)是水動(dòng)力實(shí)驗(yàn)中的重要測(cè)試設(shè)備。在實(shí)驗(yàn)中有壓力、拉力、加速度等物理量通過(guò)傳感器轉(zhuǎn)換成電壓值,需要準(zhǔn)確記錄。雖然實(shí)驗(yàn)?zāi)P陀泻芏喾N,但是共用傳感器及測(cè)控系統(tǒng),因此對(duì)測(cè)控系統(tǒng)的通用性和用戶界面友好性提出了要求。本文采用嵌入式架構(gòu)設(shè)計(jì)了測(cè)控系統(tǒng)。 本文設(shè)計(jì)的系統(tǒng)硬件基于STM32芯片,具有很強(qiáng)的擴(kuò)展能力,易于移植,其外設(shè)單元資源豐富,能夠達(dá)到系統(tǒng)要求的精度和范圍。 1、硬件架構(gòu) 采用嵌入式架構(gòu)(見(jiàn)圖1)的優(yōu)點(diǎn)是通用性強(qiáng),便于在多平臺(tái)移植;主控芯片外圍電路模塊豐富,包括ADC、DA、CAN和SDIO等接口,獨(dú)立完成對(duì)多種類(lèi)型設(shè)備的測(cè)量、控制。芯片的主頻高,運(yùn)算能力也很強(qiáng),適合嵌入復(fù)雜的算法。完全適合作為測(cè)控系統(tǒng),具備系統(tǒng)升級(jí)和擴(kuò)展
[測(cè)試測(cè)量]
基于STM32F103RET6的編譯碼系統(tǒng)
引言 由于曼徹斯特(MancheSTer)編碼具有傳輸時(shí)無(wú)直流分量,時(shí)鐘提取方便等特點(diǎn),被廣泛地應(yīng)用于以太網(wǎng)、車(chē)輛總線、工業(yè)總線中?,F(xiàn)在工程上常用的曼徹斯特編譯碼芯片為HD-6408和HD-6409,但是這種芯片有一些不足。首先,該芯片在傳輸速率和每幀數(shù)據(jù)中的有效位數(shù)等方面都做了嚴(yán)格的限制。其次,使用該芯片需要增加額外的硬件電路,提高了系統(tǒng)成本。使用FPGA做曼徹斯特編譯碼成本高,而且開(kāi)發(fā)周期長(zhǎng)。本文提出了一種基于STM32F103RET6的編譯碼系統(tǒng)方案,利用了STM32F103RET6強(qiáng)大的定時(shí)器功能,采用靈活的編譯碼方式,傳輸速率和數(shù)據(jù)幀格式都可以根據(jù)需要完全自行定義。STM32F103RET6自帶DMA的功能使得數(shù)據(jù)編碼不
[單片機(jī)]
基于<font color='red'>STM32F103</font>RET6的編譯碼系統(tǒng)
小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車(chē)開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved