选自,STM32F4之寄存器实现跑马灯实验
" A& e7 F9 _+ t* O# r. o# E" E. p: Q, K) _+ s$ j
- GPIOF->MODER &=~(3<<2*9)//清零,第19位,18位的值为00
复制代码
1 M- b9 d6 b5 A! u其中:~非运算,表示取反,例111111001111取反后为000000110000,方便我们计算其值。5 l' X- ^) q0 h+ V, t
&表示进行与运算,例1&0=0,1&1=1
& Z3 R' o! H0 W$ K9 t" I|表示或运算,例1|0=1,1|1=1.
3 l% o8 @. L2 T1 f& `9 u( [注:MODER &=B表示位MODR =MODER&B
: k5 d2 d7 `4 \ v6 ^+ Z2 Z' d9 [ T+ s3 x* T
一、GPIO 端口模式寄存器 (GPIOx_MODER) (x = A…I)+ N; z! O, i# A7 ~$ f' I
1.将18,19位清零*
d9 y2 w# a& d9 n0 R5 G, D
9 x6 D [1 w/ b) f[什么要配置MODER9=01 ?Y因为此时是pin9脚,故必须配置MODER9=01 ]
: q' u B! g: w第一步:先将18,19位清零,再将这两位配置为MODER9=01,通用输出模式. |" `! ?3 z( j, s/ I
数字3:表示18,19位为1,即11=3,8 v( R9 Q: Y! u; h c
第二步,移位:3<< 2×9:表示11向左移动18位。此时18,19位的值为11,而MODER是两位的,故显示为2×9
9 r) F8 Z T( W8 c2 L0 |此时除18,19位为11.其他的30位均为0,再通过取反操作:~,可以实现将18,19位清零的作用。
) N# e# c- T# i( L7 l我们通过查询F4芯片资料手册的187页,可以得到如下所示GPIO端口模式寄存器的表格如下所示) v3 W. V8 Q) ?& r7 I% A$ @& l
9 P) g+ w" t6 `) F, {2.配置MODER=01,通用输出模式(将18,19位值设置位01) z+ n0 x' q. H' i/ A* w
3 V' N- O7 m6 O/ QGPIOF->MODER |=(1<<2*9)//置位,第19位,18位的值为01: M& W- A" w6 v9 J9 B5 c9 G/ }) j& c
01=1,然后左移18位,配置MODER=01,通用输出模式。
4 O" X7 v$ @: Y
$ L4 Q T4 Q% v8 P; c9 a) J7 _二、GPIO 端口输出类型寄存器 (GPIOx_OTYPER)
8 W5 A: ] j# r, v8 [
5 o) }4 `' [6 r D
* w: G5 u, X m1 G% z& s% p7 t( [4 p/ [/ M4 ?. w" i
将OTYPER9配置为OTYPER9=0(输出推挽)单字节- GPIOF->OTYPER &=~(1<<9)//将第9位清零(单字节)
- q' _6 u9 E/ ` - GPIOF->OTYPER |=(0<<9)//将第9位置零(单字节)
复制代码
7 d$ I' P6 Q; P/ b! H* Z三、GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR)
& b* _. V* E. X" y |8 _$ K" e4 L ~. c
0 A1 T) x. t7 R; t- k, P
6 @/ y a, D5 |* r" j+ I
将OSPEEDR寄存器配置为10,OSPEEDR9=10(50MHz)
% z0 L) r, b o
2 q% \. Y2 P" I6 U5 v& p" c! `- GPIOF->OSPEEDR &=~(3<<2*9)//将第18,19位清零(双字节)
' {" Y. d% s/ y! _9 [ - GPIOF->OSPEEDR |=(2<<2*9)//将第19,18位置为10(双字节)
复制代码
9 r+ ] d, \/ P& S# {+ f四、GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR)2 S: _* }; t( } i# F2 W3 a- V7 r2 e
& D9 p( E5 X6 y
/ f" A, a( g) J: E# c
& i. g5 J! \, x5 j2 q
将PUPDR寄存器配置为01,PUPDR9=01(上拉)- GPIOF->PUPDR &=~(3<<2*9)//将第18,19位清零(双字节)
, Z* Y B1 l1 R" g6 h5 O - GPIOF->PUPDR |=(1<<2*9)//将第19,18位置为01(双字节)
复制代码 9 S$ {. D9 T8 ^% M9 ?, ?; r
五、GPIO 端口输出数据寄存器 (GPIOx_ODR)/ G, J( e: w* ?# Y, e/ X
c2 m8 M3 f9 [- t- D. n/ m% F0 o
' ], | Z+ q ?% q \; O+ o! v4 ^# t' j, u; Z
此时不用清零,直接赋值。( @: k/ C8 h( B% T; F
2 P1 W. W; W) D+ ^) U0 H4 t& a
- GPIOF->ODR |=(1<<9)//将第9位置为1(单字节)
' b3 `7 T* Q6 Y! V7 y1 e - //GPIOF->ODR &=~(1<<9)//将第9位置为0(单字节)
复制代码 ) A& \7 t: d& E! A. h" N! q
六、RCC AHB1 外设时钟使能寄存器 (RCC_AHB1ENR)9 a- q: |! @+ T' T. P2 |; F* ~
0 ^+ n/ r$ i1 @4 b0 w' A/ {8 N
& c5 N5 B! y! u" Y& _" U* \
2 E0 D. i9 u; l+ D; Y: l# {. W3 O- RCC->AHB1ENR |=1<<5//使能GPIOF口输出,选择使用哪一组I/O口
复制代码
4 m' z+ j' U- e总代码:led.c文件下的9 o) W* e- v4 R2 [6 ~' [
0 }6 H" l& _* E6 w+ f- X2 P0 [9 c# \& h- #include"led.h"
6 H3 y( _ v; Q! `2 l7 a - #include"STM32F4XX.h"
4 U9 I4 _! `* ^6 `. b2 q - void LED_Init(void)& J! {% W- R+ ?* ]+ \/ Y' I7 a
- {
6 E: @2 c; Z* S; M% U& ?) } - RCC->AHB1ENR |=1<<5;$ Y: O. @2 ~( Q2 _4 H* {
- ) C% n; [1 h1 I, `5 Q+ N2 n
- //PF9. b, ]% b( B+ j
- GPIOF->MODER &=~(3<<2*9);//清零,第19位,18位的值为00
{& r3 A9 t+ f( L' M, i! {1 O - GPIOF->MODER |=(1<<2*9);//置位,第19位,18位的值为01
; e W) l0 L' N- {- f5 a' X
1 I8 p3 h" g4 h5 {$ m2 m- GPIOF->OTYPER &=~(1<<9);//将第9位清零(单字节)
" q2 J! U) Z4 s- v - GPIOF->OTYPER |=(0<<9);//将第9位置零(单字节)
) P* g/ h/ G) M$ Y* S1 ^
8 r' ?$ K+ c H3 M8 W1 n3 t+ `- GPIOF->OSPEEDR &=~(3<<2*9);//将第18,19位清零(双字节), I6 T* L3 Z- L m7 ?
- GPIOF->OSPEEDR |=(2<<2*9);//将第19,18位置为10(双字节)% X& c6 Y' k) v( m: y
- % ^" j0 }1 E. E7 [2 S
- GPIOF->PUPDR &=~(3<<2*9);//将第18,19位清零(双字节)
, P6 c4 f; w g - GPIOF->PUPDR |=(1<<2*9);//将第19,18位置为01(双字节)' A: H+ w1 @3 y
& ^- Z. y! q2 `4 [/ z) a- GPIOF->ODR |=(1<<9);//将第9位置为1(单字节)
9 t* [. o. l' b& b) x - //GPIOF->ODR &=~(1<<9);//将第9位置为0(单字节)6 q1 X! S0 n- R! n$ K9 [3 [" _# _+ \
- * B0 m4 J/ I7 M# @6 r& a) ?9 D
- //PF10,注意移动的位数,每个寄存器都对应引脚10* Q" r2 P! F6 ]+ ]4 g6 r' r0 K
- GPIOF->MODER &=~(3<<2*10);//清零,第21位,20位的值为00
8 h- \9 }% I8 s( }% J0 I - GPIOF->MODER |=(1<<2*10);//置位,第21位,20位的值为014 ~3 T, O' m0 v8 w+ [
- + [1 x, l- D* u
- GPIOF->OTYPER &=~(1<<10);//将第10位清零(单字节)1 N" @! z& Q- _; o0 C, @5 e4 T
- GPIOF->OTYPER |=(0<<10);//将第10位置零(单字节)
' d0 ^1 O+ w* t( r; n7 E - ) _ @# k; H3 H% W
- GPIOF->OSPEEDR &=~(3<<2*10);//将第21,20位清零(双字节)' w- n6 j+ d8 o! C# i, ~
- GPIOF->OSPEEDR |=(2<<2*10);//将第21,20位置为10(双字节)
$ P; T# g* p* |0 C# C
, w6 @) T$ d+ ]' o- GPIOF->PUPDR &=~(3<<2*10);//将第21,20位清零(双字节)
1 U( q. N1 `7 `6 R- U - GPIOF->PUPDR |=(1<<2*10);//将第21,20位置为01(双字节)3 u6 P: W$ j, p
- 5 T0 X, S- Z% o+ G+ n1 d
- GPIOF->ODR |=(1<<10);//将第10位置为1(单字节)
9 J& B- W$ y; P - //GPIOF->ODR &=~(1<<10);//将第10位置为0(单字节)+ E( Q. c3 [+ `2 c4 g) T
- }# h, ]; C2 @5 L* n0 Y$ ~6 [& P
复制代码 ; w3 y* R+ Q' x! E$ `) V
, b2 C# h3 M! O$ h U% _
|