[i=s] 本帖最后由 shanyuxiang 于 2025-8-31 18:38 编辑 [/i]
APM32F402和APM32E030的IO翻转速度对比测试
APM32F402和APM32E030作为极海今年新出的MCU系列,价格都非常友好,可以用IO来模拟一些非标准的时序。
能否模拟时序很关键的一点就是IO的翻转速度,下面我们实际测试一下。
首先看看两款芯片的基本参数。
APM32F402系列:
- Arm Cortex-M4F
- 工作主频120MHz
APM32E030系列:
1. APM32E030的测试代码
为了尽可能测出最高IO翻转速度,翻转代码用寄存器方式,不能用库方式。
为了方便观测,需要翻转多次,但是不能直接用循环实现多次翻转,因为循环的判断也需要指令,会导致实测的翻转速度偏低。
为了避免其他指令的影响,这里把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;
}
}
2. 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;
}
}
3. 实际测试
为了方便对比,统一把编译优化等级设为最高 O3 ,APM32下载程序到开发板执行,用示波器观察测量频率。
APM32E030以72M主频执行,根据测试波形,可看出翻转频率约为17.99MHz:

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

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

汇总一下测试结果。
芯片 |
主频 |
翻转速度 |
APM32E030RB |
72MHz |
17.99MHz |
APM32F402RB |
72MHz |
18.12MHz |
APM32F402RB |
120MHz |
30.12MHz |
在相同主频下Cortex-M0的E030的IO翻转速度和Cortex-M4的F402差不多,
得益于更高的主频,APM32F402RB的IO翻转速度达到了30M。
附件:APM32F402_403_SDK_V1.0.2_io_speed.rar
附件:APM32E030_SDK_V1.0.3_io_speed.rar