在嵌入式系统设计中,尤其是在模拟非标准通信时序(如红外、WS2812B灯带等)的应用场景下,微控制器(MCU)的GPIO翻转速度是决定其控制精度的关键性能指标。极海新近推出的APM32F402与APM32E030两款经济适用型MCU,以其优异的性价比获得了市场的广泛关注。本文将聚焦于其IO端口极限操作速度的实测分析,为选型提供数据参考。
要准确评估IO翻转能力,核心在于排除一切非必要指令开销,直接测量电平变化的最小时间间隔。为此,我们首先了解两款芯片的基础性能参数:
APM32F402系列:搭载Arm®Cortex®-M4F内核,最高工作主频达120MHz,具备较高的运算效率和处理性能。
APM32E030系列:采用Arm®Cortex®-M0+内核,最高工作主频为72MHz,以高性价比和低功耗为主要特点。
一、APM32E030极限速度测试
为逼近IO翻转的理论极限,测试代码需遵循以下原则:
采用寄存器级直接操作:摒弃硬件抽象层(HAL)或标准库等封装函数,直接读写GPIO输出数据寄存器(ODR或BSRR),以消除函数调用带来的额外周期消耗。
消除循环判断开销:若使用循环结构执行多次翻转,其间的跳转与条件判断指令会显著拉低平均翻转频率。为实现最精确的测量,我们将单次翻转的汇编指令进行多次物理复制,确保测试波形由连续、无间隔的IO操作指令产生。
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的极限速度测试
APM32F402的测试代码和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;
}
}
三、测试结果
以下为了方便对比,统一把编译优化等级设置为最高O3,APM32下载程序到开发板执行,用示波器观察测量频率:
APM32E030以72M主频执行,根据测试波形,可看出翻转频率约为17.99MHz:

APM32F402以72M主频执行,根据测试波形,可看出翻转频率约为18.12MHz:

APM32F402以120M主频执行,根据测试波形,可看出翻转频率约为30.12MHz:

总结:若在相同主频下Cortex-M0的APM32E030的IO翻转速度和Cortex-M4的APM32F402差不多,得益于更高的主频,APM32F402RB的IO翻转速度达到了30M。如需了解更多,极海代理商联科芯微电子将竭诚为您提供提供极海全系列开发资料。联系电话:15994707769,LEO WANG。