長(zhǎng)文分享丨TI AM5718的PRU開(kāi)發(fā)詳解

原創(chuàng) 2020-03-07 13:27:00 PRU PRU開(kāi)發(fā)板 PRU ICSS

PRUSS簡(jiǎn)介

TI AM5718 系列 OK5718開(kāi)發(fā)板 有兩個(gè)PRU-ICSS(ProgrammableReal-Time Unit Subsystem and Industrial CommunicationSubsystem),可以獨(dú)立編程實(shí)現(xiàn)一些實(shí)時(shí)性要求高的個(gè)性化需求,實(shí)現(xiàn)產(chǎn)品的差異化。


本文介紹PRU處理器架構(gòu),開(kāi)發(fā),調(diào)試方法。在系統(tǒng)架構(gòu)上,PRUSS是連接L3_MAIN內(nèi)部總線上的一個(gè)模塊,與系統(tǒng)中其它主模塊如ARM,DSP一樣,可以訪問(wèn)芯片上的其它外設(shè)。


 

PRUSS包括兩個(gè)PRU,通過(guò)自己的32-bitinterconnect總線與子系統(tǒng)的中斷控制器、指令內(nèi)存、數(shù)據(jù)內(nèi)存、共享內(nèi)存、外設(shè)模塊相連。

PRU不是一個(gè)加速器,它是32-bitLoad/Store RISC架構(gòu)小端處理器,每個(gè)PRU有32個(gè)通用寄存器R0~R31,12Kbyte指令RAM,8Kbyte數(shù)據(jù)RAM和32byte共享RAM。指令RAM是獨(dú)立的,互相之間不能訪問(wèn),但數(shù)據(jù)RAM可以通過(guò)映射地址互相訪問(wèn);專用的21個(gè)輸入引腳和21個(gè)輸出引腳。

設(shè)備中的pru-icss1和pru-icss2集成功能:

?PD_L4PER power domain instantiation
? two master ports (PRU0and PRU1 core initiators) on the device L3_MAIN interconnect
?Non-wakeup capable - smart Standby protocol with the device PRCM
?Software assertion of a standby request "MStandby" (formaster port clock disable) with local (PRUICSS) monitoring of thePRCM "MWait" acknowledge.
? one slave(configuration) port on the L3_MAIN interconnect for device hosts(MPU, DSP1, etc.) to
access various memories and registers ofPRU-ICSS
? Non-wakeup capable - smart Idle protocol with thedevice PRCM
? 10 output interrupt events from local interruptcontroller - PRUSS_INTC:

– 2events to each PRU core (events 0 and 1)
– 8 events mapped tothe device IRQ_CROSSBAR which further remaps them to deviceinterrupt
controllers (events 2 through 9)
– 2 eventsmapped to the device DMA_CROSSBAR, that remaps them to device DMAcontrollers
(events 8 and 9)
? 32 external interrupts aremapped via the device IRQ_CROSSBAR to the local PRUSS_INTC
? Alocal software gating of clocks to several modules within PRUsubsystem (local clock management
protocol), as follows:
–PRUSS_IEP
– PRUSS_eCAP_0
– PRUSS_UART0
–PRUSS_INTC
– PRUSS_PRU0
– PRUSS_PRU1
? 3 inputclocks obtained from device PRCM:
– a PRU-ICSS top levelgatable interface clock
– a PRUSS IEP functional clock
–a PRUSS UART0
? No memory/register retention is supported
?One hardware non-retention (level sensitive) reset

wps3.png

 

PART 01 ▼ PRU內(nèi)存映射

 1.1 指令空間 

每個(gè)PRU獨(dú)立的指令空間為0x00000000~0x00002FFF。指令空間由外部主處理ARM/DSP初始化,程序指針PC是32bit字地址,不是字節(jié)地址,如PC=2,代表指令地址0x08。

▲PRU指令空間映射表

 1.2 數(shù)據(jù)空間 

每個(gè)PRU獨(dú)立的8Kbyte數(shù)據(jù)RAM空間為0x0000~0x01FF,因?yàn)閿?shù)據(jù)RAM連接在PRU子系統(tǒng)的內(nèi)部總線上,所以子系統(tǒng)中的其它主模塊也可以訪問(wèn)到這塊空間,這段內(nèi)存空間在另一個(gè)PRU上的映射地址為0x2000~0x21FF。位于數(shù)據(jù)空間的還有共用的中斷控制器寄存器;PRU控制/狀態(tài)寄存器等,有各自的地址空間。


