[新品上市] APM32F402和APM32E030的IO翻转速度对比测试

[复制链接]
629|3
shanyuxiang 发表于 2025-8-31 18:30 | 显示全部楼层 |阅读模式
[i=s] 本帖最后由 shanyuxiang 于 2025-8-31 18:38 编辑 [/i]

APM32F402和APM32E030的IO翻转速度对比测试

APM32F402和APM32E030作为极海今年新出的MCU系列,价格都非常友好,可以用IO来模拟一些非标准的时序。

能否模拟时序很关键的一点就是IO的翻转速度,下面我们实际测试一下。

首先看看两款芯片的基本参数。

APM32F402系列:

  • Arm Cortex-M4F
  • 工作主频120MHz

APM32E030系列:

  • Arm Cortex-M0+
  • 工作主频72MHz

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:

1apm32e03072m.jpg

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

2apm32f40272m.jpg

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

3apm32f402120m.jpg

汇总一下测试结果。

芯片 主频 翻转速度
APM32E030RB 72MHz 17.99MHz
APM32F402RB 72MHz 18.12MHz
APM32F402RB 120MHz 30.12MHz

在相同主频下Cortex-M0的E030的IO翻转速度和Cortex-M4的F402差不多,

得益于更高的主频,APM32F402RB的IO翻转速度达到了30M。

upload 附件:APM32F402_403_SDK_V1.0.2_io_speed.rar

upload 附件:APM32E030_SDK_V1.0.3_io_speed.rar

风暴之眸 发表于 2025-8-31 18:59 | 显示全部楼层
这个速度还是蛮快的。
dffzh 发表于 2025-9-2 08:49 | 显示全部楼层
对比测试,结果明显,感谢分享。
小涛DZGZS 发表于 2025-9-2 09:56 | 显示全部楼层
学习了,改天也学着测测其他单片机
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

43

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部