器配置與調(diào)試實(shí)戰(zhàn):從FSP到低功耗精準(zhǔn)定時(shí))
簡(jiǎn)介本資源面向嵌入式開發(fā)工程師及瑞薩RA2L1初學(xué)者聚焦超低功耗MCU上AGTAdvanced General Timer定時(shí)器的FSP庫(kù)驅(qū)動(dòng)實(shí)現(xiàn)解決e2 studio環(huán)境下定時(shí)器配置、中斷響應(yīng)與PWM/間隔定時(shí)等核心功能落地難題適用于IoT傳感器節(jié)點(diǎn)、便攜設(shè)備等實(shí)時(shí)控制場(chǎng)景。壓縮包共31個(gè)文件含4個(gè)C源文件如hal_entry.c、agt驅(qū)動(dòng)主體、3個(gè)頭文件含AGT HAL接口定義、5個(gè)XML配置文件含clock、pin、API等系統(tǒng)級(jí)配置、9個(gè)prefs偏好設(shè)置及鏈接腳本fsp.ld、調(diào)試啟動(dòng)文件.launch、.jlink等完整覆蓋FSP工程初始化、AGT通道配置、中斷服務(wù)注冊(cè)與調(diào)試部署全流程包體僅48KB輕量但結(jié)構(gòu)完備。已有184人學(xué)習(xí)下載提供可直接編譯運(yùn)行的最小可行例程28_AGT_Basic_Timing包含引腳配置pincfg、時(shí)鐘樹設(shè)定、AGT基礎(chǔ)計(jì)時(shí)邏輯及LED反饋驗(yàn)證助讀者快速掌握RA2L1定時(shí)器驅(qū)動(dòng)開發(fā)范式。1. 項(xiàng)目概述為什么是RA2L1與AGT定時(shí)器最近在做一個(gè)低功耗的便攜式數(shù)據(jù)采集設(shè)備主控選型時(shí)瑞薩電子的RA2L1系列單片機(jī)進(jìn)入了我的視野。這顆基于Arm? Cortex?-M23內(nèi)核的MCU在低功耗和模擬性能上表現(xiàn)相當(dāng)亮眼特別適合電池供電的場(chǎng)景。在項(xiàng)目里我需要一個(gè)精準(zhǔn)且靈活的定時(shí)器來(lái)管理采樣周期和系統(tǒng)心跳這時(shí)候RA2L1內(nèi)置的異步通用定時(shí)器Asynchronous General-purpose Timer 簡(jiǎn)稱AGT就成了我的首選。不同于常見的SysTick或通用定時(shí)器AGT可以獨(dú)立于系統(tǒng)主時(shí)鐘運(yùn)行使用低速內(nèi)部或外部時(shí)鐘源這意味著即使在深度睡眠模式下它也能持續(xù)工作為喚醒或周期性任務(wù)提供動(dòng)力這對(duì)于榨干電池最后一滴電至關(guān)重要。然而當(dāng)我打開瑞薩官方的靈活配置軟件包FSP和e2 studio集成開發(fā)環(huán)境時(shí)發(fā)現(xiàn)雖然FSP提供了圖形化配置工具極大簡(jiǎn)化了外設(shè)初始化但關(guān)于AGT的一些高級(jí)應(yīng)用和底層細(xì)節(jié)官方文檔和例程往往一筆帶過(guò)。比如如何精準(zhǔn)計(jì)算并設(shè)置分頻和周期值以實(shí)現(xiàn)特定微秒級(jí)延時(shí)如何優(yōu)雅地處理定時(shí)器溢出與中斷的配合以及在e2 studio這個(gè)基于Eclipse的IDE里如何高效地調(diào)試定時(shí)器相關(guān)代碼這些實(shí)戰(zhàn)中的“坑”恰恰是項(xiàng)目成敗的關(guān)鍵。因此我決定結(jié)合這次項(xiàng)目實(shí)踐把從零開始配置、驅(qū)動(dòng)到調(diào)試AGT定時(shí)器的完整過(guò)程梳理出來(lái)重點(diǎn)分享那些在數(shù)據(jù)手冊(cè)里找不到的實(shí)操經(jīng)驗(yàn)和避坑指南希望能給正在或即將使用RA2L1和FSP的朋友們一個(gè)清晰的參考。2. 開發(fā)環(huán)境與工程創(chuàng)建要點(diǎn)2.1 e2 studio與FSP配置初探瑞薩的e2 studio本質(zhì)是一個(gè)高度定制化的Eclipse IDE其核心魅力在于無(wú)縫集成了FSP。FSP不是一個(gè)簡(jiǎn)單的HAL庫(kù)它包含了硬件抽象層HAL、中間件以及一個(gè)強(qiáng)大的圖形化配置編輯器。我們的第一步就是在e2 studio中創(chuàng)建一個(gè)新的“Renesas RA C/C Project”。在項(xiàng)目類型選擇時(shí)我強(qiáng)烈建議選擇“Flat (Non-TrustZone) Project”除非你的項(xiàng)目涉及安全啟動(dòng)需求。創(chuàng)建過(guò)程中最關(guān)鍵的一步是選擇FSP的版本和板級(jí)支持包BSP。務(wù)必確保BSP版本與你的實(shí)際硬件評(píng)估板或自定義板匹配否則底層引腳映射和時(shí)鐘樹可能會(huì)出錯(cuò)。工程創(chuàng)建完成后不要急著寫代碼。首先雙擊項(xiàng)目資源管理器中的“configuration.xml”文件這會(huì)打開FSP的配置界面。在這里你可以可視化地配置時(shí)鐘、引腳、外設(shè)堆棧等所有配置會(huì)實(shí)時(shí)生成對(duì)應(yīng)的代碼在src目錄下的hal_data.c和hal_data.h中。對(duì)于新手來(lái)說(shuō)這個(gè)圖形化工具能極大降低入門門檻但切記它生成的代碼是“骨架”我們?nèi)孕柙趹?yīng)用層添加“血肉”。2.2 時(shí)鐘樹配置AGT的脈搏來(lái)源AGT定時(shí)器的精度和靈活性根植于正確的時(shí)鐘源配置。在FSP配置界面的“Clocks”標(biāo)簽頁(yè)下我們需要重點(diǎn)關(guān)注兩部分系統(tǒng)主時(shí)鐘和AGT的時(shí)鐘源。系統(tǒng)主時(shí)鐘通常由內(nèi)部高速振蕩器HOCO或外部晶體振蕩器提供這決定了CPU的執(zhí)行速度。而AGT作為異步定時(shí)器其時(shí)鐘源可以獨(dú)立選擇。在“Operating Clock Settings”中找到“AGTx”的時(shí)鐘源選項(xiàng)。常見的選擇有LOCO (Low-Speed On-Chip Oscillator)典型頻率為32.768 kHz或15kHz具體看芯片型號(hào)。功耗極低精度也較低適用于對(duì)時(shí)間精度要求不高但需要極低功耗待機(jī)的場(chǎng)景比如RTC喚醒。子時(shí)鐘Subclock通常指外部連接的32.768 kHz晶體。精度高功耗低是實(shí)時(shí)時(shí)鐘和精準(zhǔn)定時(shí)任務(wù)的理想選擇。PCLKB這是由系統(tǒng)主時(shí)鐘分頻而來(lái)的外設(shè)時(shí)鐘。如果你需要AGT產(chǎn)生與系統(tǒng)主頻相關(guān)的高頻定時(shí)例如產(chǎn)生PWM可以選擇此源。但注意當(dāng)CPU進(jìn)入某些低功耗模式時(shí)PCLKB可能會(huì)停止導(dǎo)致AGT停止。在我的數(shù)據(jù)采集項(xiàng)目中我需要一個(gè)1ms的系統(tǒng)心跳用于任務(wù)調(diào)度同時(shí)設(shè)備大部分時(shí)間處于睡眠模式。因此我選擇了**子時(shí)鐘32.768 kHz外部晶體**作為AGT0的時(shí)鐘源。這樣即使主CPU深度睡眠AGT0依然可以依靠這顆精準(zhǔn)的低速晶體持續(xù)計(jì)時(shí)并在1ms到達(dá)時(shí)產(chǎn)生中斷喚醒CPU。配置時(shí)鐘時(shí)有個(gè)細(xì)節(jié)在“Clock Source”中選擇“Subclock”后務(wù)必在“Pins”配置頁(yè)中確認(rèn)用于連接外部晶體的引腳通常是P103/P104已被正確配置為“XTAL”功能。這個(gè)疏忽會(huì)導(dǎo)致時(shí)鐘不起振AGT根本無(wú)法工作。3. AGT定時(shí)器驅(qū)動(dòng)核心實(shí)現(xiàn)解析3.1 FSP堆棧添加與參數(shù)詳解回到FSP配置界面在“Stacks”標(biāo)簽頁(yè)中點(diǎn)擊“New Stack” - “Timers” - “Timer General PWM (r_agt)”。這會(huì)為我們的工程添加AGT的驅(qū)動(dòng)堆棧。添加后重命名堆棧實(shí)例為易懂的名字例如g_timer0_agt。雙擊這個(gè)堆棧實(shí)例進(jìn)入其屬性配置這里面的每一個(gè)參數(shù)都直接影響定時(shí)器的行為General Settings:Channel: 選擇具體的AGT通道如AGT0。RA2L1通常有多個(gè)AGT通道注意不要沖突。Mode: 這是核心。Periodic模式用于產(chǎn)生固定周期的中斷One Shot模式只產(chǎn)生一次中斷PWM模式用于輸出脈寬調(diào)制信號(hào)。我們選擇Periodic。Period Unit: 周期單位。可選Periods周期數(shù)或Microseconds微秒。這里有個(gè)大坑如果你選MicrosecondsFSP會(huì)根據(jù)你配置的時(shí)鐘源頻率自動(dòng)計(jì)算計(jì)數(shù)器的裝載值。這很方便但當(dāng)你需要非常精確的微秒級(jí)延時(shí)或者時(shí)鐘源頻率不是整數(shù)時(shí)例如標(biāo)準(zhǔn)的32.768kHz自動(dòng)計(jì)算可能會(huì)引入舍入誤差。對(duì)于高精度需求我建議選擇Periods然后手動(dòng)計(jì)算。Period: 周期值。如果單位是Periods這個(gè)值直接就是定時(shí)器計(jì)數(shù)器的重載值如果是Microseconds則填寫你需要的周期時(shí)間。Interrupts:務(wù)必勾選“Period Interrupt”。這就是定時(shí)器周期到達(dá)時(shí)觸發(fā)的中斷?!癈allback”可以填寫一個(gè)函數(shù)名例如agt0_period_callback。當(dāng)中斷發(fā)生時(shí)FSP的中斷服務(wù)程序ISR會(huì)自動(dòng)調(diào)用這個(gè)回調(diào)函數(shù)。記住這個(gè)回調(diào)函數(shù)在中斷上下文中執(zhí)行必須快速、簡(jiǎn)潔Advanced Settings:Clock Source: 這里會(huì)顯示我們?cè)跁r(shí)鐘樹中為AGT選擇的源確認(rèn)無(wú)誤即可。Count Source: 通常選擇“Internal clock”即使用上述時(shí)鐘源。Divider: 分頻器。這是實(shí)現(xiàn)長(zhǎng)定時(shí)的關(guān)鍵。AGT的時(shí)鐘源會(huì)先經(jīng)過(guò)這個(gè)分頻器/1 /2 /4 ... /1024 /4096等再驅(qū)動(dòng)計(jì)數(shù)器。例如32.768kHz的時(shí)鐘經(jīng)過(guò)1024分頻后實(shí)際計(jì)數(shù)頻率變?yōu)?2Hz這樣每個(gè)計(jì)數(shù)周期就是約31.25ms配合16位計(jì)數(shù)器可以實(shí)現(xiàn)更長(zhǎng)的定時(shí)周期。配置完成后點(diǎn)擊“Generate Project Content”FSP就會(huì)在src目錄下生成hal_data.c/h其中包含了g_timer0_agt這個(gè)定時(shí)器實(shí)例的所有配置結(jié)構(gòu)體。3.2 定時(shí)器周期的手動(dòng)計(jì)算與配置如前所述為了追求最高精度我放棄了“Microseconds”的自動(dòng)計(jì)算選擇“Periods”并手動(dòng)計(jì)算重載值。計(jì)算原理很簡(jiǎn)單定時(shí)周期 (秒) (分頻系數(shù) / 時(shí)鐘源頻率 (Hz)) * (計(jì)數(shù)器重載值 1)為什么是重載值1因?yàn)锳GT是向下計(jì)數(shù)器從重載值開始計(jì)數(shù)到0產(chǎn)生中斷所以完整的計(jì)數(shù)周期是重載值1個(gè)時(shí)鐘節(jié)拍。我的需求是1ms心跳時(shí)鐘源是子時(shí)鐘32.768 kHz (32768 Hz)。首先嘗試不分頻周期 (1 / 32768) * (重載值 1) 0.001秒。計(jì)算得重載值 32768 * 0.001 - 1 31.768。這不是整數(shù)無(wú)法直接設(shè)置。因此需要引入分頻。目標(biāo)是讓(時(shí)鐘源頻率 / 分頻系數(shù))的結(jié)果是一個(gè)能整除10001ms1000us的整數(shù)或者讓重載值接近一個(gè)整數(shù)。嘗試分頻系數(shù)為8計(jì)數(shù)頻率 32768 / 8 4096 Hz。周期 (1 / 4096) * (重載值 1) 0.001。計(jì)算得重載值 4.096 - 1 3.096。仍然不是整數(shù)。嘗試分頻系數(shù)為64計(jì)數(shù)頻率 32768 / 64 512 Hz。重載值 512 * 0.001 - 1 -0.488無(wú)效。換個(gè)思路我們不追求絕對(duì)的1.000ms而是計(jì)算一個(gè)最接近的、可實(shí)現(xiàn)的周期。選擇分頻系數(shù)為1不分頻每個(gè)計(jì)數(shù)節(jié)拍周期 1 / 32768 ≈ 30.518 us。要產(chǎn)生大約1ms的周期需要的計(jì)數(shù)節(jié)拍數(shù) 0.001 / (1/32768) 32.768。取整設(shè)置重載值 32。實(shí)際周期 (32 1) / 32768 ≈ 1.007 ms。這個(gè)誤差0.7%對(duì)于我的任務(wù)調(diào)度來(lái)說(shuō)是完全可以接受的。因此在FSP配置中我設(shè)置Divider為1Period Unit為PeriodsPeriod值為32。在代碼中我們也可以動(dòng)態(tài)修改這個(gè)重載值來(lái)調(diào)整周期。3.3 驅(qū)動(dòng)代碼的編寫與中斷處理FSP生成了配置但驅(qū)動(dòng)定時(shí)器啟動(dòng)、停止以及處理中斷回調(diào)還需要我們編寫應(yīng)用代碼。首先在hal_entry.c或你的主應(yīng)用文件中包含必要的頭文件#include “hal_data.h”然后在初始化階段例如hal_entry()函數(shù)開頭打開定時(shí)器驅(qū)動(dòng)。這個(gè)操作會(huì)初始化硬件并注冊(cè)中斷/* 打開AGT定時(shí)器 */ fsp_err_t err g_timer0_agt.p_api-open(g_timer0_agt.p_ctrl g_timer0_agt.p_cfg); if (FSP_SUCCESS ! err) { /* 錯(cuò)誤處理 */ }接下來(lái)啟動(dòng)定時(shí)器使其開始計(jì)數(shù)err g_timer0_agt.p_api-start(g_timer0_agt.p_ctrl); if (FSP_SUCCESS ! err) { /* 錯(cuò)誤處理 */ }最重要的部分是中斷回調(diào)函數(shù)的實(shí)現(xiàn)。這個(gè)函數(shù)需要在FSP配置時(shí)指定的名字如agt0_period_callback并且有固定的參數(shù)簽名。我們?cè)趆al_entry.c或其他全局可見的文件中定義它/* AGT0周期中斷回調(diào)函數(shù) */ void agt0_period_callback(timer_callback_args_t *p_args) { FSP_PARAMETER_NOT_USED(p_args); // 防止編譯器警告未使用參數(shù) /* 用戶代碼區(qū) */ /* 1. 執(zhí)行快速操作例如翻轉(zhuǎn)一個(gè)測(cè)試引腳電平、設(shè)置軟件標(biāo)志位 */ // io_level_t level ...; // R_IOPORT_PinWrite(g_ioport_ctrl BSP_IO_PORT_XX_PIN_XX level); /* 2. 更常見的做法是設(shè)置一個(gè) volatile 全局變量作為標(biāo)志 */ g_agt0_tick_flag 1; /* 絕對(duì)避免在此處進(jìn)行耗時(shí)操作如打印、復(fù)雜計(jì)算、等待等 */ }在中斷回調(diào)中我強(qiáng)烈建議只做設(shè)置標(biāo)志位這一件事。所有基于此定時(shí)器的業(yè)務(wù)邏輯如任務(wù)調(diào)度、數(shù)據(jù)采集觸發(fā)都應(yīng)該在主循環(huán)中通過(guò)檢查這個(gè)標(biāo)志位來(lái)執(zhí)行。這就是典型的中斷輪詢架構(gòu)能保證系統(tǒng)的實(shí)時(shí)性和穩(wěn)定性。主循環(huán)中while (1) { if (1 g_agt0_tick_flag) { g_agt0_tick_flag 0; // 清除標(biāo)志 // 執(zhí)行你的1ms任務(wù)例如簡(jiǎn)單的任務(wù)調(diào)度器 system_1ms_task(); } // 其他低優(yōu)先級(jí)任務(wù)或休眠 R_BSP_SoftwareDelay(10 BSP_DELAY_UNITS_MILLISECONDS); // 示例延時(shí) // 或者進(jìn)入低功耗模式: R_BSP_SoftwareDelay() 會(huì)阻塞實(shí)際項(xiàng)目可能用空閑任務(wù)或休眠 }4. 調(diào)試技巧與常見問(wèn)題排查4.1 調(diào)試手段從IO口到邏輯分析儀在e2 studio中調(diào)試嵌入式程序最直接的方法是使用ITMInstrumentation Trace Macrocell進(jìn)行printf輸出到調(diào)試器控制臺(tái)。但這需要配置SWO引腳并且輸出信息本身有延遲不適合調(diào)試高頻或精確的定時(shí)行為。對(duì)于定時(shí)器調(diào)試我更依賴硬件IO口和邏輯分析儀。IO口調(diào)試法在定時(shí)器中斷回調(diào)函數(shù)里快速翻轉(zhuǎn)一個(gè)空閑的GPIO引腳電平。void agt0_period_callback(timer_callback_args_t *p_args) { FSP_PARAMETER_NOT_USED(p_args); static io_level_t level BSP_IO_LEVEL_LOW; level (level BSP_IO_LEVEL_LOW) ? BSP_IO_LEVEL_HIGH : BSP_IO_LEVEL_LOW; R_IOPORT_PinWrite(g_ioport_ctrl BSP_IO_PORT_01_PIN_05 level); // 翻轉(zhuǎn)P105 }然后用示波器或邏輯分析儀探頭連接這個(gè)引腳你就能直觀地看到定時(shí)器中斷是否發(fā)生、周期是否準(zhǔn)確、有無(wú)丟失。波形占空比應(yīng)該是50%如果只在中斷里翻轉(zhuǎn)一次周期就是你設(shè)定的定時(shí)周期。這是驗(yàn)證定時(shí)器是否正常工作的“金標(biāo)準(zhǔn)”。e2 studio調(diào)試器在調(diào)試模式下可以查看AGT的寄存器值在“Registers”視圖中搜索“AGT”特別是計(jì)數(shù)器當(dāng)前值寄存器AGT_CNT和控制狀態(tài)寄存器AGT_CS。單步執(zhí)行時(shí)觀察這些寄存器的變化有助于理解定時(shí)器的工作流程。你還可以在中斷回調(diào)函數(shù)入口設(shè)置斷點(diǎn)但注意斷點(diǎn)會(huì)嚴(yán)重干擾定時(shí)只用于驗(yàn)證中斷能否進(jìn)入。4.2 常見問(wèn)題與解決方案實(shí)錄以下是我在項(xiàng)目實(shí)踐中踩過(guò)的坑和解決方案問(wèn)題1定時(shí)器中斷根本不觸發(fā)。檢查清單時(shí)鐘源確認(rèn)AGT的時(shí)鐘源如子時(shí)鐘已使能且在運(yùn)行。用IO口翻轉(zhuǎn)法檢查主時(shí)鐘是否運(yùn)行正常。引腳配置如果使用外部晶體確認(rèn)XTAL引腳配置正確且硬件連接無(wú)誤晶體、負(fù)載電容。FSP配置確認(rèn)定時(shí)器堆棧已添加模式為Periodic中斷已勾選回調(diào)函數(shù)名拼寫正確。驅(qū)動(dòng)API調(diào)用確認(rèn)代碼中成功執(zhí)行了open()和start()并且沒有返回錯(cuò)誤。中斷優(yōu)先級(jí)雖然AGT中斷默認(rèn)優(yōu)先級(jí)但也要檢查是否被其他更高優(yōu)先級(jí)中斷長(zhǎng)時(shí)間阻塞??梢栽谥袛嗷卣{(diào)里先翻轉(zhuǎn)IO口測(cè)試。全局中斷使能確保在main()函數(shù)初始化后有調(diào)用類似__enable_irq()或FSP的相關(guān)函數(shù)來(lái)開啟全局中斷。問(wèn)題2定時(shí)周期不準(zhǔn)確偏差很大。原因與解決時(shí)鐘精度LOCO的精度可能偏差±20%以上這是硬件特性。對(duì)精度有要求必須使用外部晶體子時(shí)鐘。計(jì)算錯(cuò)誤回顧3.2節(jié)的計(jì)算公式檢查分頻系數(shù)和重載值設(shè)置。特別注意重載值1這個(gè)細(xì)節(jié)。中斷延遲中斷響應(yīng)、現(xiàn)場(chǎng)保護(hù)/恢復(fù)、回調(diào)函數(shù)執(zhí)行都需要時(shí)間。如果回調(diào)函數(shù)本身執(zhí)行時(shí)間過(guò)長(zhǎng)比如超過(guò)定時(shí)周期的10%就會(huì)顯著影響周期性。務(wù)必優(yōu)化回調(diào)函數(shù)使其盡可能短小。系統(tǒng)負(fù)載如果主程序中有長(zhǎng)時(shí)間關(guān)中斷的操作或者有其他更高優(yōu)先級(jí)中斷頻繁發(fā)生會(huì)延遲AGT中斷的響應(yīng)。檢查系統(tǒng)中斷負(fù)載。問(wèn)題3進(jìn)入低功耗模式后定時(shí)器停了。原因你選擇的AGT時(shí)鐘源在芯片進(jìn)入特定低功耗模式如Sleep Software Standby時(shí)被關(guān)閉了。解決確認(rèn)芯片數(shù)據(jù)手冊(cè)中關(guān)于低功耗模式與時(shí)鐘源關(guān)系的描述。確保AGT使用的時(shí)鐘源如子時(shí)鐘在你將要進(jìn)入的低功耗模式下是保持運(yùn)行的。對(duì)于RA2L1子時(shí)鐘在Software Standby模式下通??梢酝ㄟ^(guò)配置保持運(yùn)行作為低速片上振蕩器LSC的源。在進(jìn)入低功耗前確保AGT定時(shí)器已啟動(dòng)并運(yùn)行。在FSP的“BSP”屬性中的“RA Common”下配置好低功耗模式并確保AGT中斷能作為喚醒源。問(wèn)題4想動(dòng)態(tài)改變定時(shí)周期怎么辦FSP的AGT驅(qū)動(dòng)提供了periodSet()函數(shù)。你可以在任何時(shí)候包括中斷回調(diào)中調(diào)用它來(lái)修改周期。但要注意修改操作可能需要定時(shí)器處于停止?fàn)顟B(tài)或者驅(qū)動(dòng)會(huì)在內(nèi)部處理同步。最安全的方法是在中斷回調(diào)中設(shè)置一個(gè)標(biāo)志在主循環(huán)中停止定時(shí)器-設(shè)置新周期-重啟定時(shí)器。// 假設(shè)在某個(gè)地方需要修改周期 fsp_err_t err g_timer0_agt.p_api-stop(g_timer0_agt.p_ctrl); // 檢查錯(cuò)誤... err g_timer0_agt.p_api-periodSet(g_timer0_agt.p_ctrl new_period_counts); // 檢查錯(cuò)誤... err g_timer0_agt.p_api-start(g_timer0_agt.p_ctrl); // 檢查錯(cuò)誤...調(diào)試是一個(gè)系統(tǒng)性工程從時(shí)鐘樹到引腳從配置到代碼再到硬件測(cè)量層層遞進(jìn)。掌握IO口翻轉(zhuǎn)邏輯分析儀這個(gè)組合能幫你解決80%以上的外設(shè)驅(qū)動(dòng)問(wèn)題。最后養(yǎng)成閱讀官方數(shù)據(jù)手冊(cè)Datasheet和硬件手冊(cè)Hardware Manual的習(xí)慣FSP圖形化工具雖好但底層寄存器的知識(shí)能讓你在遇到疑難雜癥時(shí)心中有數(shù)。本文還有配套的精品資源點(diǎn)擊獲取