▲PRUSS本地?cái)?shù)據(jù)空間內(nèi)存映射表 

 1.3 全局地址空間映射 

PRU_ICSS1局部地址在系統(tǒng)全局地址空間基地址(L3_MAINbase address)為0x4B2A0000,PRU_ICSS2局部地址在系統(tǒng)全局地址空間基地址(L3_MAINbase address)為0x4B28E000。表3表示PRU_ICSS局部地址空間的偏移量(OffsetAddress)。
 

▲PRUSS全局空間內(nèi)存映射表


PRU可以通過(guò)表2的局部地址,也可以通過(guò)全局地址訪問(wèn)PRUSS的數(shù)據(jù)空間,通過(guò)全局地址空間訪問(wèn)要經(jīng)過(guò)系統(tǒng)L3_MAINdevice,比通過(guò)局部地址空間訪問(wèn)要慢。

PRUSS外部主模塊如ARM,DSP等可通過(guò)系統(tǒng)全局地址空間映射端口+全局地址空間訪問(wèn)(表3的OffsetAddress + L3_MAIN base address)PRU資源。詳情參考《AM571xTechnical Reference Manual》中30.4.4.2PRU-ICSS Global Memory Map章節(jié)內(nèi)容。

PART 02 ▼ 控制/狀態(tài)寄存器

PRU0的控制/狀態(tài)寄存器地址位于0x00020000~0x0002_3FFF,PRU1的控制/狀態(tài)寄存器地址位于0x0002_4000~0x0002_5FFF,寄存器列表如表4所示,各寄存器的詳細(xì)說(shuō)明請(qǐng)參閱[1]。


wps9.jpg

 

 

▲PRU控制/狀態(tài)寄存器表

 

 2.1 PRU_CONTROL控制寄存器 

外部主模塊ARM/DSP通過(guò)控制寄存器可以控制PRU的運(yùn)行狀態(tài)。


▲表5 PRU控制寄存器說(shuō)明表 

 2.2 PRU_STATUS狀態(tài)寄存器 

狀態(tài)寄存即PRU的程序指針寄存器,與程序的真正運(yùn)行狀態(tài)有一個(gè)周期的延時(shí)。

 2.3 PRU_WAKEUP_EN喚醒使能寄存器 

在程序執(zhí)行SLP指令進(jìn)入睡眠狀態(tài)之前,使能WAKEUP寄存器相應(yīng)的位,當(dāng)輸入狀態(tài)寄存器R31相應(yīng)的位置1時(shí),即WAKEUP&R31!=0時(shí),喚醒PRU。

 2.4 PRU_CYCLE周期計(jì)數(shù)器 

當(dāng)CONTROL[ENABLE]=1和CONTROL[COUNTENABLE]=1時(shí),CYCLECNT以PRU時(shí)鐘周期計(jì)數(shù)。當(dāng)CONTROL[ENABLE]=0或CONTROL[COUNTENABLE]=0時(shí),計(jì)數(shù)停止。當(dāng)重新使能時(shí),恢復(fù)繼續(xù)計(jì)數(shù)。

 2.5 STALLCNT取指停止計(jì)數(shù)器 

當(dāng)CONTROL[ENABLE]=1和CONTROL[COUNTENABLE]=1,且由于某種原因PRU不能取指令時(shí),STALLCNT開(kāi)始以PRU時(shí)鐘周期計(jì)數(shù)。其值總是小于,或等于CYCLECNT的值。

 2.6 PRUSS_DBG_GPREG 0~31調(diào)試通用寄存器 

PRUSS_DBG_GPREG0~31與通用寄存器R0~R31對(duì)應(yīng),為外部主模塊提供一個(gè)調(diào)試窗口。當(dāng)PRU停止時(shí),ARM/DSP讀/寫INTGPR0~31直接讀/寫寄存器R0~R31。

 

PART 03 ▼ PRU通用寄存器 

 3.1 PRU事件/狀態(tài)寄存器R31 

