NUCLEO-F412ZG测评:RAM和FLASH速率 早有耳闻STM32家族MCU在FLASH中执行代码的速率比在RAM中执行快。由于其他厂商的MCU大多是代码在RAM中执行的速率比在FLASH中快。抱着疑问,基于STM32F412的NUCLEO板做了这个简单的测试。
测试方法: 首先让代码加载到RAM中执行,在主函数中while(1)循环翻转GPIO,通过示波器检查GPIO的翻转速率;然后再通过修改分散加载文件,把代码加载到FALSH中执行,通过示波器检查GPIO的翻转速率。 实验现象: ①代码在RAM中执行: 通过分散加载文件把代码加载到RAM中执行。
把代码加载到RAM中的分散加载文件
通过.map观看代码把加载到RAM中的具体位置。
通过.map文件可看出代码被加载到RAM中执行
通过示波器检测代码在RAM中执行时的GPIO翻转速率。
代码在RAM中执行的GPIO翻转波形
②代码在FLASH中执行: 通过修改分散加载文件把代码加载到FLASH中执行。
把代码加载到FLASH中执行的分散加载文件
通过.map观看代码把加载到FALSH中的具体位置。
代码在FLASH中执行的.MAP文件
通过示波器检测代码在FLASH中执行时的GPIO翻转速率。
代码在FLASH中执行的GPIO翻转波形
误差和限制: 由于受到GPIO外设的限制,GPIO的翻转速率并不代表RAM和FLASH的代码执行速率,但能通过单一变量控制的方法粗略对比出两者的速率大小。GPIO的翻转速率仅代表此次实验的结果,仅供参考。 结果和分析:由以上现象得出,在STM32F412的FLASH中代码执行速率比在RAM中快;STM32F412的GPIO翻转速率(高→低→高)在一般条件下可达2.72MHz。 实验意义: 首先得出在STM32F412中,代码在FLASH中执行的速率比在RAM中快的结论。想要提高代码的执行速率,则应把代码加载到FLASH中执行。据说这与STM32内部的总线仲裁机制有关。 其次,对于100MHz主频的STM32F412来说,代码在RAM中执行的速率对于一般应用尚可接受。对于拥有1M Byte FLASH和256K Byte的STM32F412ZG来说,不对其内存进行充分的利用仿佛有点浪费。如果要拿片内的FLASH来存储用户数据(非代码数据),则可能会遇到擦写片内FLASH与中断产生而使程序跑飞的问题。此情况下用户可通过把代码加载到RAM中执行,解决操作片内FLASH和中断共存的问题。 最后,GPIO口的翻转速率,是用GPIO模拟各种外设通信接口(如SPI,I2C等)的前提保障,以上实测STM32F412ZG的GPIO翻转速率仅供参考,不过相对于本人用过其他某一厂商100MHz的cortex M4来说,STM32F412ZG的GPIO翻转速率还是相对较快的。
注:本实验实验编程环境为keil-MDK5.14开发环境,由之前《NUCLEO-F412ZG测评:UID和RNG(随机数)》的工程代码修改后进行测试。由于程序比较简单,就不贴上来了。如有兴趣可下载《NUCLEO-F412ZG测评:UID和RNG(随机数)》的工程自行修改:https://www.stmcu.org.cn/module/forum/thread-608121-1-1.html
|