長文分享丨TI AM5718的PRU開發詳解

原創 2020-03-07 13:27:00 PRU PRU開發板 PRU ICSS

PRUSS簡介

TI AM5718 系列 OK5718開發板 有兩個PRU-ICSS(ProgrammableReal-Time Unit Subsystem and Industrial CommunicationSubsystem),可以獨立編程實現一些實時性要求高的個性化需求,實現產品的差異化。


本文介紹PRU處理器架構,開發,調試方法。在系統架構上,PRUSS是連接L3_MAIN內部總線上的一個模塊,與系統中其它主模塊如ARM,DSP一樣,可以訪問芯片上的其它外設。


 

PRUSS包括兩個PRU,通過自己的32-bitinterconnect總線與子系統的中斷控制器、指令內存、數據內存、共享內存、外設模塊相連。

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

設備中的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內存映射

 1.1 指令空間 

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

▲PRU指令空間映射表

 1.2 數據空間 

每個PRU獨立的8Kbyte數據RAM空間為0x0000~0x01FF,因為數據RAM連接在PRU子系統的內部總線上,所以子系統中的其它主模塊也可以訪問到這塊空間,這段內存空間在另一個PRU上的映射地址為0x2000~0x21FF。位于數據空間的還有共用的中斷控制器寄存器;PRU控制/狀態寄存器等,有各自的地址空間。


▲PRUSS本地數據空間內存映射表 

 1.3 全局地址空間映射 

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

▲PRUSS全局空間內存映射表


PRU可以通過表2的局部地址,也可以通過全局地址訪問PRUSS的數據空間,通過全局地址空間訪問要經過系統L3_MAINdevice,比通過局部地址空間訪問要慢。

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

PART 02 ▼ 控制/狀態寄存器

PRU0的控制/狀態寄存器地址位于0x00020000~0x0002_3FFF,PRU1的控制/狀態寄存器地址位于0x0002_4000~0x0002_5FFF,寄存器列表如表4所示,各寄存器的詳細說明請參閱[1]。


wps9.jpg

 

 

▲PRU控制/狀態寄存器表

 

 2.1 PRU_CONTROL控制寄存器 

外部主模塊ARM/DSP通過控制寄存器可以控制PRU的運行狀態。


▲表5 PRU控制寄存器說明表 

 2.2 PRU_STATUS狀態寄存器 

狀態寄存即PRU的程序指針寄存器,與程序的真正運行狀態有一個周期的延時。

 2.3 PRU_WAKEUP_EN喚醒使能寄存器 

在程序執行SLP指令進入睡眠狀態之前,使能WAKEUP寄存器相應的位,當輸入狀態寄存器R31相應的位置1時,即WAKEUP&R31!=0時,喚醒PRU。

 2.4 PRU_CYCLE周期計數器 

當CONTROL[ENABLE]=1和CONTROL[COUNTENABLE]=1時,CYCLECNT以PRU時鐘周期計數。當CONTROL[ENABLE]=0或CONTROL[COUNTENABLE]=0時,計數停止。當重新使能時,恢復繼續計數。

 2.5 STALLCNT取指停止計數器 

當CONTROL[ENABLE]=1和CONTROL[COUNTENABLE]=1,且由于某種原因PRU不能取指令時,STALLCNT開始以PRU時鐘周期計數。其值總是小于,或等于CYCLECNT的值。

 2.6 PRUSS_DBG_GPREG 0~31調試通用寄存器 

PRUSS_DBG_GPREG0~31與通用寄存器R0~R31對應,為外部主模塊提供一個調試窗口。當PRU停止時,ARM/DSP讀/寫INTGPR0~31直接讀/寫寄存器R0~R31。

 

PART 03 ▼ PRU通用寄存器 

 3.1 PRU事件/狀態寄存器R31 

R31是一個特殊的寄存器,讀與寫操作時的功能是不一樣的。寫R31寄存器時,寫一個0到15之間的通道號到R31_PRU_VEC[3:0],同時設置R31_PRU_VEC_VALID,將產生相應的中斷輸出事件到中斷控制器的系統事件。兩個PRU輸出的斷事件相“或”輸出到同一個中斷控制器系統事件。


 

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

 3.2 通用輸出寄存器R30 

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

 

PART 04▼PRU中斷控制器

PRU中斷控制器支持64個系統事件,10個中斷通道,10個主機中斷。


▲圖2 PRU中斷控制器框圖


PRU-ICSS1_INTC/PRUSS2_INTC的中斷0~31對應著PRU-ICSS集成模塊產生的事件。系統事件16~31由寫R31產生。


PRU_ICSS系統事件32~55(中斷輸入),可以通過系統配置寄存器PRUSS_MII_RT[0]選擇標準的或者MII_RT系統事件,PRUSSEVTSEL=0時選擇PRU-ICSS專用IRQ_CROSSBAR輸出的事件作為中斷源,PRUSSEVTSEL=1時選擇MII_RT模塊產生的事件作為中斷源。如下圖所示:


 

10個通道可以由任意64個系統事件映射,可以多個系統事件映射到一個通道,但不要將一個系統事件映射到多個通道。

設置PRUSS_INTC_CMR實現通道和64個系統事件的映射,PRUSS_INTC_CMRi(i為0~15)寄存器用于實現i*4到i*4+k號系統事件映射到相應的通道。通過寄存器相應位設置的通道號映射到相應的系統事件。

