选自,STM32F4之寄存器实现跑马灯实验
7 \+ T7 b5 {' W/ P2 t/ t& e) z9 I% o8 h6 Y
- GPIOF->MODER &=~(3<<2*9)//清零,第19位,18位的值为00
复制代码
6 l+ a# M' Y9 T; w- R其中:~非运算,表示取反,例111111001111取反后为000000110000,方便我们计算其值。1 Q* b9 \' }6 s7 P, Q* ?
&表示进行与运算,例1&0=0,1&1=19 S6 j) a$ c# d# c% ~: N
|表示或运算,例1|0=1,1|1=1.* X# D" S& w8 ?& }, D
注:MODER &=B表示位MODR =MODER&B
4 v+ |% J1 e% J& D, `; I/ T- F3 c1 R/ P
一、GPIO 端口模式寄存器 (GPIOx_MODER) (x = A…I)/ V- x) T2 P+ [- E: O) S- ?
1.将18,19位清零*
$ {% K4 V5 y$ W8 s
. h7 |1 z/ m$ X# W, ]" ^4 S# l[什么要配置MODER9=01 ?Y因为此时是pin9脚,故必须配置MODER9=01 ]+ o2 m0 o( }* `1 I, X
第一步:先将18,19位清零,再将这两位配置为MODER9=01,通用输出模式, X2 s$ ~7 |3 x3 R7 B; @: G
数字3:表示18,19位为1,即11=3,
3 {) ?4 O* z- F# S8 p4 w& e t. H第二步,移位:3<< 2×9:表示11向左移动18位。此时18,19位的值为11,而MODER是两位的,故显示为2×9
! T4 t6 Q, h% F( O% `此时除18,19位为11.其他的30位均为0,再通过取反操作:~,可以实现将18,19位清零的作用。0 ~! \ e( m, W F9 \, \
我们通过查询F4芯片资料手册的187页,可以得到如下所示GPIO端口模式寄存器的表格如下所示
: Y6 J9 M+ w+ V
! g' D8 ?8 z! X# Z) F7 p2.配置MODER=01,通用输出模式(将18,19位值设置位01)
8 E- u3 e* ]$ |* Q1 u k: `, c
* i# s$ o/ Q: P6 `% jGPIOF->MODER |=(1<<2*9)//置位,第19位,18位的值为01
1 ?. g2 g: s* @01=1,然后左移18位,配置MODER=01,通用输出模式。
- d, z6 e$ n b8 O/ h4 t9 B+ t' P& X4 z4 e9 z) w* K
二、GPIO 端口输出类型寄存器 (GPIOx_OTYPER)( c) y- x% U( ^9 }/ I* {
0 d; b3 a s- }6 ?. v
: G% D% s' y- p" Y3 z
5 x% W8 b0 N/ Y$ `6 Z# p将OTYPER9配置为OTYPER9=0(输出推挽)单字节- GPIOF->OTYPER &=~(1<<9)//将第9位清零(单字节)( {# z* }$ T% Z8 v H/ F
- GPIOF->OTYPER |=(0<<9)//将第9位置零(单字节)
复制代码
% g; B5 o) G: P1 `5 C( V! z8 [三、GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR)
6 k& O" S3 \1 Y. Q
( |9 j* ]/ ?# `+ j2 p! g
H7 D( m4 Y5 j( n8 {
( c: ^! u! g% G, }* a$ O" O+ X将OSPEEDR寄存器配置为10,OSPEEDR9=10(50MHz)
0 D5 X8 z* V/ I( ?; b: T) H2 H
: w# w* U: ~3 R- GPIOF->OSPEEDR &=~(3<<2*9)//将第18,19位清零(双字节)
% M7 j W$ S0 a4 G$ g4 x0 F1 C5 w - GPIOF->OSPEEDR |=(2<<2*9)//将第19,18位置为10(双字节)
复制代码
2 `: x5 b; E. V" v) [1 @四、GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR)
9 Q( G- ^! F# V! M2 v3 N/ R; n/ N8 L* q7 y
# I) l. ~( \: E+ P7 a1 b) M7 C5 q& c
将PUPDR寄存器配置为01,PUPDR9=01(上拉)- GPIOF->PUPDR &=~(3<<2*9)//将第18,19位清零(双字节)' G- F- D. ]5 l. `
- GPIOF->PUPDR |=(1<<2*9)//将第19,18位置为01(双字节)
复制代码
, {, Q/ b- ` R五、GPIO 端口输出数据寄存器 (GPIOx_ODR)" i5 y1 A0 t: o1 n& L
( e. E Y0 t |0 V9 g$ n, j
! y, g7 f/ k c4 u
: L6 Z! l+ Z: N1 U此时不用清零,直接赋值。, A9 N. D# H/ ~- x& H# \
& K' j6 U% F& _; m& h
- GPIOF->ODR |=(1<<9)//将第9位置为1(单字节)
5 ` W: _6 I) U8 x$ a: `! S - //GPIOF->ODR &=~(1<<9)//将第9位置为0(单字节)
复制代码
+ i! d/ R0 j6 j. ?! W# ?5 J六、RCC AHB1 外设时钟使能寄存器 (RCC_AHB1ENR)
* H9 i3 d- T( \% D, N8 f" Y9 H4 Y% O% P& p) u
6 E& E- G4 O6 Z* u+ E, W3 d9 E! y% I. c* Z/ z5 b
- RCC->AHB1ENR |=1<<5//使能GPIOF口输出,选择使用哪一组I/O口
复制代码
2 q7 ]; S6 J8 C) i2 V$ s总代码:led.c文件下的& Y6 I7 b( K9 D+ k! n1 }# n7 Z
: q" w, w" T( D3 V0 E$ `, r
- #include"led.h"
' ~+ }( I: I0 T# S - #include"STM32F4XX.h"
# I: k! ?" s O; S( T$ y z - void LED_Init(void)* H$ M! P* i0 v( I0 l- D v7 R
- {
0 f& r! y. _) V - RCC->AHB1ENR |=1<<5;
' O" ]9 P9 d' k& {$ E, { - " G2 }9 i; g" p# h9 A; W& M
- //PF9/ P0 d0 p$ E$ v7 t* V# G0 }
- GPIOF->MODER &=~(3<<2*9);//清零,第19位,18位的值为00
- \. W6 X. ]5 Z& U7 Y - GPIOF->MODER |=(1<<2*9);//置位,第19位,18位的值为01
, S% n- a p- |: K1 _2 g - 7 b9 S0 s. F& \9 B1 T
- GPIOF->OTYPER &=~(1<<9);//将第9位清零(单字节)
. k; X* `& C* Y" a5 n- j5 |1 W - GPIOF->OTYPER |=(0<<9);//将第9位置零(单字节)4 H5 n7 d! W! n. e R
- `( T. G! M) A) r9 p4 U P- GPIOF->OSPEEDR &=~(3<<2*9);//将第18,19位清零(双字节)" w' @/ C% f; E4 M5 [
- GPIOF->OSPEEDR |=(2<<2*9);//将第19,18位置为10(双字节)0 u7 x7 Y4 ] W# L. L
9 Z& P* J: ?, ^- GPIOF->PUPDR &=~(3<<2*9);//将第18,19位清零(双字节)
: v7 t8 E1 W" P9 o* b5 M* b - GPIOF->PUPDR |=(1<<2*9);//将第19,18位置为01(双字节)
6 r$ R0 ~4 X$ W
& P4 u8 X8 G* J! q* ], F1 E- GPIOF->ODR |=(1<<9);//将第9位置为1(单字节)
( \7 ~0 i9 `! _: V( t - //GPIOF->ODR &=~(1<<9);//将第9位置为0(单字节)
: A$ C: w. J1 g$ k* c+ K - * y, u+ [# B' Z3 o/ Q- W6 L6 a
- //PF10,注意移动的位数,每个寄存器都对应引脚10
7 @" r* }' G2 N# S k6 X5 S% c* K - GPIOF->MODER &=~(3<<2*10);//清零,第21位,20位的值为00
' f. E: p) b3 ^1 N4 z) Q( r: L0 G - GPIOF->MODER |=(1<<2*10);//置位,第21位,20位的值为016 T! s0 B2 H. `: t% b* \
; N2 L8 R4 c& K8 L! j- GPIOF->OTYPER &=~(1<<10);//将第10位清零(单字节)* N: ?! U, W% Y2 l' w9 B
- GPIOF->OTYPER |=(0<<10);//将第10位置零(单字节) m" |3 W5 z M0 j7 w
- 3 u6 c, ?' {; t" j+ a* k5 ~9 d
- GPIOF->OSPEEDR &=~(3<<2*10);//将第21,20位清零(双字节)8 @3 ?$ r' J/ _$ u0 w
- GPIOF->OSPEEDR |=(2<<2*10);//将第21,20位置为10(双字节)
; z6 r) [2 y/ }* T( ^3 J; w
7 v: \3 Y' k) b4 r5 C: n, q/ t( O6 g- GPIOF->PUPDR &=~(3<<2*10);//将第21,20位清零(双字节)! Y+ E: K. |; b& K9 y6 ^/ n
- GPIOF->PUPDR |=(1<<2*10);//将第21,20位置为01(双字节)
% N5 J# e9 s9 Q+ H8 P
! A8 W* T. Y6 C2 s4 B" C- GPIOF->ODR |=(1<<10);//将第10位置为1(单字节)
R# D( b [ c - //GPIOF->ODR &=~(1<<10);//将第10位置为0(单字节)% \ t: z- ~! B
- }3 C* Z N9 \: W: ]! G
复制代码 : W; r. k& t. h3 E+ I) W
' F$ n; |5 ^6 ?- P% B
|