
一. 前言 测试 STM32L053 芯片在系统时钟 8Mhz 的情况下,其 GPIO 电平的翻转速度。& [. S+ ~1 l, W& A, I2 i' O 二. 说明 STM32L053 芯片是 M0+的内核,其 GPIO 的外设直接挂在内核上。 , v7 C5 Q' @+ Y/ O, e ![]() 6 f1 G- h4 I: ]- K* C- g, } 三.测试环境 软件环境:IAR 7.20,STM32CubeMX Version 4.3.0,STM32Cube V1.0 硬件环境:STM32L053 Nucleo,MB1136 ; \- y8 W5 Y9 D+ H 四.测试流程" L0 z6 N4 N5 U. A 打开 CubeMX 的软件,点击新建工程,选择与目标硬件板相同的芯片型号,GPIO 口选择 PA5。系统时钟通过内部 HSI 实现 8MHz。如下图: 0 i6 T) F$ V8 `' w) Y) F ![]() 5 {( ]( R% x/ z6 t 点击 OK 按钮,弹出另外一个对话框,选择设置系统时钟 8Mhz。HIS 最终通过 PLL 锁相环输出 8MHz的时钟。 8 k4 R4 V: z% d0 ]% k ![]() B: ?0 D5 I( I6 L 设置 PA5 为普通 IO 口输出模式。 . Y. Q9 ~1 |" G9 S c' Q ![]() 并配置其端口的摆率为 High Speed. 5 D6 z4 W8 [3 I5 j, A 3 {, R( @+ e2 |$ m- d8 V ![]() 2 @0 e( {% S0 Y8 R- B 基本上这里想要的设计完成了,让 cube 生成相应的代码,然后去验证 GPIO 的电平翻转速度。 4 N) I4 ~& v# J( e2 h) k& E& f9 q2 f ![]() 1 c7 h' V- x# {0 i: G 打开项目工程。9 j: C4 |* A/ g5 ] 在 main 函数的 while 循环中,添加 GPIO 口的翻转语句。期望的 GPIO 翻转速率能够达到 4MHz,在系统时钟 8Mhz 的情况下。按照 8Mhz 与 4Mhz 的关系,需要单周期的指令去执行电平的高低切换,显然此时运用调用库函数的方法是不可取的。应该直接操作寄存器。4 ~/ R' \* `7 {# B 按照上述思路,实现方法如下图,用示波器观察 GPIO 口的波形。- z8 a6 ?: l3 |( \! K. m \. g) ?: j; O$ ~ * U8 z: v: q8 t& ?* @ y( o ![]() : @2 m! E( C/ L5 J- d! c 测试发现,只能有 1.005Mhz。' ~! n) K4 T& m `. e 和自己的想法差别很大,究竟怎么回事呢?查看反汇编语句,发现虽然自己是直接对寄存器的操作,但是反汇编却执行了多条语句。 , o# W7 r5 F1 T3 ]" n ![]() ; d3 q) E8 S/ [ 哦,立马查看编译器的优化等级。原来我是设置了代码不优化的。/ P: \* T4 \( ]6 ^6 l6 _ ![]() 1 J" Q1 H( S# q+ D( o+ U3 u3 k0 v$ a 立马更新优化等级,逐个变更,看看各自的对比: 优化等级为 Low 时:和没有优化时的波形一样。 优化等级为 Medium 时:编译器旁边的 Enabled transfomations 的设置保持默认,GPIO 口的翻转速度达到了 4Mhz.7 l% e# E9 X. b' G% \ . \3 k3 T; k7 T4 M6 D 6 B. Z6 c8 i3 _( t ![]() 优化等级为高时,和优化等级为 Medium 的波形一样。 其实,也可以通过反汇编的执行语句看出 GPIO 口的翻转速率。只要执行单周期指令,GPIO 口的翻转速度就可以达到最高 ![]() |
STM32如何分配原理图IO
STM32ADC过采样及几种ADC采样的处理方法
分享一个STM32L031的串口调试程序
基于STM32L051使用CubeMX生成工程文件ST系列芯片通用经验分享
基于STM32L051开始添加需要的代码经验分享
STM32L051测试I2C协议设备的添加经验分享
基于STM32L051测试Flash和EEPROM的读写
基于STM32L051串口测试与Enocean模块通讯问题
基于STM32L0的EEPROM读写经验分享
基于STM32L0 ADC使用HAL库关于校准问题经验分享