R31是一個(gè)特殊的寄存器,讀與寫操作時(shí)的功能是不一樣的。寫R31寄存器時(shí),寫一個(gè)0到15之間的通道號(hào)到R31_PRU_VEC[3:0],同時(shí)設(shè)置R31_PRU_VEC_VALID,將產(chǎn)生相應(yīng)的中斷輸出事件到中斷控制器的系統(tǒng)事件。兩個(gè)PRU輸出的斷事件相“或”輸出到同一個(gè)中斷控制器系統(tǒng)事件。


 

讀R31寄存器時(shí),R31[29:0]反映PRU的輸入管腳PRU_R30[29:0]的狀態(tài)。R31[31:30]是映射到中斷控制器的INTR_IN[0]和INTR_IN[1]的狀態(tài)。

 3.2 通用輸出寄存器R30 

每個(gè)PRU有32個(gè)獨(dú)立的輸出管腳PRU0_R31[31:0]和PRU1_R31[31:0],寫到寄存器R30[31:0]的值直接輸出到PRUn_R31[31:0]管腳。

 

PART 04▼PRU中斷控制器

PRU中斷控制器支持64個(gè)系統(tǒng)事件,10個(gè)中斷通道,10個(gè)主機(jī)中斷。


▲圖2 PRU中斷控制器框圖


PRU-ICSS1_INTC/PRUSS2_INTC的中斷0~31對(duì)應(yīng)著PRU-ICSS集成模塊產(chǎn)生的事件。系統(tǒng)事件16~31由寫R31產(chǎn)生。


PRU_ICSS系統(tǒng)事件32~55(中斷輸入),可以通過(guò)系統(tǒng)配置寄存器PRUSS_MII_RT[0]選擇標(biāo)準(zhǔn)的或者M(jìn)II_RT系統(tǒng)事件,PRUSSEVTSEL=0時(shí)選擇PRU-ICSS專用IRQ_CROSSBAR輸出的事件作為中斷源,PRUSSEVTSEL=1時(shí)選擇MII_RT模塊產(chǎn)生的事件作為中斷源。如下圖所示:


 

10個(gè)通道可以由任意64個(gè)系統(tǒng)事件映射,可以多個(gè)系統(tǒng)事件映射到一個(gè)通道,但不要將一個(gè)系統(tǒng)事件映射到多個(gè)通道。

設(shè)置PRUSS_INTC_CMR實(shí)現(xiàn)通道和64個(gè)系統(tǒng)事件的映射,PRUSS_INTC_CMRi(i為0~15)寄存器用于實(shí)現(xiàn)i*4到i*4+k號(hào)系統(tǒng)事件映射到相應(yīng)的通道。通過(guò)寄存器相應(yīng)位設(shè)置的通道號(hào)映射到相應(yīng)的系統(tǒng)事件。

10個(gè)主機(jī)中斷與10個(gè)通道之間可以任意映射,可以多個(gè)通道映射到一個(gè)主機(jī)中斷,但不要將一個(gè)通道映射到多個(gè)主機(jī)中斷,推薦按x號(hào)通道映射到x號(hào)主機(jī)中斷方式映射。

PRUSS_INTC_HMR寄存器主機(jī)中斷和通道的映射。PRUSS_INTC_HMRi(i為0~3)寄存器用于實(shí)現(xiàn)0-9號(hào)通道映射到0-9號(hào)主機(jī)中斷。通過(guò)寄存器相應(yīng)位設(shè)置主機(jī)中斷號(hào),將住中斷號(hào)與通道號(hào)建立映射。

主機(jī)中斷0輸出到R31.b30,主機(jī)中斷1輸出到R31.b31。主機(jī)中斷2~9接輸出PRUSS到ARM和DSP的中斷控制器的系統(tǒng)事件PRUSS_EVTOUT0~7。PRU不支持中斷向量表,產(chǎn)生的0,1主機(jī)中斷可用來(lái)喚醒PRU,或?yàn)镻RU軟件提供狀態(tài)查詢。PRU中斷控制器寄存器說(shuō)明請(qǐng)參考文獻(xiàn)[2]。

看點(diǎn)05▼PRU代碼包

飛凌嵌入式 AM571x 系列 OK5718開(kāi)發(fā)板 用戶資料中提供了大量的實(shí)例源碼,目錄結(jié)構(gòu)如圖3所示。


 

關(guān)于例程的編譯和測(cè)試,詳見(jiàn)《OK5718-C_軟件手冊(cè)_》7.4Ti 官方例程編譯及測(cè)試和7.5飛凌例程編譯及測(cè)試。

 

