选自,STM32F4之寄存器实现跑马灯实验
: C w) I. u3 K8 d- N! v7 L4 E' y/ J
+ A7 s4 l; c6 o/ y" U6 l2 v/ {- GPIOF->MODER &=~(3<<2*9)//清零,第19位,18位的值为00
复制代码
: u+ c+ i M K- y4 ?. h5 v其中:~非运算,表示取反,例111111001111取反后为000000110000,方便我们计算其值。
6 w- }+ g7 d" [& A&表示进行与运算,例1&0=0,1&1=1/ `3 m* n3 i/ k, m/ f$ |) K* `
|表示或运算,例1|0=1,1|1=1.* \* \+ R ^1 ]6 [
注:MODER &=B表示位MODR =MODER&B# d. N" G$ ^- ~% G% E
8 v7 M3 _5 Q4 }+ u! I; p+ W' ~4 Q一、GPIO 端口模式寄存器 (GPIOx_MODER) (x = A…I)
9 G* a: O4 B& k! t1.将18,19位清零*
/ y' z% v$ I) L4 E# G
: t: f$ V" J) s7 q' J[什么要配置MODER9=01 ?Y因为此时是pin9脚,故必须配置MODER9=01 ]3 w' q8 P' d- [* } \
第一步:先将18,19位清零,再将这两位配置为MODER9=01,通用输出模式
) p" N3 `+ d* Y& p数字3:表示18,19位为1,即11=3,
( j1 s% L8 l; Z8 l第二步,移位:3<< 2×9:表示11向左移动18位。此时18,19位的值为11,而MODER是两位的,故显示为2×9 S6 ^2 S u9 y/ r
此时除18,19位为11.其他的30位均为0,再通过取反操作:~,可以实现将18,19位清零的作用。
$ n5 g) U. Z# m' ^5 C: Y我们通过查询F4芯片资料手册的187页,可以得到如下所示GPIO端口模式寄存器的表格如下所示
# {" a7 A- ]. y1 x/ t+ u) W
) o2 w( V6 R0 l2.配置MODER=01,通用输出模式(将18,19位值设置位01)4 b# B0 C$ i: ~; N- V9 |
5 ]/ w* a7 T. x5 z1 x L: aGPIOF->MODER |=(1<<2*9)//置位,第19位,18位的值为014 A1 W" D8 K: F& m& |% C
01=1,然后左移18位,配置MODER=01,通用输出模式。
! m7 V. @ M, q' d# x* ^) w/ Q2 x( Q3 N. @* }& |
二、GPIO 端口输出类型寄存器 (GPIOx_OTYPER)( c. [$ y3 A+ F( K8 S: s, q
- |1 u* p* B2 u, f7 V
" d6 t! b8 t; F+ a, y$ w
9 f6 `" I2 T6 `/ z8 S
将OTYPER9配置为OTYPER9=0(输出推挽)单字节- GPIOF->OTYPER &=~(1<<9)//将第9位清零(单字节)
) W2 I6 r$ z% [7 b$ I( A3 ~ - GPIOF->OTYPER |=(0<<9)//将第9位置零(单字节)
复制代码 1 k1 [* B* [4 v1 \
三、GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR)
( ~: r& L9 a* C; f1 v! K
( J" F. D1 V1 ^
9 D/ W& A* e7 T1 g: S" ~4 G' J/ h( W; I5 d$ r5 R0 z
将OSPEEDR寄存器配置为10,OSPEEDR9=10(50MHz)
+ R* N3 W/ s5 i! Y3 T' Y2 H1 B! ?) \! w/ ?( {1 p: Z2 F
- GPIOF->OSPEEDR &=~(3<<2*9)//将第18,19位清零(双字节)* ?9 I6 C" t; O
- GPIOF->OSPEEDR |=(2<<2*9)//将第19,18位置为10(双字节)
复制代码 ! S# e( A$ v" [+ H
四、GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR)
6 M2 C. ?: l& [9 \
( v* J; j* |% u- R- m- X! M
; k; f' q% e5 s' ^9 D& G4 j5 h7 O- K5 U4 c* U. `
将PUPDR寄存器配置为01,PUPDR9=01(上拉)- GPIOF->PUPDR &=~(3<<2*9)//将第18,19位清零(双字节)
* g& _4 x/ I% n5 J; @7 v - GPIOF->PUPDR |=(1<<2*9)//将第19,18位置为01(双字节)
复制代码
1 W4 k2 g j2 D五、GPIO 端口输出数据寄存器 (GPIOx_ODR)% ~) e- j; ?4 O; ^* o; i
) g6 z5 a5 i z; c& z2 h1 U* q h- y3 w
/ y, l* q/ x) X% o0 J; T# r, }+ J/ F1 e
此时不用清零,直接赋值。
" ^2 y& u( E6 S& @- I
' D# D; t6 D- }3 [9 J R- GPIOF->ODR |=(1<<9)//将第9位置为1(单字节)
" D4 N9 A- X% n. z - //GPIOF->ODR &=~(1<<9)//将第9位置为0(单字节)
复制代码
# K; k) _. b0 W六、RCC AHB1 外设时钟使能寄存器 (RCC_AHB1ENR)
* p% o" l8 @+ k5 X1 H& L" K1 `( ~9 r0 Q5 M
[6 P- b2 U3 [: P) U6 z& U/ U! z% }5 ?+ e
- RCC->AHB1ENR |=1<<5//使能GPIOF口输出,选择使用哪一组I/O口
复制代码
2 c& z4 w" S% D# Z( G2 r; Y0 |总代码:led.c文件下的
$ D3 o; d) F# O" \+ d c- D; A+ R1 _; \; A
- #include"led.h"; ]/ _8 _4 S& O3 _" F( b* \
- #include"STM32F4XX.h"
7 o9 @& }) `! J/ \ - void LED_Init(void)
( j3 e: x" s5 W- q - {0 A) T7 J8 n2 m9 \0 \! I W, |
- RCC->AHB1ENR |=1<<5;1 X: z& r. j, X8 u1 {& m) L4 p
! X$ ] |( M! {5 x- d# K5 T- //PF9# \1 e# Q, A6 Y9 n1 x8 d% o
- GPIOF->MODER &=~(3<<2*9);//清零,第19位,18位的值为00$ e- n2 q; D% H2 j O
- GPIOF->MODER |=(1<<2*9);//置位,第19位,18位的值为01
% q: L9 |6 `: Z$ q @4 A" J6 l - " Z% [7 |( A! o$ T8 z
- GPIOF->OTYPER &=~(1<<9);//将第9位清零(单字节)# F" q, v2 \9 _/ E; L: Q
- GPIOF->OTYPER |=(0<<9);//将第9位置零(单字节)
3 ] Z7 _! M% z9 x - ; l$ B0 U6 S! A) i; |& N
- GPIOF->OSPEEDR &=~(3<<2*9);//将第18,19位清零(双字节)9 I t m5 E) i- d/ C8 p; K
- GPIOF->OSPEEDR |=(2<<2*9);//将第19,18位置为10(双字节)+ }4 Z- Q$ x2 Q4 b9 u5 h3 r
- X8 b$ f) @* L- ~$ S" y$ C- GPIOF->PUPDR &=~(3<<2*9);//将第18,19位清零(双字节)9 a9 `3 \6 z" F" V9 J" P
- GPIOF->PUPDR |=(1<<2*9);//将第19,18位置为01(双字节)
0 X, Z% o& O7 N) v" t - + \/ v$ X9 d5 s( ~$ s+ u9 w
- GPIOF->ODR |=(1<<9);//将第9位置为1(单字节) b- P7 ^' ?3 \2 `7 q/ {
- //GPIOF->ODR &=~(1<<9);//将第9位置为0(单字节)+ ~- y& b2 y9 d2 C0 N$ X( ^
- 5 p% M# @, R0 z- N2 J2 r
- //PF10,注意移动的位数,每个寄存器都对应引脚10& [0 `! |0 ~7 M+ g
- GPIOF->MODER &=~(3<<2*10);//清零,第21位,20位的值为00( m( \7 _1 x. i8 v, f
- GPIOF->MODER |=(1<<2*10);//置位,第21位,20位的值为01' T, e' q% H! Z% d9 X, _
- ( ~" c) U+ [ y5 v' U) `
- GPIOF->OTYPER &=~(1<<10);//将第10位清零(单字节)
$ g6 g% H. @5 Z# s0 T( ]1 a% p - GPIOF->OTYPER |=(0<<10);//将第10位置零(单字节): S( `* C! L- F9 d2 k! a( q8 G1 w6 }
- : V: B' U0 K1 h: O1 ?: h# @4 M2 v8 B
- GPIOF->OSPEEDR &=~(3<<2*10);//将第21,20位清零(双字节)+ k0 N( x2 D3 x$ k$ Z! J, D
- GPIOF->OSPEEDR |=(2<<2*10);//将第21,20位置为10(双字节)
P6 j% |. c+ g9 [: Q4 h
- I3 y9 P1 B& E; A& f+ |9 A- GPIOF->PUPDR &=~(3<<2*10);//将第21,20位清零(双字节)
: S& w/ [5 t7 Z+ R - GPIOF->PUPDR |=(1<<2*10);//将第21,20位置为01(双字节): Y5 G1 d" i5 x* z1 u$ \
- ; v! L: ?& t6 j9 Y% H
- GPIOF->ODR |=(1<<10);//将第10位置为1(单字节)
4 q7 |3 {0 i& `$ K: c - //GPIOF->ODR &=~(1<<10);//将第10位置为0(单字节): K3 m" _& [% x, r4 q9 n& K: U
- }
$ G- M) ^5 T) p$ u" u% y E
复制代码
3 Q. k/ W* ~, {! t& S2 ?3 p8 E0 _* w% B/ c" d3 L, }
|