前言
AUTOSAR架構(gòu)圖下的Fls模塊對(duì)上(Fee)模塊提供統(tǒng)一的標(biāo)準(zhǔn)接口,但是具體的實(shí)現(xiàn)因不同的芯片而不一樣,Infineon公司的Fls模塊通過(guò)操作TC3xx芯片的DMU模塊實(shí)現(xiàn)Fls的功能。在具體介紹Fls模塊的功能之前,有必要先介紹下TC3xx芯片的DMU模塊。本文就來(lái)詳細(xì)介紹下TC37x芯片的DMU功能,希望能搞清楚以下問(wèn)題:
問(wèn)題1:站在軟件實(shí)現(xiàn)的角度來(lái)看,如何通過(guò)DMU實(shí)現(xiàn)讀,寫(xiě),擦除DFlash?
問(wèn)題2:站在軟件實(shí)現(xiàn)的角度來(lái)看,如何通過(guò)DMU監(jiān)控讀,寫(xiě),擦除DFlash等任務(wù)完成的?
問(wèn)題3:站在軟件實(shí)現(xiàn)的角度來(lái)看,如何通過(guò)DMU監(jiān)控讀,寫(xiě),擦除DFlash等任務(wù)出現(xiàn)Error的?
問(wèn)題4:站在軟件實(shí)現(xiàn)的角度來(lái)看,在監(jiān)控到讀,寫(xiě),擦除DFlash等任務(wù)出現(xiàn)Error后如何恢復(fù)重來(lái)?
Note: 作者對(duì)芯片的各種模塊的硬件接口或者功能實(shí)現(xiàn)也不是很理解(非電子信息專業(yè)出身,屬于半路出家的半吊子……),但是站在軟件開(kāi)發(fā)者的角度來(lái)看,個(gè)人理解,操作芯片模塊基本就是操作芯片模塊的控制寄存器來(lái)達(dá)到想要的功能,輪詢芯片的狀態(tài)寄存器判斷控制命令是否完成,監(jiān)控Error寄存器看是否發(fā)生錯(cuò)誤(發(fā)送錯(cuò)誤后一般通知上層后嘗試重置芯片模塊功能)。對(duì)于軟件開(kāi)發(fā)者,搞清楚上述四個(gè)問(wèn)題其實(shí)就是搞清楚在上述問(wèn)題的上下文中如何控制和監(jiān)控寄存器。

縮略詞
| 簡(jiǎn)寫(xiě) | 全稱 |
| DMU | Data Memory Unit |
| DPI | Direct Processor Interface (to Local Flash Bank) |
| FSI | Flash Standard Interface |
| SRI | Shared Resource Interconnect |
| SIF | Slave Interface |
正文
1.DMU硬件架構(gòu)
CPU通過(guò)SRI總線能夠訪問(wèn)/控制DMU,DMU通過(guò)FSI接口能夠控制DFLASH。CPU訪問(wèn)/控制DMU可以通過(guò)軟件(我們寫(xiě)代碼)實(shí)現(xiàn),DMU通過(guò)FSI訪問(wèn)/控制DFLASH是硬件實(shí)現(xiàn)(軟件不不參與,軟件發(fā)錯(cuò)命令序列后只能輪詢DMU的狀態(tài)寄存器來(lái)獲取DMU訪問(wèn)/操作DFLASH的結(jié)果)。

圖1:Non Volatile Memory (NVM) Subsystem

圖2:Block diagram of DMU module

圖3:Block Diagram of the NVM module
2.DMU寄存器
DMU模塊相關(guān)的寄存器很多,這里我們只要了解DMU相關(guān)的控制,狀態(tài),錯(cuò)誤狀態(tài)三個(gè)寄存器就能理解絕大部分的功能。

2.1 DMU狀態(tài)寄存器
HF_STATUS狀體寄存器,標(biāo)識(shí)當(dāng)前Flash的狀態(tài)。比如,標(biāo)識(shí)當(dāng)前Flash是否在Page Mode(擦寫(xiě)Flash時(shí)必須在這個(gè)模式下),F(xiàn)lash當(dāng)前是否Busy(Flash是否正在處理上一次的擦寫(xiě)任務(wù))。

