选自,STM32F4之寄存器实现跑马灯实验
8 a6 [ t3 @( |6 q, Y0 D4 K3 {1 G" `0 t# [- W( k% q4 K/ Z; m
- GPIOF->MODER &=~(3<<2*9)//清零,第19位,18位的值为00
复制代码 . `- D3 u; l$ V9 {* t. E" V7 g
其中:~非运算,表示取反,例111111001111取反后为000000110000,方便我们计算其值。
8 {. Y5 g4 n6 h! r& d U1 \( i6 E+ W&表示进行与运算,例1&0=0,1&1=1
2 h0 S8 \# |( {/ S |, @|表示或运算,例1|0=1,1|1=1.0 E. s. m6 q% |
注:MODER &=B表示位MODR =MODER&B! L; I1 }1 [( V6 ]* C# e, s
- U( t" p4 ?: [4 H+ `一、GPIO 端口模式寄存器 (GPIOx_MODER) (x = A…I)
. R- X9 O' B. N1.将18,19位清零*& M; R4 e( Z$ ^
3 t/ M H' S% }; |% H. O
[什么要配置MODER9=01 ?Y因为此时是pin9脚,故必须配置MODER9=01 ]! G7 B0 Q1 n. p, ?* ?- @3 Y
第一步:先将18,19位清零,再将这两位配置为MODER9=01,通用输出模式5 z$ g! | o) z" X1 w, A; o
数字3:表示18,19位为1,即11=3,; T- C9 ?9 O- a% Q6 W
第二步,移位:3<< 2×9:表示11向左移动18位。此时18,19位的值为11,而MODER是两位的,故显示为2×98 q8 t1 C% S* [" Q& e
此时除18,19位为11.其他的30位均为0,再通过取反操作:~,可以实现将18,19位清零的作用。% @. o* L* d$ F0 q7 ^# _
我们通过查询F4芯片资料手册的187页,可以得到如下所示GPIO端口模式寄存器的表格如下所示
7 d3 T6 Z7 N, q" C B& ^: R1 X6 [5 j" Y7 R2 S. i
2.配置MODER=01,通用输出模式(将18,19位值设置位01)! @( _5 f7 J2 _& u/ c
% Z/ |8 p$ V+ X3 @& m3 N% {. T
GPIOF->MODER |=(1<<2*9)//置位,第19位,18位的值为01' x5 ~/ ~+ D. A- S: z- L. C( O9 H
01=1,然后左移18位,配置MODER=01,通用输出模式。
. [+ h5 x8 _8 ]3 s8 }) m3 Q
8 B: S+ ^$ u5 I0 S& v; x二、GPIO 端口输出类型寄存器 (GPIOx_OTYPER). J( S+ W) p1 P! Z4 o" }
4 t3 _" {( v! ?, N, l
% W& _6 ?4 n# G8 s. P- E4 W/ m3 W2 m7 m, [
将OTYPER9配置为OTYPER9=0(输出推挽)单字节- GPIOF->OTYPER &=~(1<<9)//将第9位清零(单字节)- _# H0 u) t7 B: I
- GPIOF->OTYPER |=(0<<9)//将第9位置零(单字节)
复制代码
" i5 D& l+ w0 Y2 S6 Q6 R5 E. I三、GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR)
. x( G% ]% k8 ?. r. {' Z' P" Y3 a
# F' U R7 A/ A6 A; ?
% W9 E$ e1 b$ U4 {7 f, v6 m2 @
& I8 \( w4 Z5 s, G$ q+ V将OSPEEDR寄存器配置为10,OSPEEDR9=10(50MHz)
" R3 M$ C6 C0 ^9 M: x$ }; d
5 L( x% F9 N" g- GPIOF->OSPEEDR &=~(3<<2*9)//将第18,19位清零(双字节)" {$ v3 z) L( {/ m8 Q* T
- GPIOF->OSPEEDR |=(2<<2*9)//将第19,18位置为10(双字节)
复制代码
7 M4 G: p% \3 [7 E; P四、GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR)9 F- d1 r- S- b; x" h1 R
, L$ ^( x& o! E" U
$ W: J, e7 P" a6 W3 `6 ^) T! ]
- e' {6 B6 b8 ^8 n0 n; I7 _将PUPDR寄存器配置为01,PUPDR9=01(上拉)- GPIOF->PUPDR &=~(3<<2*9)//将第18,19位清零(双字节)
5 A% X6 V* \3 W9 X: M8 ~& { - GPIOF->PUPDR |=(1<<2*9)//将第19,18位置为01(双字节)
复制代码 ) ?' H$ j+ k! q# I9 b
五、GPIO 端口输出数据寄存器 (GPIOx_ODR)
; [! D8 o1 x8 V0 [' d$ W# q2 y7 h' L# e( l% M4 ]
& W% |/ N4 ?+ } {( }, O8 `2 L8 O4 k9 G' V, C. w' a8 ?! B% v
此时不用清零,直接赋值。
+ _* |6 h9 X" J4 c0 k! l; z2 B3 G) U
w7 E( n$ B3 f8 x- GPIOF->ODR |=(1<<9)//将第9位置为1(单字节)
* M8 B+ a6 [! U, s% v) N& b( }% U+ ^$ a9 E - //GPIOF->ODR &=~(1<<9)//将第9位置为0(单字节)
复制代码
4 r; |$ G$ g6 w+ {3 I8 W( P) t六、RCC AHB1 外设时钟使能寄存器 (RCC_AHB1ENR)
' r+ g# X% V. ~ p7 q, @: [! R7 ?1 Z/ F
* l! p( X% S4 |# r. p' i
/ @8 S4 }7 M: B$ o; E& L# k- RCC->AHB1ENR |=1<<5//使能GPIOF口输出,选择使用哪一组I/O口
复制代码 # G: [- _& d' D
总代码:led.c文件下的2 w a# ~& E. P. e
3 N# _4 q L$ ]7 z
- #include"led.h"
2 w' r0 `4 v4 ^0 X5 n - #include"STM32F4XX.h"
( B, a- \* U1 n' m - void LED_Init(void)0 I6 T% u+ T; S6 {/ i0 j4 V7 P
- {
' M' U4 D+ X$ T r: S - RCC->AHB1ENR |=1<<5;
7 a' K: C+ [- H' r' w: _
( O: V \/ [% w- //PF93 j8 E+ e, L$ G8 F
- GPIOF->MODER &=~(3<<2*9);//清零,第19位,18位的值为00% C6 p* s! F. L7 l+ T6 r: D- x+ S! }
- GPIOF->MODER |=(1<<2*9);//置位,第19位,18位的值为01, K9 C! O$ t/ i7 E |
- 5 ?+ X# j0 J) V* ?: t: O
- GPIOF->OTYPER &=~(1<<9);//将第9位清零(单字节), q2 @- C( D1 ~# q
- GPIOF->OTYPER |=(0<<9);//将第9位置零(单字节)
( n' T$ I, [6 ]" F. m& v& g# e! p
4 S* W! F, Y( k4 n8 t! D9 d! _* z/ s- GPIOF->OSPEEDR &=~(3<<2*9);//将第18,19位清零(双字节)
) o% F# X) H: C% s - GPIOF->OSPEEDR |=(2<<2*9);//将第19,18位置为10(双字节)
2 Y4 [" ?6 b7 s7 S2 \8 v - 4 ]4 r* x5 P$ K+ f! w& x/ `
- GPIOF->PUPDR &=~(3<<2*9);//将第18,19位清零(双字节)
7 {' k9 k2 F8 ] - GPIOF->PUPDR |=(1<<2*9);//将第19,18位置为01(双字节)6 t( o6 a# G2 L5 b3 S
5 w2 H; t- q" a) }6 t- GPIOF->ODR |=(1<<9);//将第9位置为1(单字节)% ]2 U( N5 M( m' E E2 A4 B) P
- //GPIOF->ODR &=~(1<<9);//将第9位置为0(单字节)
4 [" Q# B+ M0 t& z9 l9 s. r8 q - : j) P# E6 M, B/ Y4 X
- //PF10,注意移动的位数,每个寄存器都对应引脚10, o& `1 g+ u& X1 _ k, Y+ W
- GPIOF->MODER &=~(3<<2*10);//清零,第21位,20位的值为000 }: l% R: _: ^1 w# r( p& D
- GPIOF->MODER |=(1<<2*10);//置位,第21位,20位的值为01
1 u- a" k8 x7 o" p; S - ; j+ y7 u" |; B. |, O, O1 [
- GPIOF->OTYPER &=~(1<<10);//将第10位清零(单字节)* Q# Z- Q( U! | ^# B
- GPIOF->OTYPER |=(0<<10);//将第10位置零(单字节)9 U. {1 g& F, S) Q z0 i
- + |2 e+ _2 h* H% L9 g" p
- GPIOF->OSPEEDR &=~(3<<2*10);//将第21,20位清零(双字节) G% X% J( ]1 g7 {- H
- GPIOF->OSPEEDR |=(2<<2*10);//将第21,20位置为10(双字节)
7 q& h* A+ ?* i( L8 R; i6 Z+ L) a }2 @
) Z/ N& _7 [3 {2 g! d- GPIOF->PUPDR &=~(3<<2*10);//将第21,20位清零(双字节). j/ x( }4 G, F! Z* d8 k
- GPIOF->PUPDR |=(1<<2*10);//将第21,20位置为01(双字节)
7 K; C% o& l; o - / a' F! k( V# k2 w1 K
- GPIOF->ODR |=(1<<10);//将第10位置为1(单字节)+ Q8 f' D7 C0 @- B
- //GPIOF->ODR &=~(1<<10);//将第10位置为0(单字节)
- r2 C0 U( o K; Q, U - }
Y9 Q6 ~/ a" K5 B
复制代码
7 ]8 k5 c+ u4 R+ ?* _8 K. Y9 s* d8 @ g" d. W v
|