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

[复制链接]
1458|7
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 | 显示全部楼层
学习了,改天也学着测测其他单片机
GalaxyStroll 发表于 2025-9-4 20:35 | 显示全部楼层
翻转速率和主频相关,还和什么相关呀
ShadowDance 发表于 2025-9-6 12:00 | 显示全部楼层
谢谢楼主的分享。
省得自己做实验测试了。
 楼主| shanyuxiang 发表于 2025-9-6 13:20 | 显示全部楼层
GalaxyStroll 发表于 2025-9-4 20:35
翻转速率和主频相关,还和什么相关呀

和电气性能也有关,频率高了波形会有畸变,不过一般电气性能频率比这个实际翻转的高;
和GPIO的总线频率也有关,总线频率一般是主频的分频,比主频低。
幻影书记 发表于 2025-9-8 14:20 | 显示全部楼层
谢谢楼主的分享
虽然平时几乎不使用GPIO翻转来实现协议,但用到的话,还要参考楼主的方案
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

50

帖子

1

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