
一. 前言 测试 STM32L053 芯片在系统时钟 8Mhz 的情况下,其 GPIO 电平的翻转速度。 二. 说明- Q- f# s; n a5 {2 x8 b STM32L053 芯片是 M0+的内核,其 GPIO 的外设直接挂在内核上。1 \6 y8 w6 M! N$ J# P6 @/ v ![]() ) g: W3 |6 ]. V* ` 三.测试环境 软件环境:IAR 7.20,STM32CubeMX Version 4.3.0,STM32Cube V1.0* }7 z& J( J( ~ 硬件环境:STM32L053 Nucleo,MB1136 四.测试流程3 v4 R" P6 C9 e2 ~) i 打开 CubeMX 的软件,点击新建工程,选择与目标硬件板相同的芯片型号,GPIO 口选择 PA5。系统时钟通过内部 HSI 实现 8MHz。如下图: ![]() 3 Z1 |7 P5 J8 ^9 c5 {/ B) ? 点击 OK 按钮,弹出另外一个对话框,选择设置系统时钟 8Mhz。HIS 最终通过 PLL 锁相环输出 8MHz的时钟。3 D# s9 O9 Q4 B) J6 M' I) T 3 A3 P2 P4 @+ t: C2 M" a9 j ![]() 3 N" ?6 F6 x' t( { 设置 PA5 为普通 IO 口输出模式。 * \. ] f$ G+ k9 u: A: O# f$ a ![]() 并配置其端口的摆率为 High Speed.3 |( X; G8 z H$ z! y" D / ~' D( n9 n7 L2 U V" W ![]() : [$ l6 Z( [% D 基本上这里想要的设计完成了,让 cube 生成相应的代码,然后去验证 GPIO 的电平翻转速度。1 U F9 W; A8 Q) z 2 W; n# M* q; u4 c9 j4 C ![]() : Q# |' h* N' _" a* @+ g* l 打开项目工程。5 a" o8 {4 B2 ~9 W3 f* _- e( A) S 在 main 函数的 while 循环中,添加 GPIO 口的翻转语句。期望的 GPIO 翻转速率能够达到 4MHz,在系统时钟 8Mhz 的情况下。按照 8Mhz 与 4Mhz 的关系,需要单周期的指令去执行电平的高低切换,显然此时运用调用库函数的方法是不可取的。应该直接操作寄存器。 按照上述思路,实现方法如下图,用示波器观察 GPIO 口的波形。4 B4 ~( R$ I9 {& p# R: A6 Y * ]- C! u" S- r ; e+ \# V8 f+ ]: N5 `) E% G5 R ![]() & e, r, b' ^; P5 Z; y 测试发现,只能有 1.005Mhz。! h+ x1 S- k W5 c8 N 和自己的想法差别很大,究竟怎么回事呢?查看反汇编语句,发现虽然自己是直接对寄存器的操作,但是反汇编却执行了多条语句。 ! S7 C( O1 j8 q; j; O) f8 \0 n ![]() 4 Z4 A+ i1 [3 F- Q, U2 t 哦,立马查看编译器的优化等级。原来我是设置了代码不优化的。 ( N- U% ^" J% |2 z9 O ![]() 立马更新优化等级,逐个变更,看看各自的对比:3 E, b- ]9 T ?1 F 优化等级为 Low 时:和没有优化时的波形一样。3 \* _7 t1 H3 ] }1 ?6 S; N 优化等级为 Medium 时:编译器旁边的 Enabled transfomations 的设置保持默认,GPIO 口的翻转速度达到了 4Mhz. ( N. ~5 a6 r) S( @# e6 K* R0 B ![]() 优化等级为高时,和优化等级为 Medium 的波形一样。 其实,也可以通过反汇编的执行语句看出 GPIO 口的翻转速率。只要执行单周期指令,GPIO 口的翻转速度就可以达到最高' A- ?) z5 _& m2 X @ 1 r& b* I( O( i$ z/ \, ?" s + \& {, k" g0 D9 l ![]() |
STM32ADC过采样及几种ADC采样的处理方法
分享一个STM32L031的串口调试程序
基于STM32L051使用CubeMX生成工程文件ST系列芯片通用经验分享
基于STM32L051开始添加需要的代码经验分享
STM32L051测试I2C协议设备的添加经验分享
基于STM32L051测试Flash和EEPROM的读写
基于STM32L051串口测试与Enocean模块通讯问题
基于STM32L0的EEPROM读写经验分享
基于STM32L0 ADC使用HAL库关于校准问题经验分享
【工程师笔记】汇总处