PART06▼PRU軟件調(diào)試

 6.1 調(diào)試工具 

調(diào)試工具我們使用TI官方推出的仿真器XDS100V2 ,XDS100V2是一款USBJTAG仿真器。

 6.2 硬件連接 

步驟一:

將XDS100V2仿真器相關(guān)引腳通過(guò)飛凌調(diào)試轉(zhuǎn)接板與0K5718-C開(kāi)發(fā)板 的JTAG

接口使用排線進(jìn)行連接。連接方式如下:


 

步驟二:

使用USB數(shù)據(jù)連接線連接X(jué)DS100V2到PC機(jī)USB接口。

 6.3 軟件調(diào)試 

本實(shí)例使用飛凌pru測(cè)試程序PRU_LED0做仿真調(diào)試,將項(xiàng)目導(dǎo)入到ccs后,右擊PRU_LED0,選擇Properties。


 

選擇使用仿真器和編譯器版本,設(shè)置完成后點(diǎn)擊ok。


 

右擊PRU_LED0,選擇DebugConfigurations。


 

選擇PRU_LED0,去掉相應(yīng)的勾選之后如下圖。點(diǎn)擊Apply,最后點(diǎn)Debug。


 

點(diǎn)擊run菜單,選擇debug。


 

以下方式也可以進(jìn)入debug。


 

如果編譯通過(guò)的話,會(huì)是這個(gè)樣子。


 

進(jìn)入仿真后光標(biāo)會(huì)停在主函數(shù)開(kāi)始處。


 

下面對(duì)上圖的按鈕做一下說(shuō)明 

按鈕1,運(yùn)行按鈕,全速運(yùn)行。如果為灰色,說(shuō)明一直在執(zhí)行代碼,也可能是死循環(huán),點(diǎn)暫停鍵看看。

按鈕2,暫停運(yùn)行。

按鈕3,退出仿真。

按鈕4,單步運(yùn)行,遇到子函數(shù)進(jìn)入子函數(shù)。

按鈕5,單步運(yùn)行,遇到函數(shù)會(huì)當(dāng)成語(yǔ)句,直接一步過(guò),不進(jìn)入函數(shù)內(nèi)部。

按鈕6,單步運(yùn)行,如果程序在子函數(shù)中運(yùn)行,點(diǎn)擊此按鈕,跳出子函數(shù)。

按鈕7,匯編單步,遇到子函數(shù),進(jìn)入子函數(shù)。

按鈕8,匯編單步運(yùn)行,遇到函數(shù)會(huì)當(dāng)成語(yǔ)句,直接一步過(guò),不進(jìn)入函數(shù)內(nèi)部。

在軟件調(diào)試過(guò)程中,進(jìn)行如下操作可以查看變量,寄存器值。

點(diǎn)擊view菜單,選擇Expressions項(xiàng)。


 

出現(xiàn)以下界面


 

▼ 選中要觀察的變量名,右擊選中AddWatch Expression 項(xiàng)。


 

點(diǎn)擊ok。


 

Expressions 窗口中加入變量gpio的值。


 

點(diǎn)擊Addnew expression  輸入R30,在Expressions窗口中顯示R30值。


 

當(dāng)進(jìn)入調(diào)試界面后,當(dāng)要程序運(yùn)行到某一行時(shí),右擊某一行,點(diǎn)擊runto line 。則運(yùn)行到此行,右擊57行。


 

運(yùn)行到57行g(shù)pio值發(fā)生變化,轉(zhuǎn)化為16進(jìn)制為0xffffffff。


 

右擊60行,選擇runto line,R30值發(fā)生變化。


 

----  END   ----


 長(zhǎng)按識(shí)別二維碼加關(guān)注 

飛凌嵌入式

專注于智能設(shè)備核心平臺(tái)研發(fā)與制造


■ 關(guān)注“飛凌嵌入式”公眾號(hào),不定期分享行業(yè)干貨及產(chǎn)品一線資料。

■ 直接微信回復(fù)產(chǎn)品平臺(tái),如“LS1043A”,即可快速獲取對(duì)應(yīng)產(chǎn)品信息。

■ 想要了解飛凌更多信息,歡迎與我們聯(lián)系:

銷售工程師:400-699-6866

