STMCU小助手
发布时间:2022-2-27 16:23
|
一. 前言 测试 STM32L053 芯片在系统时钟 8Mhz 的情况下,其 GPIO 电平的翻转速度。) o+ M5 [- I* @5 {8 |5 j 二. 说明 STM32L053 芯片是 M0+的内核,其 GPIO 的外设直接挂在内核上。
三.测试环境 软件环境:IAR 7.20,STM32CubeMX Version 4.3.0,STM32Cube V1.0 硬件环境:STM32L053 Nucleo,MB1136# L" b g8 |) X7 r m3 L ( g4 u" D/ K' ~' ]5 h 四.测试流程 打开 CubeMX 的软件,点击新建工程,选择与目标硬件板相同的芯片型号,GPIO 口选择 PA5。系统时钟通过内部 HSI 实现 8MHz。如下图:
& @$ y) Y6 l8 L. U+ } 点击 OK 按钮,弹出另外一个对话框,选择设置系统时钟 8Mhz。HIS 最终通过 PLL 锁相环输出 8MHz的时钟。 5 z! s3 |6 W6 G7 b, A
" k9 s+ t9 _( M$ [" D 设置 PA5 为普通 IO 口输出模式。# L- B3 ?4 e, E3 G; B T
; a) ?2 C. t( n! e8 _; s 并配置其端口的摆率为 High Speed.8 b$ N( t: {% `, t
基本上这里想要的设计完成了,让 cube 生成相应的代码,然后去验证 GPIO 的电平翻转速度。
打开项目工程。 在 main 函数的 while 循环中,添加 GPIO 口的翻转语句。期望的 GPIO 翻转速率能够达到 4MHz,在系统时钟 8Mhz 的情况下。按照 8Mhz 与 4Mhz 的关系,需要单周期的指令去执行电平的高低切换,显然此时运用调用库函数的方法是不可取的。应该直接操作寄存器。5 X) L3 ]2 P1 E1 i 按照上述思路,实现方法如下图,用示波器观察 GPIO 口的波形。8 G) f7 f8 b& H x+ @ 1 d! i4 `, j1 L- o! K" a8 b " n" l2 y% ?! l
测试发现,只能有 1.005Mhz。 和自己的想法差别很大,究竟怎么回事呢?查看反汇编语句,发现虽然自己是直接对寄存器的操作,但是反汇编却执行了多条语句。 0 D: g$ y8 Q- x( e9 } , g/ t' }1 ]0 X! ^! p9 b
哦,立马查看编译器的优化等级。原来我是设置了代码不优化的。; X2 g! x4 c& Y" p3 S$ K! g ' Q0 U9 q% C5 b( V2 O: R
立马更新优化等级,逐个变更,看看各自的对比:: V- g. z e+ [ s+ i v 优化等级为 Low 时:和没有优化时的波形一样。% ]5 }2 v# Z) r0 J0 }8 W' F 优化等级为 Medium 时:编译器旁边的 Enabled transfomations 的设置保持默认,GPIO 口的翻转速度达到了 4Mhz.# k9 a5 H8 k$ B6 E8 I* X* l: D
?1 t6 \$ B& I, Y. h& B; K 优化等级为高时,和优化等级为 Medium 的波形一样。3 V! B$ Y' A, [1 e) _ 其实,也可以通过反汇编的执行语句看出 GPIO 口的翻转速率。只要执行单周期指令,GPIO 口的翻转速度就可以达到最高- w5 G% I- g2 q/ @ , ?5 @, A+ m5 u& a% U! [
|
微信公众号
手机版