在嵌入式系統(tǒng)設(shè)計(jì)中,尤其是在模擬非標(biāo)準(zhǔn)通信時(shí)序(如紅外、WS2812B燈帶等)的應(yīng)用場(chǎng)景下,微控制器(MCU)的GPIO翻轉(zhuǎn)速度是決定其控制精度的關(guān)鍵性能指標(biāo)。極海新近推出的APM32F402與APM32E030兩款經(jīng)濟(jì)適用型MCU,以其優(yōu)異的性?xún)r(jià)比獲得了市場(chǎng)的廣泛關(guān)注。本文將聚焦于其IO端口極限操作速度的實(shí)測(cè)分析,為選型提供數(shù)據(jù)參考。
要準(zhǔn)確評(píng)估IO翻轉(zhuǎn)能力,核心在于排除一切非必要指令開(kāi)銷(xiāo),直接測(cè)量電平變化的最小時(shí)間間隔。為此,我們首先了解兩款芯片的基礎(chǔ)性能參數(shù):
APM32F402系列:搭載Arm®Cortex®-M4F內(nèi)核,最高工作主頻達(dá)120MHz,具備較高的運(yùn)算效率和處理性能。
APM32E030系列:采用Arm®Cortex®-M0+內(nèi)核,最高工作主頻為72MHz,以高性?xún)r(jià)比和低功耗為主要特點(diǎn)。
一、APM32E030極限速度測(cè)試
為逼近IO翻轉(zhuǎn)的理論極限,測(cè)試代碼需遵循以下原則:
采用寄存器級(jí)直接操作:摒棄硬件抽象層(HAL)或標(biāo)準(zhǔn)庫(kù)等封裝函數(shù),直接讀寫(xiě)GPIO輸出數(shù)據(jù)寄存器(ODR或BSRR),以消除函數(shù)調(diào)用帶來(lái)的額外周期消耗。
消除循環(huán)判斷開(kāi)銷(xiāo):若使用循環(huán)結(jié)構(gòu)執(zhí)行多次翻轉(zhuǎn),其間的跳轉(zhuǎn)與條件判斷指令會(huì)顯著拉低平均翻轉(zhuǎn)頻率。為實(shí)現(xiàn)最精確的測(cè)量,我們將單次翻轉(zhuǎn)的匯編指令進(jìn)行多次物理復(fù)制,確保測(cè)試波形由連續(xù)、無(wú)間隔的IO操作指令產(chǎn)生。
int main(void)
{
GPIO_Config_T gpioConfig;
TEST_PeriphClockEnable;
/* GPIO configuration */
gpioConfig.pin = TEST_PIN;
gpioConfig.mode = GPIO_MODE_OUT;
gpioConfig.outtype = GPIO_OUT_TYPE_PP;
gpioConfig.speed = GPIO_SPEED_50MHz;
gpioConfig.pupd = GPIO_PUPD_NO;
GPIO_Config(TEST_GPIO, &gpioConfig);
for (;;)
{
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BR = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BR = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BR = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BR = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BR = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BR = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BR = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BR = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BR = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BR = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BR = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BR = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BR = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BR = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BR = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BR = (uint32_t)TEST_PIN;
}
}
二、APM32F402的極限速度測(cè)試
APM32F402的測(cè)試代碼和APM32E030大相徑庭,注意:需改一下GPIO的初始化配置;BR寄存器改為BC。
int main(void)
{
TEST_PeriphClockEnable;
GPIO_Config_T GPIO_ConfigStruct = {0U};
GPIO_ConfigStruct.pin = TEST_PIN;
GPIO_ConfigStruct.mode = GPIO_MODE_OUT_PP;
GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
GPIO_Config(TEST_GPIO, &GPIO_ConfigStruct);
for (;;)
{
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BC = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BC = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BC = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BC = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BC = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BC = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BC = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BC = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BC = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BC = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BC = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BC = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BC = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BC = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BC = (uint32_t)TEST_PIN;
TEST_GPIO->BSC = (uint32_t)TEST_PIN;
TEST_GPIO->BC = (uint32_t)TEST_PIN;
}
}
三、測(cè)試結(jié)果
以下為了方便對(duì)比,統(tǒng)一把編譯優(yōu)化等級(jí)設(shè)置為最高O3,APM32下載程序到開(kāi)發(fā)板執(zhí)行,用示波器觀察測(cè)量頻率:
APM32E030以72M主頻執(zhí)行,根據(jù)測(cè)試波形,可看出翻轉(zhuǎn)頻率約為17.99MHz:

APM32F402以72M主頻執(zhí)行,根據(jù)測(cè)試波形,可看出翻轉(zhuǎn)頻率約為18.12MHz:

APM32F402以120M主頻執(zhí)行,根據(jù)測(cè)試波形,可看出翻轉(zhuǎn)頻率約為30.12MHz:

總結(jié):若在相同主頻下Cortex-M0的APM32E030的IO翻轉(zhuǎn)速度和Cortex-M4的APM32F402差不多,得益于更高的主頻,APM32F402RB的IO翻轉(zhuǎn)速度達(dá)到了30M。如需了解更多,極海代理商聯(lián)科芯微電子將竭誠(chéng)為您提供提供極海全系列開(kāi)發(fā)資料。聯(lián)系電話:15994707769,LEO WANG。