國(guó)際業(yè)務(wù)部:0312-3102650-854

技術(shù)服務(wù)部:0312-3119192

方案定制類:17713286015 (杜工),18633238067(王工) 

■ 實(shí)時(shí)技術(shù)支持:

AM 9:00—11:30,PM 13:30—17:00(周一至周五)

 

相關(guān)產(chǎn)品 >

  • OK5718-C2開(kāi)發(fā)板

    CortexA15、M4、DSP多核異構(gòu)|飛凌AM5718開(kāi)發(fā)板基于ARM+DSP雙核架構(gòu) ARM Cortex-A15 AM5718+DSP C66x芯片設(shè)計(jì)開(kāi)發(fā),ARM Cortex-A15 AM5718+DSP C66x 二合為一開(kāi)發(fā)平臺(tái)。 AM5718作為多核異構(gòu)開(kāi)發(fā)板提供 CortexA15、M4、DSP、PRU多核協(xié)同工作,效率更高。 飛凌AM5718開(kāi)發(fā)板針對(duì)當(dāng)前應(yīng)用的復(fù)雜性,為更好滿足應(yīng)用和媒體的需求,集成眾多資源接口,用ARM進(jìn)行多樣化的應(yīng)用操作,DSP進(jìn)行算法加速,加上其強(qiáng)大的處理能力,滿足不同工作需求,靈活性更高。由于ARM+DSP 的雙核架構(gòu)嵌入式板塊的復(fù)雜行,飛凌提供了一些列資料,如ARM工程師如何使用 DSP 的資源? ARM與DSP如何協(xié)同工作? 了解詳情
    OK5718-C2開(kāi)發(fā)板
  • OKT507-C 開(kāi)發(fā)板

    CPU: T507 工業(yè)級(jí)處理器,超低功耗,10年+生命周期|推薦全志工業(yè)級(jí)T507開(kāi)發(fā)板系列,飛凌OKT507-C開(kāi)發(fā)板采用全志T507 四核工業(yè)級(jí)處理器 T507設(shè)計(jì)開(kāi)發(fā),Cortex-A53架構(gòu),工業(yè)級(jí)寬溫,性能強(qiáng),低功耗,是一款高性價(jià)比的工業(yè)級(jí)產(chǎn)品,提供豐富的開(kāi)發(fā)設(shè)計(jì)資料,提供產(chǎn)品規(guī)格書(shū),軟硬件手冊(cè)等,全志的T507適用于車載電子、電力、醫(yī)療、工業(yè)控制、物聯(lián)網(wǎng)、智能終端等領(lǐng)域。

    了解詳情
    OKT507-C 開(kāi)發(fā)板
  • OKMX8MP-C開(kāi)發(fā)板

    內(nèi)置NPU、ISP,AI計(jì)算能力高達(dá)2.3TOPS|飛凌嵌入式i.MX8MP 系列-NXP iMX8M Plus 開(kāi)發(fā)板 基于高性能低功耗工業(yè)級(jí)iMX8MP核心板設(shè)計(jì),支持多種多種高速通信接口。iMX8MP開(kāi)發(fā)板內(nèi)置NPU,AI計(jì)算能力2.3TOPS,支持4K,支持雙圖像信號(hào)處理器(ISP),是一款支持LinuxQT/android操作系統(tǒng)的iMX8MP開(kāi)發(fā)板。

    了解詳情
    OKMX8MP-C開(kāi)發(fā)板
  • OK3568-C開(kāi)發(fā)板

    強(qiáng)而穩(wěn),國(guó)產(chǎn)芯,1Tops算力,多路高速接口|飛凌RK3568系列RK3568開(kāi)發(fā)板基于國(guó)產(chǎn)工業(yè)級(jí)AI處理器RK3568四核64位Cortex-A55 處理器設(shè)計(jì)。RK3568作為國(guó)產(chǎn)化高性能處理器,瑞芯微RK3568芯片是一款定位中高端的通用型SoC,瑞芯微RK3568芯片是一款定位中高端的通用型SoC,NPU達(dá)到1Tops,飛凌RK3568系列核心板提供瑞芯微RK3568規(guī)格書(shū)_datasheet_數(shù)據(jù)手冊(cè)_原理圖等,


    了解詳情
    OK3568-C開(kāi)發(fā)板

推薦閱讀 換一批 換一批