前言
NVM是非易失性存儲(chǔ)器(Non Volatile Memory)的簡(jiǎn)稱,在這里是指MCU的內(nèi)部Flash。本文首先介紹了MCU的整個(gè)memory map的分布,接著介紹NVM子系統(tǒng)(主要指如何訪問(wèn)Flash),然后介紹PFlash/DFlash的特性,分布,F(xiàn)lash命令等內(nèi)容,最后介紹了SOTA和AB swap實(shí)現(xiàn)原理以及各個(gè)UCB的作用。
正文
1.Overview
TC3xx芯片最多有6個(gè)內(nèi)核,每個(gè)核有自己的私有的Memory以及共有的Memory。
私有的:PSPR, DSPR, PCache, DCache, DLMU, LPB。PSPR主要用來(lái)運(yùn)行RAM Code,比如說(shuō)有些代碼要放到RAM里面運(yùn)行。DSPR主要當(dāng)成SRAM來(lái)用,比如用來(lái)存放全局變量。每個(gè)內(nèi)核可以通過(guò)私有的SPB總線訪問(wèn)自己私有的3M的Local PFlash Bank。
共有的:
其他核可以通過(guò)SRI總線訪問(wèn)其他核的私有Memory。
帶Cache的PFLASH的地址從0x80000000開(kāi)始,不帶Cache的PFLASH的地址從0xA0000000開(kāi)始。
不管是0x80000000還是0xA0000000他們?cè)谖锢砩嫌成涞降牡刂范际且粯拥模褂?x80000000訪問(wèn)就會(huì)經(jīng)過(guò)Cache,0xA0000000不用經(jīng)過(guò)Cache。
DFlash 0和DFLash 1可以當(dāng)作模擬EEPROM來(lái)用,其中DFash1可以被HSM訪問(wèn),也就是說(shuō)DFLASH1可以被HSM當(dāng)成模擬的EEPROM來(lái)用。0xAFE00000到0xAFFFFFFF可以用來(lái)外擴(kuò)FLASH時(shí)使用。
0x90000000開(kāi)始是經(jīng)過(guò)DCache訪問(wèn)核外部Ram的地址,0xB0000000是不經(jīng)過(guò)DCache訪問(wèn)核外部Ram的地址。二者最終訪問(wèn)的物理地址就是0xB0000000開(kāi)始的核外部Ram。
2.NVM Sub-system
DMU提供操作Flash的接口,每個(gè)CPU通過(guò)PFI總線訪問(wèn)Local Flash。
Prefetch Path指的是我們可以從Flash里面預(yù)取一部分指令放到Flash Prefetch Buffer里面,提高程序的運(yùn)行速度。
Demand Path沒(méi)有預(yù)取指令功能,通過(guò)具體地址去Flash取某一行指令,
不管是Prefetch Path還是Demand Path,在取指的時(shí)候都會(huì)有Ecc的自動(dòng)糾錯(cuò)功能,比如我們從Flash取數(shù)據(jù)出來(lái),中間有一位有錯(cuò)誤,經(jīng)過(guò)Ecc的自動(dòng)糾錯(cuò)功能能把這一位給糾正過(guò)來(lái)。
DMU是操作Flash的接口部分,它有兩個(gè)接口,一個(gè)是Host Command接口,一個(gè)是HSM Command接口,Host接口主要給Tricore用的,HSM接口主要給HSM操作DFlash1的時(shí)候用的。
3.PFlash和DFlash
Flash主要用來(lái)存儲(chǔ)和運(yùn)行代碼的,TC3xx里面的所有Flash的Sector都是16K(Logic Sector),128個(gè)Logic Sector組成一個(gè)1M的Physical Sector。PFlash出來(lái)用來(lái)存放主核運(yùn)行的代碼外,還可以用來(lái)存放HSM運(yùn)行的代碼以及TP Code,TP Code存放在Flash,SSW啟動(dòng)程序里面可以調(diào)用這些TP Code。
Flash的操作都按頁(yè)作為單位的,PFlash一頁(yè)是32個(gè)Byte,DFlash一頁(yè)是8個(gè)Byte。Write Burst指令可以一次操作8個(gè)Page。
TC2xx和TC3xx的Flash的比較。
AURIX 2G相對(duì)于AURIX 1G的主要變化點(diǎn)。
4.SOTA & AB SWAP
當(dāng)SOTA功能激活時(shí),PFLash被劃分為兩部分,一部分用來(lái)存儲(chǔ)可執(zhí)行代碼(active bank),另一部分可用來(lái)讀取和寫(xiě)入(inactive bank)。當(dāng)APP更新完畢后,兩個(gè)部分互換,即切換上面兩種地址映射方式。在標(biāo)準(zhǔn)模式下使用PF0-1和PF4作為active bank,在Alternate模式下使用PF2-3和PF5作為active bank,就可以實(shí)現(xiàn)在A和B分區(qū)中寫(xiě)入完全相同的APP程序,以相同的地址進(jìn)行運(yùn)行。
需要注意的是,所有NVM操作都是通過(guò)DMU使用PFLASH的物理系統(tǒng)地址執(zhí)行的,也就是說(shuō),NVM操作總是使用標(biāo)準(zhǔn)的地址映射,而不管選擇使用哪種地址映射。“NVM操作”是一個(gè)術(shù)語(yǔ),用于任何針對(duì)FLASH的命令,如程序、擦除等,但不包括讀取和執(zhí)行代碼。
有關(guān)SOTA地址映射的參數(shù)在Flash中的UCB(User Configuration Block)中進(jìn)行配置,在UCB中配置后,只有當(dāng)下次MCU復(fù)位的時(shí)候才會(huì)更新配置。
AB SWAP是TC3xx新增加的功能,主要給Software update over the air (OTA)用的。
簡(jiǎn)單來(lái)講,TC3xx里面的Flash我們可以簡(jiǎn)單的分為Bank A和Bank B,在Bank A運(yùn)行程序的時(shí)候我們可以同步的去擦寫(xiě)B(tài)ank B,也就是說(shuō)Bank A和Bank B是完全獨(dú)立的,這樣在應(yīng)用程序運(yùn)行的時(shí)候也能同步的更新應(yīng)用程序。
所謂的AB Swap也就是等更新完了程序之后,可以在UCB里面修改Swap mode,程序復(fù)位后新的程序就會(huì)運(yùn)行。這樣的好處就是不需要bootloader也可以在線更新程序,并且在線更新程序的時(shí)候不影響當(dāng)前程序的執(zhí)行的。
TC3xx中Flash最大為16M,其中的7M是支持SWAP功能的。
A Bank分為A0, A1, A2
B Bank分為B0, B1, B2
在Standard模式下,程序是從A Bank開(kāi)始運(yùn)行的,也就是A0, A1, A2是Active Bank,當(dāng)A Bank運(yùn)行的時(shí)候需要程序更新,程序更新到B Bank,更新完后切換到B Bank,程序從B Bank開(kāi)始運(yùn)行。
沒(méi)有使能AB Swap功能時(shí),A0, A1, A2和B0, B1, B2是CPU0-5的Local Flash,CPU可以通過(guò)私有的總線訪問(wèn)Local Flash(速度更快),使能了AB Swap之后,CPU不能使用私有總線訪問(wèn)Local Flash了(速度下降),需要使用外部的SRI總線訪問(wèn)Flash。
TC397有7M空間可以進(jìn)行AB Swap,Tx377是3M。
如果使用HSM,則在進(jìn)行SWAP只想,HSM的代碼也需要下載到inactive Bank里面,防止芯片鎖死。
不管是Standard模式還是Alternate模式,程序的執(zhí)行都是從0x80000000開(kāi)始的,也就是說(shuō)下載一個(gè)新的程序到B Bank,這個(gè)程序本身的地址是不需要變的,原來(lái)是0x80000000開(kāi)始現(xiàn)在也是從0x80000000開(kāi)始。
不管是Standard還是Alternate模式,在操作Flash的時(shí)候,傳入的參數(shù)都必須是絕對(duì)地址。如果是從Flash里面讀取數(shù)據(jù),則需要使用相對(duì)地址。
程序在A Bank運(yùn)行時(shí),接收到新的應(yīng)用程序Program到B Bank以后,接下來(lái)需要配置新的UCB_SWAP,最多可以配置16條SWAP Mode,一般來(lái)說(shuō)在設(shè)置一條新的SWAP Mode以后需要把前面一條的SWAP Mode給Invalid掉。
初始化狀態(tài)是使用標(biāo)準(zhǔn)地址映射,此時(shí)SOTA模式未啟用。按以下步驟啟用SOTA:
① 用燒寫(xiě)器把APP燒寫(xiě)進(jìn)PFlash的組A地址處。
② 向MARKERL0寫(xiě)入0x00000055。
③ 向MARKERH0寫(xiě)入MARKERL0的系統(tǒng)地址。
④ 向CONFERMATIONL0寫(xiě)入0x57B5327F。
⑤ 向CONFERMATIONH0寫(xiě)入CONFERMATIONL0的系統(tǒng)地址。
⑥ 將UCB_OTP0中SWAPEN標(biāo)志位置為Enable。
⑦ 重啟MCU。
經(jīng)過(guò)上面的步驟,就事MCU進(jìn)入了SOTA模式,其中步驟②-⑤是為了啟用標(biāo)準(zhǔn)地址映射。手冊(cè)中給了如下的流程圖供參考:
上面說(shuō)的是第一次啟用SOTA時(shí)的配置,下面我們就來(lái)看一下SOTA啟用后,進(jìn)行APP更新的步驟:
① 將新的APP寫(xiě)入PFlash中未激活的部分,即上文提到的Inactive Bank,并進(jìn)行準(zhǔn)確性校驗(yàn)。
② 如果新的APP被寫(xiě)入組B,則向MARKERLx.SWAP寫(xiě)入0x000000AA,啟用Alternate地址映射模式;如果新的APP被寫(xiě)入組A,則向MARKERLx.SWAP寫(xiě)入0x00000055,啟用標(biāo)準(zhǔn)地址映射模式。(x是0-15的值,從0開(kāi)始向上遞增,由上文可知UCB_SWAP最多能存儲(chǔ)16組標(biāo)志值,存滿后再擦除重新寫(xiě)入。)
③ MARKERHx.ADDR、CONFIRMATIONLx.CODE和CONFIRMATIONHx.ADDR配置同上文。
④ 向CONFIRMATIONL(x-1).CODE再次寫(xiě)入0xFFFFFFFF,來(lái)使上一組UCB_SWAP值失效。向PFlash再次寫(xiě)入全1的值不會(huì)導(dǎo)致PFlash操作錯(cuò)誤。
手冊(cè)中給了下面這個(gè)流程圖供參考:
5.UCB
參考:TC3xx芯片的UCB詳解
UCB里面如果帶Password,即使UCB已經(jīng)Confirm了,還是可以通過(guò)輸入Password擦寫(xiě)UCB。如果是不帶Password的UCB,如果UCB配置成Confirm了,那這個(gè)UCB就無(wú)法改寫(xiě)了。
對(duì)于有些UCB是不可以被擦掉或者有ECC的Error,如果這個(gè)UCB被擦除或者含有ECC的Error,這個(gè)芯片可能就會(huì)被鎖死。
UCB_BMHD的BMI,BMHDID,STAD,CRCCBMHD,CRCBMHD_N這5個(gè)位域不能有Uncorrectable ECC Error,否則芯片就會(huì)鎖死。所以在不能在操作UCB_BMHD的時(shí)候突然掉電,或者沒(méi)有擦除已有的BMHD就去寫(xiě)B(tài)MHD。
UCB的Confirmation Code中UNLOCKED和CONFIRMED是合法的,ERASED和ERRORED狀態(tài)是Error狀態(tài)。所有的UCB在出場(chǎng)的時(shí)候都是處于UNLOCKED狀態(tài)的,在UNLOCKED狀態(tài)時(shí)所有的UCB內(nèi)容都是可以讀出來(lái)的,包括Password。UCB在CONFIRMED狀態(tài)時(shí),除了Password其他都是可以讀出來(lái)的。
UCB_BMHD主要是用來(lái)設(shè)置程序的啟動(dòng)地址的。UCB_BMHD_COPY主要起到一個(gè)備份的作用,比如在擦除UCB_BMHD_ORIN的時(shí)候突然掉電,導(dǎo)致UCB_BMHD_ORIN變成Error狀態(tài),這個(gè)時(shí)候就可以讀取UCB_BMHD_COPY的內(nèi)容。
BMHD0中Password是被BMHD1-3所共享的,也就是說(shuō)BMHD1-3被設(shè)為Confirmed后需要通過(guò)BMHD0的Password調(diào)用disable protection去解鎖其他BMHD1-3。
BMHD被寫(xiě)保護(hù)的條件有兩個(gè):
1.UCB_BMHDx的Confirmation狀態(tài)處于CONFIRMED狀態(tài),并且Disable Protection沒(méi)有被激活(通過(guò)加載UCB_BMHD0中的Password)。
2.UCB_BMHDx的confirmation狀態(tài)是ERRORED。
UCB_PFLASH主要用來(lái)設(shè)置PFLASH的讀寫(xiě)保護(hù)。PFLASH的讀保護(hù)是全局的(只有一個(gè)配置項(xiàng)),寫(xiě)保護(hù)是每個(gè)Sector都能進(jìn)行單獨(dú)設(shè)置的,如果PFLASH讀保護(hù)了,相當(dāng)于也是寫(xiě)保護(hù)了(不讓讀,肯定就不能寫(xiě)了)。
UCB_DFLASH主要用來(lái)配置DFLASH0的模式,Single Ended Sensing還是Complement Sensing。配置RAM是否在Power On Reset后是否進(jìn)行清零,以及選擇那幾塊RAM進(jìn)行清零。
UCB_SWAP主要用來(lái)配置SWAP模式的。
所有UCB的擦寫(xiě)是有次數(shù)限制的,這個(gè)擦寫(xiě)的限制是保證UCB中數(shù)據(jù)可以保存20年。在數(shù)據(jù)保存20年的前提下,對(duì)每一個(gè)UCB的擦寫(xiě)次數(shù)是100次,對(duì)所有UCB的擦寫(xiě)次數(shù)總共是500次。
審核編輯:劉清
評(píng)論