Download presentation
Presentation is loading. Please wait.
1
FPPA 程式架構
2
Processor Array Organization
PC Stack Point ACC Flag FPP0 PC Stack Point ACC Flag FPP1 IO Ports PC Stack Point ACC Flag FPP2 Register PC Stack Point ACC Flag FPP3 Program Memory PC Stack Point ACC Flag FPP4 FPPA硬體組織架構圖 八個核心的地位是平行的,可以同時共享所有的IO、暫存器、ROM、SRAM 各自擁有的有程式指標PC、堆疊SP、累加器ACC、狀態旗標FLAG Data Memory PC Stack Point ACC Flag FPP5 PC Stack Point ACC Flag FPP6 PC Stack Point ACC Flag FPP7
3
FPP Units Initialization
Program Memory Organization Address OPT ROM 000h 007h FPP Boot Entry 010h ISR Entry FPP0 FPP Units Initialization FPP0 Program Memory User Program FPP1 FPP1 Program Memory 韌體在 OPT ROM 中看的來的架構類以這個樣子,位址 000h~007h 是八個核心的程式進入點,FPPA一上電開始運作程序就是從這個地方開始,但是一開始只有FPP0是在RUN的狀態,其它都是暫停的狀態,原因是為了給MCU作初始化的動作,這個後面會談到。 再來010h的地方是FPPA中斷進入點,FPPA跟傳統MCU一樣可以設置IO、Timer…的Interrupt ,但是我自己在實作上卻很少用到(因為有八核分工,不再需要去”打斷”主程序的進行),等對FPPA程式運作有了初步的概念後,你就會發覺Interrupt事實上不是必要的。(這對大多數人是一項好消息,因為不用再為一大堆奇奇怪怪的暫存器作設定來初始化Interrupt) 再後面的 ROM 區都是韌體存放的地方,順序其實沒有一定,看個人習慣作安排,當然最好還是以看的懂、易維護為原則,譬如同一個核心的主程式碼放一起、副程式放一起、變數宣告放一起、常數定義放一起、TABLE放一起…。 Global Subroutine Table FFEh FFFh System Use
4
Data Memory Organization
Address SRAM 000h index 100h FPP0 FPP0 Stack 這張是FPPA記憶體的架構圖,事實上是完全空白的,完全可以由程式設計師來作分配。(index是什麼? RAM查表用,不同於ROM查表…),比較要注意的是STACK的分配(順便解釋一下stack的概念…),由於FPPA的STACK是由程式設計師來分配位置、大小,你可以自訂STACK起點,所以比較要小心的一點就是要了解自己程式運行所需要的STACK大小來合理分配STACK,以免各CPU的STACK重疊或超出SRAM的大小。 FPP1 FPP1 Stack 1FFh
5
Firmware Structure of Processor Unit
.romadr 0x0000 Boot: goto FPP0Boot; goto FPP1Boot; goto FPP2Boot; goto FPP3Boot; goto FPP4Boot; goto FPP5Boot; goto FPP6Boot; goto FPP7Boot; .romadr 0x0010 Interrupt: reti; FPP0Boot: //--- Initialize MCU //--- Enable other FPP //--- Initialize FPP1 SP and so on … FPP0MainLoop: goto FPP0MainLoop; FPP1Boot: //--- Initialize FPP1 SP and so on … FPP1MainLoop: goto FPP1MainLoop; FPP2Boot: //--- Initialize FPP2 SP and so on … FPP2MainLoop: goto FPP2MainLoop; 這張是基本的程式碼架構圖,其實也就是跟剛剛介紹的 ROM 的架構圖一樣。 .romadr 0x0000 代表底下程式碼要放到 ROM 位址 0X0000,也是 FPPA 開始運作的起點, 8行等於八個核心的起點。 FPPA一上電,FPP0 Enable 其餘 Disable 狀態,等 FPP0 作好一些初始化的動作,再 Enable 其它 FPP,然後開始同步多工執行。 FPP3Boot: //--- Initialize FPP3 SP and so on … FPP3MainLoop: goto FPP3MainLoop;
6
Boot Procedure START 32KHz ILRC oscillator Initialize the system
System Clock define Initialize the I/O I/O define Initialize the shared Resources of FPPx SRAM define Enable Other FPP 開機程序目的是幫 MCU 作初始化的動作,設定核心時脈、IO、記憶體變數…,之後系統才算是真正開始運作。 Performance Bandwidth Sharing Set The Stack of FPP0 Set The Stack of FPP1 Set The Stack of FPP2 FPP0 Firmware FPP1 Firmware FPP2 Firmware
7
Boot Procedure example
The example code for fpp0Boot is listed below, it’s for reference only FPP0Boot: // turn-off watchdog set0 clkmd.1; // Enable EOSC and wait for stable mov a, 0b ; mov eoscr, a; delay 0xFF; // Calibrate IHRC and wait for stable mov a, 0b0000_0000 ; mov ihrcrh, a; mov a, 0b1100_1010; mov ihrcrl, a; delay 0xFF ; //switch ILRC to IHRC mov a, 0b ; mov clkmd, a; //--- initial the I/O Pin mov a, 0xff; mov pac, a ; mov a, 0xff ; mov pa, a ; //---- Set the performance for units pmode 31; //---- Enable other Processor unit --- mov a, 0xFF ; mov fppen, a ; // Stack Pointer Setting for FPP0 mov a, 0x60 ; mov sp, a ; … 初始化的流程寫成程式碼其實沒幾行,就是設定一些暫存器的值,這邊是一小段範例,大體上都跑不出這樣的框架,至於暫存器的值要填什麼? 最好研讀原廠 Datasheet 會有更詳細的說明。底下先大略介紹幾個重要而且必要的。 eoscr-設定是否使用外部RC或OSC clkmd-設定系統時脈振盪除頻、看門狗 ihrcrh ihrcrl-設定使用內部HighRC的頻率校正值 pmode-設定八個核心系統時脈分時 各核心跑多快? 舉例來說 外掛16MhzOSC、clkmd/2、pmode/8 = 16/2/8 = 1Mhz 1T = 1us (1T=1個指令週期)
8
eoscr - Enable External OSCillator
Registers eoscr - Enable External OSCillator bit-0: 1=Enable XTAL Smith trigger strong mode 0=Disable XTAL Smith trigger strong mode bit-1: 1=Enable XTAL Smith trigger 0=Disable XTAL Smith trigger bit4-2: Option of driving strength in crystal oscillator bit6-5: 00=External RC oscillator 01=32KHz crystal oscillator 10=4Mhz crystal oscillator 11=20MHz crystal oscillator bit7: 1=Enable external RC oscillator or crystal oscillator 0=Disable external RC oscillator or crystal oscillator internal 32KHz need delay 30m/S external 20MHz need delay 1m/S
9
clkmd - Clock Mode Register
Registers clkmd - Clock Mode Register Use External OSCillator bit-0: Reset Function/RA5 bit-1: 1=Enable Watch Dog (default) 0=Disable Watch Dog bit-2: 1=Enable Internal Low RC (default) 0=Disable Internal Low RC bit-3: No Used bit-4: 1=Enable Internal High RC (default) 0=Disable Internal High RC bit-7~5: 000=internal high RC/4 001=internal high RC/2 010=internal high RC 011=external OSC/4 100=external OSC/2 101=external OSC 110=internal low RC/4 111=internal low RC (default)
10
ihrcrh / ihrcrl - Internal high RC Calibrate Register
Registers ihrcrh / ihrcrl - Internal high RC Calibrate Register bit-0:Internal high RC Calibrate Register High bit-0-7:Internal high RC Calibrate Register Low VDD=5V,T=25℃ H-HIHRCRL FREQ H-HIHRCRL FREQ 0_0000_ _1011_ 0_0001_ _1101_ 0_0010_ _1101_ 0_0100_ _1110_ 0_0101_ _1110_ 0_0110_ _1111_ 0_0111_ _1111_ 0_1001_ _0001_ 0_1010_ _0010_ 0_1010_ _0011_ AP-NOTE:PDK-APN _V001.pdf
11
pmode - FPP units bandwidth sharing
Registers pmode - FPP units bandwidth sharing 80C0X/80C1X/80C2X 0 : /2、/8、/16、/16、/16、/16、/16、/16 1 : /4、/4、/8、/8、/16、/16、/16、/16 2 : /8、/8、/8、/8、/8、/8、/8、/8 3 : /2、/8、/8、/8、/8、X、X、X 4 : /4、/4、/4、/8、/8、X、X、X 5 : /16、/4、/4、/4、/16、/16、/16、X 6 : /16、/2、/8、/16、/16、/16、/16、/16 7 : /8、/2、/8、/8、/8 ICE/80C6X/82CXX 0: /2, /2 1: /2, /4, /4 2: /4, /2, /4 3: /2, /4, /8, /8 4: /4, /2, /8, /8 5: /8, /2, /4, /8 … 31: /8, /8, /8, /8, /8, /8, /8, /8
12
1T = OSC / CLKMD / PMODE ( 1T=1個指令週期 )
各核心跑多快 BOOT程序的重點主要在決定各核心要跑多快。 1T = OSC / CLKMD / PMODE ( 1T=1個指令週期 ) 舉例來說… eoscr = 0b ;外掛16MhzOSC clkmd = 0b ; external OSC/2 pmode = 2 ;八個核心都 /8 1T = 16/2/8 = 1Mhz 1T = 1us
13
程式架構參考 Project Description FPPA Entry Pre-Processor Setting
FPPA Boot/Clock Setting I/O Define Signal/Flag Control RAM Define Const Value Define MACRO Define FPPA Enable Control Define FPPA Program Counter Define STACK Define FPPA Entry Interrupt Service Routine Entry FPP0Boot FPPA Boot Setting Clear RAM space I/O Setting Timer16 initial setup Interrupt initial setup AD initialize for PDK82CX Variables initialize FPP1Boot FPP2Boot FPP3Boot FPP4Boot FPP5Boot FPP6Boot FPP7Boot Subroutine libraries ROM 總結一下 FPPA 程式的架構可以看成這張圖,這也是我自己的程式樣版程式,一些固定不變的BOOT程序、常數的定義都寫好了,有新的專案就只要稍微修改一下設定值就可以專心在程式的開發上了(畢竟那才是重點) 順便介紹一下 Ultra Edit IO、變數、常數、巨集定義 中斷程式 MCU 初始化 程式碼 副程式 OTP ROM 區
Similar presentations