APM32F402和APM32E030作为极海今年新出的MCU系列,价格都非常友好,可以用IO来模拟一些非标准的时序。
能否模拟时序很关键的一点就是IO的翻转速度,下面我们实际测试一下。
首先看看两款芯片的基本参数。
APM32F402系列:
Arm Cortex-M4F
工作主频120MHz
APM32E030系列:
Arm Cortex-M0+
工作主频72MHz
为了尽可能测出最高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。