理论学习5 M+ n! I1 [" @$ a
GPIO配置相关的IO口寄存器:
' r! d/ z2 D" T0 K$ @7 e
0 V% u) b1 ]2 X7 e4 e, |
. E6 F& j3 [/ B! G0 g' h- x
+ g7 j5 \0 ` A4 U0 t
实践学习
& O- }$ ]3 J$ T9 v0 |一、设计规划
$ k. [+ b3 K: X4 q7 y: s1.1 实验目标% [ c4 Z: K7 W6 \$ D6 a
开发板上两个LED:DS0和DS1交替闪烁,实现跑马灯的效果。
; D; I p5 j7 Z7 x# z" `% e0 a' r H( b/ d
1.2 硬件资源
0 g* R7 C6 V6 Z7 U2 Q: _7 }0 M
8 _+ d6 G. C4 A: C* X
& H3 [1 j! l0 Z4 o
9 r2 S6 Y9 F0 s7 }8 u3 x二、程序设计. D. A( [5 e3 ]- J0 i0 }
2.1 工程文件2 b) |! U' e2 Y3 p! N, E) L
; P+ k$ [- j/ T0 `) G$ S9 k9 O
0 b4 r0 b5 ?6 i3 c4 p; H
( w0 f6 |, T" M* |/ x添加工程目录(.c和.h)% h. y% D. q/ H$ p& U! r
y6 x4 d" L+ u& S0 @% v. j
# Q4 P. K6 z) u3 X
' M1 w. F$ S: U! K. B
2.2 led.h文件- #ifndef _LED_H
4 g4 u9 I) R; B# | - #define _LED_H$ U, `) b' A4 }
- #include "sys.h" ! O6 K- P0 ?. ]7 P
- 2 c- q) {4 Y/ D( l1 ?$ O
- //LED端口定义
0 ~7 j$ K3 w3 ~& _( n1 I - #define LED0 PFout(9) //DS0,基于sys文件的位带操作1 v2 j7 ~2 L% j7 X& n
- #define LED1 PFout(10) //DS12 H& Q0 D* T. H
- void LED_Init(void); //初始化函数声明
% E: d* J* V; o! V: |* t) ^ -
' H0 W, M2 S0 u7 F$ D - #endif
复制代码 1 X# G. h+ @$ V. K+ h* j$ j. W
2.3 led.c文件 r6 L6 p" U8 p, j( _: X& Z9 c
使用sys.c文件中的GPIO_Set函数对IO口进行初始化 U7 r _) D" s, F7 U4 E
0 o3 |+ O# e: w4 H( ?) @ W* A
5 K! C4 f* s, _- t; ^' \
: i/ Y' ]. y: L f; b* ?* M) Z# F RCC AHB1外设时钟使能寄存器(RCC_AHB1ENR): U& W/ \4 C* m k& o% T$ {2 W
4 x, }& @, z$ t$ a
& D* W8 }: T' ~: d
4 m7 I4 Z8 b- U/ J位 5 GPIOFEN : IO 端口 F 时钟使能 (IO port F clock enable)
0 c, Z! D4 q, Y9 E由软件置 1 和清零。
5 z; C+ A3 ~( d: ^. X7 u0 :禁止 IO 端口 F 时钟
- ]! Y8 E" w7 z, {1 :使能 IO 端口 F 时钟
0 I0 U' i, Z! o4 u- S* R4 W0 Y* T- #include "led.h"
1 P" s+ e2 N3 ]7 f, G) z - //初始化PF9和PF10为推挽输出* {/ y% W5 P1 @3 U3 C$ I
- //LED IO初始化
- R& a' y4 Z" Y# O9 W @ - void LED_Init(void)0 C1 P$ m! A& f" C6 ?
- {
" v/ n& y8 e6 K. `+ S& y( O - RCC->AHB1ENR |= 1<<5; //使能相关位的时钟( p6 F( D' i4 O8 d. i, `3 T
- GPIO_Set(GPIOF,PIN9|PIN10, //设置相应的IO口* c1 i4 ]" I* _( ~: P8 z# j) L. u
- GPIO_MODE_OUT,GPIO_OTYPE_PP, //MODE_OUT:输出 OTYPE_PP:推挽
, u1 x1 V8 b/ {! l6 a6 T - GPIO_SPEED_100M,GPIO_PUPD_PU); //SPEED_100M PUPD_PU:上拉/ M8 }% ~$ m+ I3 Z
- LED0 = 1;$ o- V4 m+ c5 R4 G
- LED1 = 1;
7 S* G7 _1 i9 U. D& g - }
复制代码
8 g5 s6 `7 T, H' |- Q3 W4 M: w+ y% d Z- V$ I1 c/ [
1<<5 = 0x0000 0010 ' [. Y: }* f% P
# a o: u3 i0 R% s& o
RCC->AHB1ENR = RCC->AHB1ENR | 0x0000 0010 //将寄存器与左移表达式按位或,即将第5位置为1,即GPIOF的时钟进行时钟使能。
) D1 z8 P9 H. L
2 F" I2 o: E: [然后通过sys.c程序中的GPIO_Set函数对IO口进行配置与使能。
' F/ J5 {& l" C6 e5 c0 e1 P
6 u, n* K& C# N! N. Z' C- C( [6 ~2.3 text.c文件* S, Y P+ l2 N! u
Stm32_Clock_Init(336,8,2,7);
! I* U' X1 d9 n# f5 ^8 v4 Zplln:主频系数 = 8*366 = 2688MHz; _2 z% q6 g/ G: `" ?3 V
pllm:主PLL = 2688 MHz / 8 = 366MHz
6 _" z0 m% n0 z0 b- ipllp:系统时钟 = 366 / 2 = 168MHz
" F/ ^7 a7 x' ~$ Vpllq:USB/SDIO/随机数产生器时钟 = 168MHz / 7
4 F- |) u$ O' z8 L, c& v# }2 s' ^; c5 J. I! ?8 B/ r" e. T4 f9 ]% ?
4 q0 Y, \& k! w/ q
3 p7 y$ a" c% {- H: F+ l- #include "sys.h"
) O" p9 p/ J& {: ?' d6 M - #include "delay.h"4 _& {9 {( u7 X8 w1 x+ A& _0 m
- #include "led.h"
# M! @+ Z1 l8 [! U& z, j7 A -
, L6 o' n6 @8 k - int main(void)
" F% [$ h' |; `1 G - {
& O5 ?( s# K, _. t, Z. O* n) T - Stm32_Clock_Init(336,8,2,7); //时钟频率168M
: D" N, g h1 t, _+ @ - delay_init(168);
3 x3 Y4 i S+ s( L/ _& m - LED_Init();2 ~" }$ y6 y! g* r, D6 j$ B
- while(1)
7 N' a1 ~' O/ }! [& L - {
5 ?1 h' m; `3 d7 i; t$ y3 d* \ - LED0 = 0;- ~. _, _. r" |- p, H
- LED1 = 1;" y& z# O6 e/ I' y: @! L% f
- delay_ms(500);) \3 Y, f1 _1 l" m/ b0 r
- LED0 = 1;! T' J+ M! g; h+ _
- LED1 = 0;) K0 d1 o. j5 N
- delay_ms(500);$ j7 X, q; _( d4 D+ B
- }* K3 I8 R6 ~8 A" m9 ?" F
- }
复制代码
7 K C4 F) |0 o" v- V' P A$ _+ t6 E三、在线调试
8 u; Z3 _- p' X& ]. x
* I# c% A: B) b w' @2 \* i
( a8 ^) M \0 D/ i
# s. u3 N' y* [2 y 将代码下载到32开发板上,然后点击1进行代码在线调试。; L4 F6 a5 S) b* M/ F2 S& G1 n9 i
点击2打开观察窗口,添加PF9和PF10两个GPIO的值,同时打开GPIOF的寄存器(最右面所示)9 [+ P& D% P M' T6 J% n" @
如下图在线调试后代码运行到启动文件的_main程序,下一步将进入main中执行C程序。
* D: A( p9 c5 v& o1 Z, A2 c0 ?
# v L! S$ B' S. c* _/ Z8 T
4 Y+ W) P. ]& k- N* _8 J5 f9 }4 d, b8 o, G( F
在LED_Init(void)中的GPIO_set后设置一个断点,来观察GPIO相关寄存器配置变化2 P. N% \7 H; z( o: c# H
可以通过寄存器相关的位看出其GPIO模式的配置:MODER将GPIO9/10配置为01(通用输出模式)、OTYPER复位状态(输出推挽)、OSPEEDR将GPIO9/10配置为11(100MHz高速)、ODR将GPIO9/10两个位配置为1(初始化点亮LED灯)
`* J( ~. F4 I! v
+ ~* u: v0 G$ l
" ?7 [0 s R. r2 ?- h5 [1 N- F ~# j8 S4 t5 L
整体运行代码,可以发现输出寄存器PF9/10在0、1两者进行转换。
& f: v0 |" y# S! s0 [. v9 [' k* ~" ]+ a
LED寄存器变化
$ I: c; m' y/ s
: \" a& r& |! S* j/ A3 }. [, ^9 o% F* ?
四、上板验证# [8 ^7 y# }0 `" @
代码编译后无错误,点击下载按钮+ D2 }. l$ {# W K8 K0 I8 @; m
" \! w, x0 b, _ K
- F: \3 z) R/ m4 h; ^
) Q. c0 O; \9 D
7 L M6 T6 X k3 l
3 f- B9 [6 u+ o
————————————————
9 s, ~0 _3 f u$ @# h5 v版权声明:追逐者-桥
6 c/ p2 A5 z# \$ x8 U3 \
( e/ h- N( G$ m* e0 W2 p. ]8 N2 ~# S+ n; M8 ^; U
|