你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32学习笔记之寄存器代码解析(F4)

[复制链接]
STMCU小助手 发布时间:2022-7-5 17:19
选自,STM32F4之寄存器实现跑马灯实验
8 a6 [  t3 @( |6 q, Y0 D4 K3 {1 G" `0 t# [- W( k% q4 K/ Z; m
  1. 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
[)J[$D`Y{WSH$(DK@Q$L`KN.png
% W& _6 ?4 n# G8 s. P- E4 W/ m3 W2 m7 m, [
将OTYPER9配置为OTYPER9=0(输出推挽)单字节
  1. GPIOF->OTYPER &=~(1<<9)//将第9位清零(单字节)- _# H0 u) t7 B: I
  2. 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; ? 6`26){OSB(80REG])`_9(KA.png
% 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
  1. GPIOF->OSPEEDR &=~(3<<2*9)//将第18,19位清零(双字节)" {$ v3 z) L( {/ m8 Q* T
  2. 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
P(U(Q0R1%)IEDV0$C~O2)44.png
$ W: J, e7 P" a6 W3 `6 ^) T! ]
- e' {6 B6 b8 ^8 n0 n; I7 _将PUPDR寄存器配置为01,PUPDR9=01(上拉)
  1. GPIOF->PUPDR &=~(3<<2*9)//将第18,19位清零(双字节)
    5 A% X6 V* \3 W9 X: M8 ~& {
  2. 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 ]
PUA)E[03KY2V9_HAX{C$%_U.png
& 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
  1. GPIOF->ODR |=(1<<9)//将第9位置为1(单字节)
    * M8 B+ a6 [! U, s% v) N& b( }% U+ ^$ a9 E
  2. //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
_JHVAV}([F6@)@1[(HQG86Q.png
* l! p( X% S4 |# r. p' i
/ @8 S4 }7 M: B$ o; E& L# k
  1. 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
  1. #include"led.h"
    2 w' r0 `4 v4 ^0 X5 n
  2. #include"STM32F4XX.h"
    ( B, a- \* U1 n' m
  3. void LED_Init(void)0 I6 T% u+ T; S6 {/ i0 j4 V7 P
  4. {
    ' M' U4 D+ X$ T  r: S
  5. RCC->AHB1ENR |=1<<5;
    7 a' K: C+ [- H' r' w: _

  6. ( O: V  \/ [% w
  7. //PF93 j8 E+ e, L$ G8 F
  8. GPIOF->MODER &=~(3<<2*9);//清零,第19位,18位的值为00% C6 p* s! F. L7 l+ T6 r: D- x+ S! }
  9. GPIOF->MODER |=(1<<2*9);//置位,第19位,18位的值为01, K9 C! O$ t/ i7 E  |
  10. 5 ?+ X# j0 J) V* ?: t: O
  11. GPIOF->OTYPER &=~(1<<9);//将第9位清零(单字节), q2 @- C( D1 ~# q
  12. GPIOF->OTYPER |=(0<<9);//将第9位置零(单字节)
    ( n' T$ I, [6 ]" F. m& v& g# e! p

  13. 4 S* W! F, Y( k4 n8 t! D9 d! _* z/ s
  14. GPIOF->OSPEEDR &=~(3<<2*9);//将第18,19位清零(双字节)
    ) o% F# X) H: C% s
  15. GPIOF->OSPEEDR |=(2<<2*9);//将第19,18位置为10(双字节)
    2 Y4 [" ?6 b7 s7 S2 \8 v
  16. 4 ]4 r* x5 P$ K+ f! w& x/ `
  17. GPIOF->PUPDR &=~(3<<2*9);//将第18,19位清零(双字节)
    7 {' k9 k2 F8 ]
  18. GPIOF->PUPDR |=(1<<2*9);//将第19,18位置为01(双字节)6 t( o6 a# G2 L5 b3 S

  19. 5 w2 H; t- q" a) }6 t
  20. GPIOF->ODR |=(1<<9);//将第9位置为1(单字节)% ]2 U( N5 M( m' E  E2 A4 B) P
  21. //GPIOF->ODR &=~(1<<9);//将第9位置为0(单字节)
    4 [" Q# B+ M0 t& z9 l9 s. r8 q
  22. : j) P# E6 M, B/ Y4 X
  23. //PF10,注意移动的位数,每个寄存器都对应引脚10, o& `1 g+ u& X1 _  k, Y+ W
  24. GPIOF->MODER &=~(3<<2*10);//清零,第21位,20位的值为000 }: l% R: _: ^1 w# r( p& D
  25. GPIOF->MODER |=(1<<2*10);//置位,第21位,20位的值为01
    1 u- a" k8 x7 o" p; S
  26. ; j+ y7 u" |; B. |, O, O1 [
  27. GPIOF->OTYPER &=~(1<<10);//将第10位清零(单字节)* Q# Z- Q( U! |  ^# B
  28. GPIOF->OTYPER |=(0<<10);//将第10位置零(单字节)9 U. {1 g& F, S) Q  z0 i
  29. + |2 e+ _2 h* H% L9 g" p
  30. GPIOF->OSPEEDR &=~(3<<2*10);//将第21,20位清零(双字节)  G% X% J( ]1 g7 {- H
  31. GPIOF->OSPEEDR |=(2<<2*10);//将第21,20位置为10(双字节)
    7 q& h* A+ ?* i( L8 R; i6 Z+ L) a  }2 @

  32. ) Z/ N& _7 [3 {2 g! d
  33. GPIOF->PUPDR &=~(3<<2*10);//将第21,20位清零(双字节). j/ x( }4 G, F! Z* d8 k
  34. GPIOF->PUPDR |=(1<<2*10);//将第21,20位置为01(双字节)
    7 K; C% o& l; o
  35. / a' F! k( V# k2 w1 K
  36. GPIOF->ODR |=(1<<10);//将第10位置为1(单字节)+ Q8 f' D7 C0 @- B
  37. //GPIOF->ODR &=~(1<<10);//将第10位置为0(单字节)
    - r2 C0 U( o  K; Q, U
  38. }
      Y9 Q6 ~/ a" K5 B
复制代码

7 ]8 k5 c+ u4 R+ ?* _8 K. Y9 s* d8 @  g" d. W  v
UOFMMAN2GC27EB3D~[TLM~9.png
收藏 评论0 发布时间:2022-7-5 17:19

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版