處理器架構(gòu)到互補(bǔ)PWM實(shí)戰(zhàn)開(kāi)發(fā)指南)
1. 從“外設(shè)”到“協(xié)處理器”重新認(rèn)識(shí)MPC5634的eTPU如果你接觸過(guò)一些主流的微控制器比如STM32或者NXP的Kinetis系列你對(duì)“定時(shí)器”的概念一定不陌生——無(wú)非就是幾個(gè)計(jì)數(shù)器、幾個(gè)比較/捕獲寄存器配上中斷用來(lái)做PWM輸出、輸入捕獲或者簡(jiǎn)單的定時(shí)。當(dāng)你第一次翻開(kāi)MPC5634的數(shù)據(jù)手冊(cè)看到那個(gè)名為“eTPU”Enhanced Time Processing Unit的章節(jié)時(shí)可能會(huì)下意識(shí)地把它歸類為一個(gè)“高級(jí)定時(shí)器模塊”。我最初也是這么想的直到真正開(kāi)始用它去實(shí)現(xiàn)一個(gè)復(fù)雜的電機(jī)FOC控制算法時(shí)才徹底顛覆了這個(gè)認(rèn)知。eTPU不是一個(gè)外設(shè)它是一個(gè)集成在芯片內(nèi)部的、專為時(shí)間處理任務(wù)優(yōu)化的協(xié)處理器。這個(gè)定位上的根本差異決定了我們學(xué)習(xí)它的方式不能沿用傳統(tǒng)定時(shí)器的思路。傳統(tǒng)的定時(shí)器是“被動(dòng)”的你需要CPU不斷地去讀寫寄存器、檢查標(biāo)志位、計(jì)算下一個(gè)動(dòng)作點(diǎn)。而eTPU是“主動(dòng)”的你寫好一套處理時(shí)間事件的“程序”我們稱之為eTPU函數(shù)或微碼下載到它的專用內(nèi)存里它就能自己獨(dú)立運(yùn)行處理復(fù)雜的多通道、高精度時(shí)序邏輯只在必要時(shí)通過(guò)中斷或共享內(nèi)存告訴主CPU“事情辦完了”或者“這里有新數(shù)據(jù)”。為什么MPC5634需要這么個(gè)玩意兒想想它的典型應(yīng)用場(chǎng)景汽車發(fā)動(dòng)機(jī)控制、變速箱控制、電動(dòng)助力轉(zhuǎn)向。這些系統(tǒng)里充斥著大量高實(shí)時(shí)性、高確定性的時(shí)間任務(wù)——點(diǎn)火正時(shí)、噴油脈寬、曲軸/凸輪軸信號(hào)解碼、PWM生成與死區(qū)管理。如果所有這些任務(wù)都擠占主CPU的資源和中斷響應(yīng)系統(tǒng)很快就會(huì)不堪重負(fù)且時(shí)序抖動(dòng)難以控制。eTPU的價(jià)值就在于它把這些最耗時(shí)、最要求精準(zhǔn)的“臟活累活”全部接管了讓主CPUPower Architecture e200z4核心能騰出手來(lái)處理更高層的控制算法、診斷和通信任務(wù)。所以這篇學(xué)習(xí)筆記的起點(diǎn)不是去羅列eTPU的寄存器而是先建立這個(gè)核心心智模型eTPU是一個(gè)帶有獨(dú)立指令集、內(nèi)存和調(diào)度器的可編程時(shí)序協(xié)處理器。我們學(xué)習(xí)它更像是在學(xué)習(xí)如何為這個(gè)小型“單片機(jī)”編寫裸機(jī)程序只不過(guò)這個(gè)“單片機(jī)”的專長(zhǎng)只有一件事——極其精準(zhǔn)地處理時(shí)間。2. eTPU的架構(gòu)全景不止是定時(shí)器通道的簡(jiǎn)單堆疊理解了eTPU的協(xié)處理器定位我們?cè)俨痖_(kāi)它的內(nèi)部架構(gòu)看看。很多人會(huì)被它那多達(dá)32或64個(gè)的“通道”Channel所吸引以為這就是64個(gè)獨(dú)立的定時(shí)器。這其實(shí)是一個(gè)巨大的誤解。通道是eTPU的執(zhí)行單元和資源入口但背后的支撐體系要復(fù)雜得多。2.1 核心組成模塊拆解一個(gè)完整的eTPU模塊通常包含以下幾個(gè)關(guān)鍵部分我們可以把它想象成一個(gè)微型的計(jì)算機(jī)系統(tǒng)eTPU引擎Engine這是核心的“CPU”負(fù)責(zé)執(zhí)行eTPU微碼。它有自己的取指、譯碼、執(zhí)行流水線。與我們主CPU的通用指令集不同eTPU的指令集是高度特化的包含了大量針對(duì)時(shí)間操作的指令比如“等待直到某個(gè)時(shí)間點(diǎn)”、“在特定時(shí)刻觸發(fā)輸出”、“測(cè)量輸入脈沖的寬度”等單條指令就能完成傳統(tǒng)CPU需要多條指令甚至循環(huán)判斷才能做到的事。通道Channels這是eTPU與外部引腳交互的窗口。每個(gè)通道都關(guān)聯(lián)到一個(gè)特定的芯片引腳。但通道本身不是一個(gè)完整的定時(shí)器它更像是一個(gè)配備了專用硬件比如匹配寄存器、捕獲寄存器、輸出控制邏輯的“前臺(tái)接待”。通道的狀態(tài)和行為完全由運(yùn)行在eTPU引擎上的“服務(wù)程序”即eTPU函數(shù)來(lái)定義。你可以讓通道A運(yùn)行一個(gè)PWM生成函數(shù)通道B運(yùn)行一個(gè)輸入捕獲函數(shù)通道C和D共同運(yùn)行一個(gè)帶死區(qū)互補(bǔ)的PWM函數(shù)。通道的靈活性正在于此它的功能是軟件定義的而非硬件固定死的。微碼存儲(chǔ)器Microcode Memory這是eTPU引擎的“程序存儲(chǔ)器”。里面存放著所有eTPU函數(shù)的二進(jìn)制代碼微碼。這些微碼通常由芯片廠商提供NXP會(huì)提供一套標(biāo)準(zhǔn)函數(shù)庫(kù)如eTPU函數(shù)集FS我們也可以自己編寫但難度極高。開(kāi)發(fā)時(shí)我們通過(guò)主CPU將這些微碼鏡像加載到這片RAM中。數(shù)據(jù)存儲(chǔ)器Data Memory這是eTPU引擎的“運(yùn)行內(nèi)存”。用于存儲(chǔ)eTPU函數(shù)運(yùn)行時(shí)需要的變量、參數(shù)、狀態(tài)信息。這部分內(nèi)存是主CPU和eTPU引擎共享的是兩者通信的主要橋梁。主CPU通過(guò)寫數(shù)據(jù)存儲(chǔ)器來(lái)配置參數(shù)比如設(shè)置PWM頻率占空比eTPU通過(guò)更新數(shù)據(jù)存儲(chǔ)器來(lái)反饋狀態(tài)比如捕獲的脈沖寬度值。調(diào)度器Scheduler這是eTPU的“操作系統(tǒng)內(nèi)核”。eTPU引擎是單線程的同一時(shí)刻只能執(zhí)行一個(gè)通道的服務(wù)程序。調(diào)度器負(fù)責(zé)管理所有通道的服務(wù)請(qǐng)求。當(dāng)某個(gè)通道的硬件事件發(fā)生時(shí)比如輸入跳變、匹配成功該通道會(huì)向調(diào)度器發(fā)出服務(wù)請(qǐng)求Service Request。調(diào)度器根據(jù)預(yù)設(shè)的優(yōu)先級(jí)決定下一個(gè)執(zhí)行哪個(gè)通道的函數(shù)。這種機(jī)制保證了高優(yōu)先級(jí)時(shí)序事件能得到及時(shí)響應(yīng)。時(shí)間基準(zhǔn)Time BaseeTPU有自己獨(dú)立的時(shí)間計(jì)數(shù)器通常由系統(tǒng)時(shí)鐘分頻而來(lái)。所有通道的定時(shí)、匹配、延時(shí)都基于這個(gè)統(tǒng)一的時(shí)間基準(zhǔn)確保了整個(gè)eTPU模塊內(nèi)部時(shí)間的一致性。2.2 與主CPU的交互共享內(nèi)存是王道主CPU以下簡(jiǎn)稱主機(jī)如何與eTPU這個(gè)“協(xié)處理器”對(duì)話中斷是一種方式但更高效、更常用的方式是共享數(shù)據(jù)存儲(chǔ)器Data Memory。主機(jī)和eTPU都能訪問(wèn)這片內(nèi)存區(qū)域。開(kāi)發(fā)時(shí)我們需要定義一個(gè)清晰的數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)這片共享內(nèi)存。例如對(duì)于一個(gè)PWM函數(shù)主機(jī)負(fù)責(zé)寫的區(qū)域可能包括周期值PWM_PERIOD、占空比值PWM_DUTY、使能標(biāo)志PWM_ENABLE。eTPU負(fù)責(zé)寫的區(qū)域可能包括當(dāng)前計(jì)數(shù)狀態(tài)CURRENT_COUNT、錯(cuò)誤標(biāo)志FAULT_FLAG。主機(jī)在配置好參數(shù)后只需要寫一個(gè)“參數(shù)更新”標(biāo)志或直接修改參數(shù)eTPU函數(shù)在運(yùn)行時(shí)會(huì)定期檢查這些共享變量并據(jù)此調(diào)整自己的行為。同樣eTPU將捕獲到的數(shù)據(jù)寫入共享變量主機(jī)通過(guò)輪詢或中斷當(dāng)eTPU設(shè)置標(biāo)志位并觸發(fā)主機(jī)中斷時(shí)來(lái)讀取。這種基于共享內(nèi)存的通信耦合度低效率高。主機(jī)不需要知道eTPU函數(shù)正在執(zhí)行到哪一步只需要關(guān)心輸入?yún)?shù)和輸出結(jié)果。這正體現(xiàn)了協(xié)處理器的設(shè)計(jì)思想職責(zé)分離異步協(xié)作。注意在訪問(wèn)共享數(shù)據(jù)存儲(chǔ)器時(shí)需要考慮數(shù)據(jù)一致性問(wèn)題。對(duì)于小于等于32位的變量在MPC5634的架構(gòu)下通常單次讀寫是原子的atomic但為了代碼清晰和可移植性建議在主機(jī)端當(dāng)一組相關(guān)參數(shù)需要同時(shí)生效時(shí)仍采用“先寫所有參數(shù)最后寫一個(gè)觸發(fā)標(biāo)志”的模式。在eTPU函數(shù)側(cè)讀取主機(jī)參數(shù)時(shí)也應(yīng)注意避免在主機(jī)正修改的半途讀取有時(shí)需要簡(jiǎn)單的標(biāo)志位握手協(xié)議。3. 開(kāi)發(fā)流程與工具鏈告別寄存器擁抱函數(shù)庫(kù)傳統(tǒng)的定時(shí)器編程是直接面向寄存器Register-Level Programming。而eTPU的開(kāi)發(fā)是面向函數(shù)庫(kù)的Function-Level Programming。這是學(xué)習(xí)曲線中最需要適應(yīng)的一點(diǎn)但也是提升開(kāi)發(fā)效率和可靠性的關(guān)鍵。3.1 標(biāo)準(zhǔn)函數(shù)庫(kù)eTPU Function Set, FSNXP為eTPU提供了豐富的標(biāo)準(zhǔn)函數(shù)庫(kù)。這些函數(shù)就是已經(jīng)編譯好的eTPU微碼涵蓋了絕大多數(shù)常見(jiàn)的時(shí)序功能PWM生成單通道PWM互補(bǔ)帶死區(qū)PWM中心對(duì)齊PWM。輸入捕獲測(cè)量脈沖寬度、周期解碼正交編碼器信號(hào)。輸出比較在精確的時(shí)間點(diǎn)翻轉(zhuǎn)引腳。脈沖計(jì)數(shù)頻率測(cè)量。復(fù)雜協(xié)議直接支持解碼曲軸Crank和凸輪軸Cam傳感器信號(hào)用于發(fā)動(dòng)機(jī)位置判斷。我們的開(kāi)發(fā)工作從“如何配置寄存器”變成了“如何配置和調(diào)用這些現(xiàn)成的函數(shù)”。你需要做的通常是從函數(shù)庫(kù)文檔中找到所需函數(shù)如PWM_CFG用于PWM生成。在主機(jī)代碼中為這個(gè)函數(shù)實(shí)例分配一個(gè)或多個(gè)eTPU通道。初始化該函數(shù)實(shí)例的數(shù)據(jù)結(jié)構(gòu)在共享內(nèi)存中填入?yún)?shù)頻率、占空比、極性等。調(diào)用庫(kù)提供的初始化API將函數(shù)鏈接到通道并啟動(dòng)它。3.2 開(kāi)發(fā)工具與調(diào)試工欲善其事必先利其器。eTPU開(kāi)發(fā)強(qiáng)烈依賴芯片廠商提供的工具eTPU編譯器/匯編器如果你需要自定義eTPU函數(shù)這種情況在標(biāo)準(zhǔn)庫(kù)足夠強(qiáng)大時(shí)很少見(jiàn)你需要用eTPU專用的匯編語(yǔ)言或高級(jí)語(yǔ)言如C的變種來(lái)編寫并用這個(gè)工具鏈編譯成微碼。對(duì)于絕大多數(shù)應(yīng)用我們不需要接觸這一步。eTPU模擬器Simulator這是極其重要的離線調(diào)試工具。你可以在沒(méi)有硬件的情況下在PC上模擬eTPU引擎的執(zhí)行單步調(diào)試eTPU微碼觀察通道狀態(tài)和共享變量的變化。對(duì)于驗(yàn)證復(fù)雜時(shí)序邏輯和排查eTPU函數(shù)級(jí)的問(wèn)題模擬器不可或缺。NXP的CodeWarrior舊版或S32 Design Studio for Power Architecture新版通常集成或附帶eTPU模擬器。實(shí)時(shí)調(diào)試On-Chip Debugging在硬件上通過(guò)JTAG或Nexus調(diào)試接口你可以同時(shí)調(diào)試主機(jī)CPU代碼和觀察eTPU的狀態(tài)。高級(jí)調(diào)試器可以顯示eTPU的當(dāng)前執(zhí)行地址、通道服務(wù)隊(duì)列、共享內(nèi)存內(nèi)容等。這對(duì)于集成調(diào)試和性能分析至關(guān)重要。一個(gè)典型的開(kāi)發(fā)調(diào)試心得當(dāng)你發(fā)現(xiàn)eTPU的輸出行為不符合預(yù)期時(shí)不要首先懷疑硬件或主CPU配置。第一步應(yīng)該是打開(kāi)eTPU模擬器用同樣的參數(shù)初始化你的函數(shù)看看在理想環(huán)境下它是否工作。如果模擬器里是對(duì)的但硬件上不對(duì)那么問(wèn)題很可能出在主機(jī)和eTPU之間的共享內(nèi)存數(shù)據(jù)結(jié)構(gòu)定義不一致字節(jié)序、對(duì)齊問(wèn)題。eTPU時(shí)鐘源配置錯(cuò)誤導(dǎo)致時(shí)間基準(zhǔn)不準(zhǔn)。引腳復(fù)用配置錯(cuò)誤eTPU通道沒(méi)有正確映射到物理引腳。函數(shù)初始化順序或參數(shù)寫入時(shí)機(jī)不對(duì)eTPU在參數(shù)未完全準(zhǔn)備好時(shí)就開(kāi)始運(yùn)行了。4. 第一個(gè)eTPU實(shí)戰(zhàn)配置一個(gè)互補(bǔ)PWM輸出理論說(shuō)了這么多我們用一個(gè)最簡(jiǎn)單的例子來(lái)串起整個(gè)流程在MPC5634上使用eTPU生成兩路帶死區(qū)的互補(bǔ)PWM用于驅(qū)動(dòng)一個(gè)半橋電路。假設(shè)我們使用通道0和通道1。4.1 環(huán)境準(zhǔn)備與規(guī)劃首先明確需求PWM頻率10kHz占空比30%死區(qū)時(shí)間1微秒us采用邊沿對(duì)齊模式。我們需要使用標(biāo)準(zhǔn)函數(shù)庫(kù)中的PWM_CFG函數(shù)。查閱該函數(shù)的參考手冊(cè)我們知道它需要一個(gè)“主機(jī)序列接口”Host Sequence Interface這其實(shí)就是一組定義在共享內(nèi)存中的參數(shù)結(jié)構(gòu)體。通常工具鏈會(huì)提供一個(gè)頭文件如etpu_pwm.h里面已經(jīng)定義好了這個(gè)結(jié)構(gòu)體fs_etpu_pwm_config_t。我們的任務(wù)就是在主CPU的內(nèi)存中實(shí)例化這個(gè)結(jié)構(gòu)體并填充參數(shù)。調(diào)用庫(kù)函數(shù)告訴eTPU“請(qǐng)將PWM_CFG函數(shù)的微碼加載到通道0和1上運(yùn)行并使用我剛填好的那個(gè)結(jié)構(gòu)體作為參數(shù)”。4.2 主機(jī)端代碼詳解以下是基于NXP標(biāo)準(zhǔn)驅(qū)動(dòng)庫(kù)風(fēng)格的主機(jī)C代碼框架#include “etpu_pwm.h” // PWM函數(shù)的數(shù)據(jù)結(jié)構(gòu)定義 #include “etpu_util.h” // eTPU通用工具函數(shù) /* 定義全局參數(shù)結(jié)構(gòu)體實(shí)例 */ fs_etpu_pwm_config_t my_pwm_config; void eTPU_PWM_Init(void) { /* 1. 使能eTPU模塊時(shí)鐘 */ /* 這部分代碼高度依賴MCU的時(shí)鐘系統(tǒng)配置通常通過(guò)寫芯片的SIU或MCU模塊寄存器完成 */ /* 例如SIU.SYSCLK.B.ETPU_EN 1; */ /* 2. 初始化eTPU模塊設(shè)置時(shí)間基準(zhǔn)、優(yōu)先級(jí)等 */ /* 調(diào)用庫(kù)函數(shù)如etpu_init(); */ /* 3. 加載PWM_CFG函數(shù)的微碼到eTPU內(nèi)存如果尚未加載 */ /* 通常有一個(gè)全局初始化函數(shù)一次加載所有要用到的函數(shù) */ /* 例如etpu_pwm_init(); */ /* 4. 配置PWM參數(shù) */ uint32_t system_clock_hz 64000000; // 假設(shè)系統(tǒng)時(shí)鐘64MHz uint32_t etpu_clock_hz system_clock_hz / 2; // 假設(shè)eTPU時(shí)鐘為系統(tǒng)時(shí)鐘2分頻即32MHz uint32_t ticks_per_us etpu_clock_hz / 1000000; // 每微秒的時(shí)鐘節(jié)拍數(shù)32 my_pwm_config.channel_a 0; // 主通道使用eTPU通道0 my_pwm_config.channel_b 1; // 互補(bǔ)通道使用eTPU通道1 my_pwm_config.polarity_a ETPU_PWM_POLARITY_ACTIVE_HIGH; my_pwm_config.polarity_b ETPU_PWM_POLARITY_ACTIVE_HIGH; my_pwm_config.mode ETPU_PWM_MODE_EDGE_ALIGNED; my_pwm_config.dead_time_ticks 1 * ticks_per_us; // 死區(qū)1us轉(zhuǎn)換為節(jié)拍數(shù) my_pwm_config.period_ticks (1000000 / 10000) * ticks_per_us; // 周期100us (10kHz)轉(zhuǎn)換為節(jié)拍數(shù) my_pwm_config.duty_ticks (my_pwm_config.period_ticks * 30) / 100; // 占空比30%對(duì)應(yīng)的節(jié)拍數(shù) my_pwm_config.transition_count 0; // 立即生效 my_pwm_config.service_request 0; // 本例不使用服務(wù)請(qǐng)求中斷到主機(jī) /* 5. 將PWM函數(shù)分配到指定通道并啟動(dòng) */ fs_etpu_pwm_config(ETPU_A, // 使用哪個(gè)eTPU模塊MPC5634通常只有一個(gè)稱為ETPU_A my_pwm_config, my_pwm_config.channel_a); // 從通道A開(kāi)始配置一對(duì)通道 }關(guān)鍵點(diǎn)解析時(shí)間單位是“節(jié)拍”TickeTPU的所有時(shí)間參數(shù)最終都需要轉(zhuǎn)換為基于其時(shí)間基準(zhǔn)時(shí)鐘的節(jié)拍數(shù)。這是確保精度的基礎(chǔ)。計(jì)算ticks_per_us是關(guān)鍵一步。參數(shù)賦值時(shí)機(jī)上述代碼在初始化時(shí)配置了初始占空比。在運(yùn)行時(shí)如果你想動(dòng)態(tài)改變占空比不應(yīng)該直接修改my_pwm_config.duty_ticks因?yàn)閑TPU可能正在讀取這個(gè)結(jié)構(gòu)體。標(biāo)準(zhǔn)函數(shù)庫(kù)通常會(huì)提供專門的更新函數(shù)如fs_etpu_pwm_duty_update()該函數(shù)會(huì)以線程安全的方式更新參數(shù)并確保在PWM下一個(gè)周期安全地切換。通道分配PWM_CFG函數(shù)要求兩個(gè)通道必須是相鄰的奇數(shù)/偶數(shù)對(duì)如0/1, 2/3。庫(kù)函數(shù)fs_etpu_pwm_config內(nèi)部會(huì)處理這兩個(gè)通道的關(guān)聯(lián)。4.3 引腳映射與硬件連接代碼配置好后eTPU通道0和1需要映射到具體的芯片引腳上。這需要通過(guò)芯片的引腳復(fù)用控制器可能是SIU或PCR寄存器來(lái)設(shè)置。你需要查閱MPC5634的數(shù)據(jù)手冊(cè)找到支持eTPU通道0和1輸出的引腳并將其功能選擇為“eTPU_A_CH0”和“eTPU_A_CH1”。例如假設(shè)引腳PCS0和PCS1復(fù)用了eTPU功能// 配置PCS0引腳為eTPU_A_CH0輸出 SIU.PCR[0].B.PA 0; // 選擇復(fù)用功能 SIU.PCR[0].B.OBE 1; // 輸出使能 SIU.PCR[0].B.IBE 0; // 輸入失能因?yàn)槭禽敵?// 具體哪個(gè)位選擇eTPU功能需查手冊(cè)可能是PS字段 SIU.PCR[0].B.PS 2; // 假設(shè)值2代表eTPU_A_CH0功能 // 對(duì)PCS1引腳做類似配置選擇eTPU_A_CH1功能配置完成后用示波器測(cè)量PCS0和PCS1引腳應(yīng)該能看到頻率10kHz、占空比30%、兩者相位相反且中間有1us死區(qū)的PWM波形。4.4 避坑指南為什么我的PWM沒(méi)有輸出這是新手最常見(jiàn)的問(wèn)題。按照以下清單排查可以解決90%的問(wèn)題時(shí)鐘問(wèn)題最常見(jiàn)eTPU模塊的時(shí)鐘是否使能eTPU的時(shí)間基準(zhǔn)時(shí)鐘etpu_clock_hz你計(jì)算對(duì)了嗎用這個(gè)時(shí)鐘計(jì)算出的節(jié)拍數(shù)是否超出了函數(shù)參數(shù)的范圍比如周期節(jié)拍數(shù)是否為0或過(guò)大一個(gè)驗(yàn)證方法是嘗試將一個(gè)通道配置為簡(jiǎn)單的“輸出比較”翻轉(zhuǎn)模式用極低的頻率比如1Hz讓引腳每秒翻轉(zhuǎn)一次如果這個(gè)成功了說(shuō)明eTPU基本時(shí)鐘和引腳映射是對(duì)的問(wèn)題可能出在PWM函數(shù)參數(shù)上。引腳復(fù)用問(wèn)題你配置的引腳復(fù)用寄存器真的選擇到了eTPU功能嗎同一個(gè)引腳可能有8種復(fù)用功能務(wù)必核對(duì)手冊(cè)中的ALTAlternate Function編號(hào)。另外輸出使能OBE是否打開(kāi)函數(shù)未加載或鏈接錯(cuò)誤你確定PWM_CFG函數(shù)的微碼被加載到eTPU內(nèi)存了嗎etpu_pwm_init()這類函數(shù)通常需要在整個(gè)系統(tǒng)初始化時(shí)調(diào)用一次。通道鏈接是否正確使用庫(kù)函數(shù)fs_etpu_pwm_config后可以嘗試讀取通道的硬件服務(wù)請(qǐng)求狀態(tài)寄存器HSR或通道狀態(tài)寄存器看看函數(shù)是否被成功鏈接。參數(shù)寫入時(shí)機(jī)與同步你是否在eTPU引擎已經(jīng)開(kāi)始運(yùn)行可能正在讀取舊參數(shù)的時(shí)候修改了共享內(nèi)存中的參數(shù)對(duì)于初始化確保在調(diào)用配置函數(shù)前所有參數(shù)都已就緒。對(duì)于運(yùn)行時(shí)更新務(wù)必使用庫(kù)函數(shù)提供的更新API而不是直接寫內(nèi)存。死區(qū)時(shí)間與極性檢查死區(qū)時(shí)間設(shè)置是否合理。如果死區(qū)時(shí)間設(shè)置得比脈沖寬度還大可能會(huì)導(dǎo)致沒(méi)有有效脈沖輸出。同時(shí)檢查極性配置ACTIVE_HIGH和ACTIVE_LOW會(huì)直接影響你示波器上看到的波形。通過(guò)這個(gè)簡(jiǎn)單的PWM例子你應(yīng)該能體會(huì)到eTPU開(kāi)發(fā)模式與傳統(tǒng)定時(shí)器的不同更多的抽象更少的直接寄存器操作更強(qiáng)的功能可配置性以及需要關(guān)注主機(jī)與協(xié)處理器之間的異步數(shù)據(jù)同步。掌握了這個(gè)基本流程再去學(xué)習(xí)輸入捕獲、編碼器接口等復(fù)雜函數(shù)就會(huì)順暢很多。eTPU的強(qiáng)大在于將這些復(fù)雜的功能都封裝成了一個(gè)個(gè)可靠的、可重用的“樂(lè)高積木”讓我們能專注于構(gòu)建更高層的應(yīng)用邏輯。