簡介
CH32V103系列是以青稞V3A處理器為核心的32位通用MCU,該處理器是基于RISC-V開源指令集設(shè)計(jì)。片上集成了時(shí)鐘安全機(jī)制、多級電源管理、通用DMA控制器。此系列具有1路USB2.0主機(jī)/設(shè)備接口、多通道12位ADC轉(zhuǎn)換模塊、多通道TouchKey、多組定時(shí)器、多路IIC/USART/SPI接口等豐富的外設(shè)資源。
本章教程將通過程序代碼進(jìn)行內(nèi)部FLASH讀寫操作。
1、CH32V103內(nèi)部FLASH簡介及相關(guān)函數(shù)介紹
CH32V103芯片含有一個(gè)內(nèi)部FLASH,其存儲數(shù)據(jù)在掉電后不會丟失,主要用于存儲程序代碼。芯片在重新上電并復(fù)位后,可通過加載讀取內(nèi)部FLASH中程序代碼運(yùn)行。
通常,我們可通過兩種方式對內(nèi)部FLASH進(jìn)行讀寫:一是通過下載器等外部工具讀寫內(nèi)部FLASH,二是通過芯片運(yùn)行程序代碼讀取自身內(nèi)部FLASH。本章即通過第二種方法進(jìn)行內(nèi)部FLASH讀寫。此外,就讀寫速度而言,讀寫內(nèi)部FLASH比外部FLASH快的多,且由于內(nèi)部FLASH掉電后數(shù)據(jù)不會丟失,因此內(nèi)部FLASH剩余空間可用于存儲重要數(shù)據(jù)和關(guān)鍵記錄。
由于內(nèi)部FLASH可被通過外部工具或程序代碼讀寫,為了防止內(nèi)部FLASH中存儲數(shù)據(jù)被獲取,某些應(yīng)用會禁止讀寫內(nèi)部FLASH內(nèi)容,或在第一次運(yùn)行時(shí)計(jì)算加密信息并記錄到某些區(qū)域,然后刪除自身的部分加密代碼,這些應(yīng)用都涉及到內(nèi)部FLASH的操作。
CH32V103內(nèi)部FLASH主要包含主存儲器和信息塊兩塊區(qū)域,其中信息塊又可被分為兩塊系統(tǒng)引導(dǎo)代碼存儲區(qū)域、用戶選擇字和廠商配置字區(qū)域。其中,主存儲器區(qū)域主要用于用戶的應(yīng)用程序存儲,以4K字節(jié)(32 頁)單位進(jìn)行寫保護(hù)劃分;除了“廠商配置字”區(qū)域出廠鎖定,用戶不可訪問,其他區(qū)域在一定條件下用戶可操作。
CH32V103內(nèi)部FLASH具有2種編程/擦除方式,具體如下:
標(biāo)準(zhǔn)編程:此方式是默認(rèn)編程方式(兼容方式)。這種模式下CPU以單次2字節(jié)方式執(zhí)行編程,單次1K字節(jié)執(zhí)行擦除及整片擦除操作。
快速編程:此方式采用頁操作方式(推薦)。經(jīng)過特定序列解鎖后,執(zhí)行單次128字節(jié)的編程及128字節(jié)擦除。
關(guān)于CH32V103內(nèi)部FLASH具體信息,可參考CH32V103應(yīng)用手冊。CH32V103內(nèi)部FLASH標(biāo)準(zhǔn)庫函數(shù)具體內(nèi)容如下:
2、硬件設(shè)計(jì)
本章教程主要通過程序代碼進(jìn)行內(nèi)部FLASH讀寫操作,使用CH32V103內(nèi)部資源,無需進(jìn)行硬件連接。
3、軟件設(shè)計(jì)
CH32V103內(nèi)部FLASH編程/擦除方式有兩種,一種是標(biāo)準(zhǔn)編程,一種是快速編程,本章即使用上述這兩種方式分別進(jìn)行內(nèi)部FLASH讀寫操作,程序編程主要分3個(gè)步驟:
1、對內(nèi)部FLASH進(jìn)行解鎖;
2、對內(nèi)部FLASH進(jìn)行頁擦除;
3、對內(nèi)部FLASH進(jìn)行讀寫操作。
根據(jù)上述操作步驟,編寫具體程序,具體程序如下:
flash.h文件
flash.h文件主要包含相關(guān)定義和函數(shù)聲明;
flash.c文件
flash.c文件主要包含兩個(gè)函數(shù),一個(gè)是內(nèi)部FLASH標(biāo)準(zhǔn)編程函數(shù)Flash_Test,一個(gè)是內(nèi)部FLASH快速編程函數(shù)Flash_Test_Fast,這兩個(gè)函數(shù)具體執(zhí)行過程如下:
內(nèi)部FLASH標(biāo)準(zhǔn)編程函數(shù)Flash_Test執(zhí)行過程:
(1)調(diào)用FLASH_Unlock函數(shù)進(jìn)行解鎖;
(2) 根據(jù)起始地址及結(jié)束地址計(jì)算需要擦除頁數(shù);
(3) 調(diào)用FLASH_ClearFlag函數(shù)清除各種標(biāo)志位;
(4) 使用for循環(huán)以及調(diào)用FLASH_ErasePage函數(shù)擦除頁數(shù),每次擦除一頁;
(5) 使用while循環(huán)并調(diào)用FLASH_ProgramWord函數(shù)向起始地址至結(jié)束地址的存儲區(qū)域都寫入變量“Data”存儲的數(shù)值數(shù)值;
(6) 調(diào)用FLASH_Lock函數(shù)進(jìn)行上鎖;
(7) 使用指針讀取寫入的數(shù)據(jù)內(nèi)容并校驗(yàn)。
內(nèi)部FLASH快速編程函數(shù)Flash_Test_Fast執(zhí)行過程與標(biāo)準(zhǔn)編程執(zhí)行過程類似,具體如下:
(1)調(diào)用FLASH_Unlock_Fast函數(shù)進(jìn)行解鎖;
(2) 調(diào)用FLASH_ErasePage_Fast函數(shù)擦除指定閃存頁;
(3) 調(diào)用FLASH_BufReset函數(shù)復(fù)位閃存緩沖區(qū),執(zhí)行清除內(nèi)部128字節(jié)緩存區(qū)操作;
(4) 調(diào)用FLASH_BufLoad函數(shù)向指定地址開始連續(xù)寫入16字節(jié)數(shù)據(jù)(4字節(jié)/次操作,寫的地址每次偏移量為4),然后執(zhí)行加載到緩沖區(qū);
(5) 調(diào)用FLASH_ProgramPage_Fast函數(shù)啟動(dòng)一次快速頁編程動(dòng)作,編程指定的閃存頁;
(6) 調(diào)用FLASH_Lock_Fast函數(shù)進(jìn)行上鎖;
(7) 使用for循環(huán)讀取編程地址進(jìn)行數(shù)據(jù)校驗(yàn)并返回校驗(yàn)值。
以上兩個(gè)函數(shù)執(zhí)行過程可對照CH32V103應(yīng)用手冊第24章閃存操作流程進(jìn)行程序編寫,更有助于理解編程。
main.c函數(shù)
main.c函數(shù)主要進(jìn)行函數(shù)初始化以及根據(jù)flash.c文件兩個(gè)函數(shù)返回值輸出相應(yīng)信息。
4、下載驗(yàn)證
將編譯好的程序下載到開發(fā)板并復(fù)位,串口打印情況具體如下:
根據(jù)串口打印信息可知,內(nèi)部FLASH標(biāo)準(zhǔn)編程和快速編程測試成功。
-
處理器
+關(guān)注
關(guān)注
68文章
19286瀏覽量
229841 -
mcu
+關(guān)注
關(guān)注
146文章
17148瀏覽量
351195 -
FlaSh
+關(guān)注
關(guān)注
10文章
1635瀏覽量
148023 -
RISC-V
+關(guān)注
關(guān)注
45文章
2277瀏覽量
46159 -
CH32V103
+關(guān)注
關(guān)注
1文章
13瀏覽量
1015 -
ch32
+關(guān)注
關(guān)注
0文章
73瀏覽量
647
發(fā)布評論請先 登錄
相關(guān)推薦
評論