D0BUSY: 標(biāo)識(shí)DFlash0是否處于Busy狀態(tài)。
D1BUSY:標(biāo)識(shí)DFlash1是否處于Busy狀態(tài)。

Fls在進(jìn)行硬件操作前,會(huì)檢查DFlash是否Busy,如果Busy的話就不進(jìn)行任何操作。

DFPAGE: 標(biāo)識(shí)DFlash是否處于Page Mode
DFPAGE: 標(biāo)識(shí)PFlash是否處于Page Mode

Fls在執(zhí)行Writesequence前都要先進(jìn)入到Page Mode


Note: 進(jìn)入Page Mode后,F(xiàn)lash模塊才能夠接收寫(xiě)入的數(shù)據(jù)
2.2 DMU控制寄存器
DMU控制寄存器HF_CONTROL并不是用來(lái)直接操作數(shù)據(jù)的寫(xiě)入和擦除(數(shù)據(jù)的寫(xiě)入和擦除由Command Sequence實(shí)現(xiàn),后面章節(jié)介紹),而是用來(lái)控制/使能一些Flash的全局功能(后面遇到了再展開(kāi)介紹)。




2.3 錯(cuò)誤狀態(tài)寄存器
HF_ERRSR錯(cuò)誤狀態(tài)寄存器標(biāo)識(shí)當(dāng)前Flash有沒(méi)有發(fā)生錯(cuò)誤。對(duì)每個(gè)錯(cuò)誤類型的具體解釋和檢測(cè)到錯(cuò)誤后建議的軟件操作請(qǐng)參考后面的錯(cuò)誤處理章節(jié)。




Fls模塊在執(zhí)行Flash寫(xiě)操作前也會(huì)先檢查Flash有沒(méi)有Error產(chǎn)生,如果有Error產(chǎn)生,則不進(jìn)行任何操作。

3.DMU命令序列
3.1 讀Flash
對(duì)Flash的讀訪問(wèn)是Memory mapped read,什么意思了?比如我們要讀0xAF001234這個(gè)起始地址處的一個(gè)uint32的數(shù)據(jù),我們可以直接操作內(nèi)存進(jìn)行讀:
uint32 Value = *((uint32 *)0xAF001234);

3.2 寫(xiě)Flash
但是對(duì)于Flash的寫(xiě)(Programming)和擦除(Erase)操作不能直接操作內(nèi)存,需要通過(guò)特定的命令序列(Command Sequence),比如以下的操作就是無(wú)效的。
*((uint32 *)0xAF001234) = 0xFFFF;
實(shí)際對(duì)DFlash的寫(xiě)操作需要一組命令序列(Command Sequences)來(lái)實(shí)現(xiàn)。DMU會(huì)把者一組命令序列翻譯過(guò)來(lái)去完成對(duì)DFlash的寫(xiě)操作。寫(xiě)的過(guò)程中的狀態(tài)和錯(cuò)誤通過(guò)HF_STATUS和HF_ERRSR寄存器標(biāo)識(shí)。DMU提供了一些Command Sequence供開(kāi)發(fā)者使用。


我們來(lái)分析一個(gè)Write Page的Command Sequence:
第一步:把PA(緩存要寫(xiě)入數(shù)據(jù)的變量的地址)加載到DFlash Base Address + 0xAA50處

