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

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

[复制链接]
STMCU小助手 发布时间:2022-7-5 17:19
选自,STM32F4之寄存器实现跑马灯实验
: C  w) I. u3 K8 d- N! v7 L4 E' y/ J
+ A7 s4 l; c6 o/ y" U6 l2 v/ {
  1. 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
[)J[$D`Y{WSH$(DK@Q$L`KN.png " d6 t! b8 t; F+ a, y$ w
9 f6 `" I2 T6 `/ z8 S
将OTYPER9配置为OTYPER9=0(输出推挽)单字节
  1. GPIOF->OTYPER &=~(1<<9)//将第9位清零(单字节)
    ) W2 I6 r$ z% [7 b$ I( A3 ~
  2. GPIOF->OTYPER |=(0<<9)//将第9位置零(单字节)
复制代码
1 k1 [* B* [4 v1 \
三、GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR)
( ~: r& L9 a* C; f1 v! K
( J" F. D1 V1 ^ 6`26){OSB(80REG])`_9(KA.png
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
  1. GPIOF->OSPEEDR &=~(3<<2*9)//将第18,19位清零(双字节)* ?9 I6 C" t; O
  2. 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 P(U(Q0R1%)IEDV0$C~O2)44.png
; k; f' q% e5 s' ^9 D& G4 j5 h7 O- K5 U4 c* U. `
将PUPDR寄存器配置为01,PUPDR9=01(上拉)
  1. GPIOF->PUPDR &=~(3<<2*9)//将第18,19位清零(双字节)
    * g& _4 x/ I% n5 J; @7 v
  2. 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
PUA)E[03KY2V9_HAX{C$%_U.png
/ 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
  1. GPIOF->ODR |=(1<<9)//将第9位置为1(单字节)
    " D4 N9 A- X% n. z
  2. //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
_JHVAV}([F6@)@1[(HQG86Q.png
  [6 P- b2 U3 [: P) U6 z& U/ U! z% }5 ?+ e
  1. 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
  1. #include"led.h"; ]/ _8 _4 S& O3 _" F( b* \
  2. #include"STM32F4XX.h"
    7 o9 @& }) `! J/ \
  3. void LED_Init(void)
    ( j3 e: x" s5 W- q
  4. {0 A) T7 J8 n2 m9 \0 \! I  W, |
  5. RCC->AHB1ENR |=1<<5;1 X: z& r. j, X8 u1 {& m) L4 p

  6. ! X$ ]  |( M! {5 x- d# K5 T
  7. //PF9# \1 e# Q, A6 Y9 n1 x8 d% o
  8. GPIOF->MODER &=~(3<<2*9);//清零,第19位,18位的值为00$ e- n2 q; D% H2 j  O
  9. GPIOF->MODER |=(1<<2*9);//置位,第19位,18位的值为01
    % q: L9 |6 `: Z$ q  @4 A" J6 l
  10. " Z% [7 |( A! o$ T8 z
  11. GPIOF->OTYPER &=~(1<<9);//将第9位清零(单字节)# F" q, v2 \9 _/ E; L: Q
  12. GPIOF->OTYPER |=(0<<9);//将第9位置零(单字节)
    3 ]  Z7 _! M% z9 x
  13. ; l$ B0 U6 S! A) i; |& N
  14. GPIOF->OSPEEDR &=~(3<<2*9);//将第18,19位清零(双字节)9 I  t  m5 E) i- d/ C8 p; K
  15. GPIOF->OSPEEDR |=(2<<2*9);//将第19,18位置为10(双字节)+ }4 Z- Q$ x2 Q4 b9 u5 h3 r

  16. - X8 b$ f) @* L- ~$ S" y$ C
  17. GPIOF->PUPDR &=~(3<<2*9);//将第18,19位清零(双字节)9 a9 `3 \6 z" F" V9 J" P
  18. GPIOF->PUPDR |=(1<<2*9);//将第19,18位置为01(双字节)
    0 X, Z% o& O7 N) v" t
  19. + \/ v$ X9 d5 s( ~$ s+ u9 w
  20. GPIOF->ODR |=(1<<9);//将第9位置为1(单字节)  b- P7 ^' ?3 \2 `7 q/ {
  21. //GPIOF->ODR &=~(1<<9);//将第9位置为0(单字节)+ ~- y& b2 y9 d2 C0 N$ X( ^
  22. 5 p% M# @, R0 z- N2 J2 r
  23. //PF10,注意移动的位数,每个寄存器都对应引脚10& [0 `! |0 ~7 M+ g
  24. GPIOF->MODER &=~(3<<2*10);//清零,第21位,20位的值为00( m( \7 _1 x. i8 v, f
  25. GPIOF->MODER |=(1<<2*10);//置位,第21位,20位的值为01' T, e' q% H! Z% d9 X, _
  26. ( ~" c) U+ [  y5 v' U) `
  27. GPIOF->OTYPER &=~(1<<10);//将第10位清零(单字节)
    $ g6 g% H. @5 Z# s0 T( ]1 a% p
  28. GPIOF->OTYPER |=(0<<10);//将第10位置零(单字节): S( `* C! L- F9 d2 k! a( q8 G1 w6 }
  29. : V: B' U0 K1 h: O1 ?: h# @4 M2 v8 B
  30. GPIOF->OSPEEDR &=~(3<<2*10);//将第21,20位清零(双字节)+ k0 N( x2 D3 x$ k$ Z! J, D
  31. GPIOF->OSPEEDR |=(2<<2*10);//将第21,20位置为10(双字节)
      P6 j% |. c+ g9 [: Q4 h

  32. - I3 y9 P1 B& E; A& f+ |9 A
  33. GPIOF->PUPDR &=~(3<<2*10);//将第21,20位清零(双字节)
    : S& w/ [5 t7 Z+ R
  34. GPIOF->PUPDR |=(1<<2*10);//将第21,20位置为01(双字节): Y5 G1 d" i5 x* z1 u$ \
  35. ; v! L: ?& t6 j9 Y% H
  36. GPIOF->ODR |=(1<<10);//将第10位置为1(单字节)
    4 q7 |3 {0 i& `$ K: c
  37. //GPIOF->ODR &=~(1<<10);//将第10位置为0(单字节): K3 m" _& [% x, r4 q9 n& K: U
  38. }
    $ G- M) ^5 T) p$ u" u% y  E
复制代码

3 Q. k/ W* ~, {! t& S2 ?3 p8 E0 _* w% B/ c" d3 L, }
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 手机版