Geehy极海半导体

当前位置:主页 > 服务支持 > 常见问题 > Geehy极海半导体 >

极海APM32F402与APM32E030——IO翻转速度实测

作者: admin 时间:2025-09-26 来源:未知
摘要:在嵌入式系统设计中,尤其是在模拟非标准通信时序(如红外、WS2812B灯带等)的应用场景下,微控制器(MCU)的GPIO翻转速度是决定其控制精度的关键性能指标。 极海 新近推出的APM32F402与...

  在嵌入式系统设计中,尤其是在模拟非标准通信时序(如红外、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。

[向上]