第二步:把xx00H(xx標(biāo)識(shí)的部分被忽略)這個(gè)值加載到DFlash Base Address + 0xAA58處
第三步:把xxA0H(xx標(biāo)識(shí)的部分被忽略)這個(gè)值加載到DFlash Base Address + 0xAA58處
第四步:把xxAAH(xx標(biāo)識(shí)的部分被忽略)這個(gè)值加載到DFlash Base Address + 0xAA58處
執(zhí)行Write Page需要注意:
1.Write Page命令序列需要在Load Page命令序列之后執(zhí)行
2.執(zhí)行完Write Page命令序列后,PageMode的標(biāo)志就會(huì)在HF_STATUS狀態(tài)寄存器中被設(shè)置
3.如果Flash不在PageMode下執(zhí)行Write Page操作,那么HF_ERRSR錯(cuò)誤狀態(tài)寄存器的Sequence Error(SQER)標(biāo)志就會(huì)被置位,如果PA地址值不在合肥的地址范圍內(nèi),SQER標(biāo)志也會(huì)被置位。
4.如果進(jìn)入Page Mode后數(shù)據(jù)太少,則沒(méi)有數(shù)據(jù)或太多數(shù)據(jù)通過(guò)“LoadPage”傳輸?shù)匠绦蚣彌_區(qū),“WrtePage”會(huì)對(duì)頁(yè)面進(jìn)行編程,但會(huì)設(shè)置序列錯(cuò)誤 (SQER)。 缺少的數(shù)據(jù)是使用程序集緩沖區(qū)的先前內(nèi)容進(jìn)行編程的
5.當(dāng)頁(yè)面“ PA ”位于具有有效寫(xiě)入保護(hù)的Sector中,或者Flash模塊具有有效的全局讀取保護(hù)時(shí),Write Page就會(huì)執(zhí)行失敗并設(shè)置保錯(cuò)誤 Protection Error(PROER)。
6.當(dāng)寫(xiě)入(Programming)過(guò)程中出現(xiàn)錯(cuò)誤,PVER錯(cuò)誤標(biāo)志就會(huì)被設(shè)置
7.如果DMU處于Cranking Mode或者Error Mode,執(zhí)行Write Page命令序列就會(huì)產(chǎn)生Sequence Error(SQER).


Write Page在代碼中的體現(xiàn):

Note:
1.不要問(wèn)為什么是這樣來(lái)實(shí)現(xiàn)對(duì)DFlash的操作,這是人家芯片廠商規(guī)定的,我們照著做就行。
2.命令序列很多,遇到了想了解的話,就按照Write Page這個(gè)分析過(guò)程去分析就行
4.DMU錯(cuò)誤處理
Infineon的芯片手冊(cè)中對(duì)每一種Error產(chǎn)生原因和出現(xiàn)Error后建議的操作都寫(xiě)的非常詳細(xì),我們能找到地方并理解就好,這里僅介紹Sequence Error(SQER),其他自己去查手冊(cè)就好。
Sequence Error(SQER)產(chǎn)生的原因:
1.Comman的地址或者數(shù)據(jù)不正確,也就是沒(méi)有按照規(guī)定的CommandSequence來(lái)操作Flash
2.DMU處于Page Mode時(shí)又嘗試進(jìn)入Page Mode
3.Load Page命令序列不在Page Mode下執(zhí)行
4.Load Page命令序列混合32/64操作
……太多了,參考<< AURIXTC3XX_um_part1_v2.0.pdf>>以下章節(jié)

出現(xiàn)問(wèn)題后怎么處理:
SQER錯(cuò)誤通常就是軟件Bug導(dǎo)致的,所有我們把軟件寫(xiě)好,這些問(wèn)題就不會(huì)出現(xiàn)。如果出現(xiàn)了這些Error,應(yīng)該把Error信息通知到應(yīng)用代碼。但是,可以使用“Clear Status”或“Resetto Read”命令序列清除此標(biāo)志,然后可以再次發(fā)出更正后的命令序列。

5.DMU中斷和Trap
5.1中斷
DMU在以下截圖的事件觸發(fā)時(shí)可以觸發(fā)中斷,中斷使能和中斷處理函數(shù)需要我們?nèi)ヅ渲煤蛯?shí)現(xiàn),然后可以通過(guò)中斷來(lái)判斷事件完成或錯(cuò)誤發(fā)生。但是,對(duì)Flash操作的狀態(tài)獲取和錯(cuò)誤獲取一般采用輪詢的方式實(shí)現(xiàn)。

5.2Trap
同樣,DMU外設(shè)報(bào)告以下的Fatal Errors會(huì)觸發(fā)CPU進(jìn)入Trap。