10個主機中斷與10個通道之間可以任意映射,可以多個通道映射到一個主機中斷,但不要將一個通道映射到多個主機中斷,推薦按x號通道映射到x號主機中斷方式映射。

PRUSS_INTC_HMR寄存器主機中斷和通道的映射。PRUSS_INTC_HMRi(i為0~3)寄存器用于實現0-9號通道映射到0-9號主機中斷。通過寄存器相應位設置主機中斷號,將住中斷號與通道號建立映射。

主機中斷0輸出到R31.b30,主機中斷1輸出到R31.b31。主機中斷2~9接輸出PRUSS到ARM和DSP的中斷控制器的系統事件PRUSS_EVTOUT0~7。PRU不支持中斷向量表,產生的0,1主機中斷可用來喚醒PRU,或為PRU軟件提供狀態查詢。PRU中斷控制器寄存器說明請參考文獻[2]。

看點05▼PRU代碼包

飛凌嵌入式 AM571x 系列 OK5718開發板 用戶資料中提供了大量的實例源碼,目錄結構如圖3所示。


 

關于例程的編譯和測試,詳見《OK5718-C_軟件手冊_》7.4Ti 官方例程編譯及測試和7.5飛凌例程編譯及測試。

 

PART06▼PRU軟件調試

 6.1 調試工具 

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

 6.2 硬件連接 

步驟一:

將XDS100V2仿真器相關引腳通過飛凌調試轉接板與0K5718-C開發板 的JTAG

接口使用排線進行連接。連接方式如下:


 

步驟二:

使用USB數據連接線連接XDS100V2到PC機USB接口。

 6.3 軟件調試 

本實例使用飛凌pru測試程序PRU_LED0做仿真調試,將項目導入到ccs后,右擊PRU_LED0,選擇Properties。


 

選擇使用仿真器和編譯器版本,設置完成后點擊ok。


 

右擊PRU_LED0,選擇DebugConfigurations。


 

選擇PRU_LED0,去掉相應的勾選之后如下圖。點擊Apply,最后點Debug。


 

點擊run菜單,選擇debug。


 

以下方式也可以進入debug。


 

如果編譯通過的話,會是這個樣子。


 

進入仿真后光標會停在主函數開始處。


 

下面對上圖的按鈕做一下說明 

按鈕1,運行按鈕,全速運行。如果為灰色,說明一直在執行代碼,也可能是死循環,點暫停鍵看看。

按鈕2,暫停運行。

按鈕3,退出仿真。

按鈕4,單步運行,遇到子函數進入子函數。

按鈕5,單步運行,遇到函數會當成語句,直接一步過,不進入函數內部。

按鈕6,單步運行,如果程序在子函數中運行,點擊此按鈕,跳出子函數。

按鈕7,匯編單步,遇到子函數,進入子函數。

按鈕8,匯編單步運行,遇到函數會當成語句,直接一步過,不進入函數內部。

在軟件調試過程中,進行如下操作可以查看變量,寄存器值。

點擊view菜單,選擇Expressions項。


 

出現以下界面


 

▼ 選中要觀察的變量名,右擊選中AddWatch Expression 項。


 

點擊ok。


 

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


 

點擊Addnew expression  輸入R30,在Expressions窗口中顯示R30值。


 

當進入調試界面后,當要程序運行到某一行時,右擊某一行,點擊runto line 。則運行到此行,右擊57行。


 

運行到57行gpio值發生變化,轉化為16進制為0xffffffff。


 

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


 

----  END   ----


 長按識別二維碼加關注 

飛凌嵌入式

專注于智能設備核心平臺研發與制造


■ 關注“飛凌嵌入式”公眾號,不定期分享行業干貨及產品一線資料。

■ 直接微信回復產品平臺,如“LS1043A”,即可快速獲取對應產品信息。

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

銷售工程師:400-699-6866

國際業務部:0312-3102650-854

技術服務部:0312-3119192

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

■ 實時技術支持:

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

 

相關產品 >

  • OK5718-C2開發板

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

    CPU: T507 工業級處理器,超低功耗,10年+生命周期|推薦全志工業級T507開發板系列,飛凌OKT507-C開發板采用全志T507 四核工業級處理器 T507設計開發,Cortex-A53架構,工業級寬溫,性能強,低功耗,是一款高性價比的工業級產品,提供豐富的開發設計資料,提供產品規格書,軟硬件手冊等,全志的T507適用于車載電子、電力、醫療、工業控制、物聯網、智能終端等領域。

    了解詳情
    OKT507-C 開發板
  • OKMX8MP-C開發板

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

    了解詳情
    OKMX8MP-C開發板
  • OK3568-C開發板

    強而穩,國產芯,1Tops算力,多路高速接口|飛凌RK3568系列RK3568開發板基于國產工業級AI處理器RK3568四核64位Cortex-A55 處理器設計。RK3568作為國產化高性能處理器,瑞芯微RK3568芯片是一款定位中高端的通用型SoC,瑞芯微RK3568芯片是一款定位中高端的通用型SoC,NPU達到1Tops,飛凌RK3568系列核心板提供瑞芯微RK3568規格書_datasheet_數據手冊_原理圖等,


    了解詳情
    OK3568-C開發板

推薦閱讀 換一批 換一批