Note: 這些了解就好,好像在實(shí)際工程中沒(méi)有使用DMU中斷,也沒(méi)去管DMUTrap,回頭再仔細(xì)研究下。
6.總結(jié)
這篇文章的所有內(nèi)容都可以在Infineon的數(shù)據(jù)手冊(cè)中找到,但是對(duì)于初學(xué)者或者對(duì)硬件手冊(cè)不熟悉的朋友不容易抓到重點(diǎn)(動(dòng)不動(dòng)一個(gè)章節(jié)就是幾十上百頁(yè)的英文,確實(shí)看著就頭疼…),所以作者結(jié)合代碼梳理出個(gè)人認(rèn)為對(duì)于軟件開(kāi)發(fā)者最為重要的內(nèi)容,希望各位對(duì)各位看官有所幫助,也希望對(duì)各位新人苦于看數(shù)據(jù)手冊(cè)有所啟發(fā)。
最后,咱們來(lái)來(lái)回答開(kāi)頭提出的問(wèn)題結(jié)束本文。
問(wèn)題1:站在軟件實(shí)現(xiàn)的角度來(lái)看,如何通過(guò)DMU實(shí)現(xiàn)讀,寫(xiě),擦除DFlash?
答:通過(guò)Load Page和Write Page命令序列實(shí)現(xiàn)寫(xiě)操作;通過(guò)Erase Logical Sector Range命令序列實(shí)現(xiàn)擦除操作;通過(guò)Memory mapped read直接讀Flash。
問(wèn)題2:站在軟件實(shí)現(xiàn)的角度來(lái)看,如何通過(guò)DMU監(jiān)控讀,寫(xiě),擦除DFlash等任務(wù)完成的?
答:通過(guò)監(jiān)控HF_STATUS的D0BUSY/D1BUS標(biāo)志來(lái)監(jiān)控擦寫(xiě)操作,讀不用監(jiān)控,直接讀取就行。
問(wèn)題3:站在軟件實(shí)現(xiàn)的角度來(lái)看,如何通過(guò)DMU監(jiān)控讀,寫(xiě),擦除DFlash等任務(wù)出現(xiàn)Error
的?
答:通過(guò)監(jiān)控HF_ERRSR錯(cuò)誤狀態(tài)寄存器的錯(cuò)誤標(biāo)志來(lái)監(jiān)控讀,寫(xiě),擦除DFlash等任務(wù)出現(xiàn)Error
類型。
問(wèn)題4:站在軟件實(shí)現(xiàn)的角度來(lái)看,在監(jiān)控到讀,寫(xiě),擦除DFlash等任務(wù)出現(xiàn)Error后如何恢復(fù)重來(lái)?
答:太多,這里就不在細(xì)講,具體參考數(shù)據(jù)手冊(cè)的Error Handing章節(jié)。
審核編輯:湯梓紅
-
芯片
+關(guān)注
關(guān)注
463文章
54010瀏覽量
466044 -
寄存器
+關(guān)注
關(guān)注
31文章
5608瀏覽量
129980 -
接口
+關(guān)注
關(guān)注
33文章
9520瀏覽量
157027 -
AUTOSAR
+關(guān)注
關(guān)注
10文章
398瀏覽量
23651
原文標(biāo)題:TC3xx芯片DMU介紹
文章出處:【微信號(hào):汽車電子嵌入式,微信公眾號(hào):汽車電子嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
英飛凌TC3XX系列多核MCU學(xué)習(xí)筆記(1)
TC3xx芯片時(shí)鐘系統(tǒng)的鎖相環(huán)PLL詳解
TC3XX寄存器讀寫(xiě)時(shí)間過(guò)長(zhǎng)怎么解決?
TC3xx系列怎么禁用trap?
TC3xx系列是否支持RTC功能?
TC3xx的HSM中有沒(méi)有單調(diào)計(jì)數(shù)器?
請(qǐng)問(wèn)tc3xx如何配置多個(gè)dedicatedRxBuffersNumber?
兩片TC3XX芯片之間的時(shí)鐘同步可以實(shí)現(xiàn)嗎?
AUTOSAR MCAL-基于Infineon TC3xx芯片的ADC模塊
AURIX? TC3xx NVM是非易失性存儲(chǔ)器學(xué)習(xí)筆記
TC3xx芯片的MPU功能詳解
TC3xx芯片DMU介紹
評(píng)論