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

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

[复制链接]
STMCU小助手 发布时间:2022-7-5 17:19
选自,STM32F4之寄存器实现跑马灯实验
" A& e7 F9 _+ t* O# r. o# E" E. p: Q, K) _+ s$ j
  1. 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 [)J[$D`Y{WSH$(DK@Q$L`KN.png
* w: G5 u, X  m1 G% z& s% p7 t( [4 p/ [/ M4 ?. w" i
将OTYPER9配置为OTYPER9=0(输出推挽)单字节
  1. GPIOF->OTYPER &=~(1<<9)//将第9位清零(单字节)
    - q' _6 u9 E/ `
  2. 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
6`26){OSB(80REG])`_9(KA.png 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! `
  1. GPIOF->OSPEEDR &=~(3<<2*9)//将第18,19位清零(双字节)
    ' {" Y. d% s/ y! _9 [
  2. 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
P(U(Q0R1%)IEDV0$C~O2)44.png / f" A, a( g) J: E# c
& i. g5 J! \, x5 j2 q
将PUPDR寄存器配置为01,PUPDR9=01(上拉)
  1. GPIOF->PUPDR &=~(3<<2*9)//将第18,19位清零(双字节)
    , Z* Y  B1 l1 R" g6 h5 O
  2. 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
PUA)E[03KY2V9_HAX{C$%_U.png
' ], |  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
  1. GPIOF->ODR |=(1<<9)//将第9位置为1(单字节)
    ' b3 `7 T* Q6 Y! V7 y1 e
  2. //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
_JHVAV}([F6@)@1[(HQG86Q.png
& c5 N5 B! y! u" Y& _" U* \
2 E0 D. i9 u; l+ D; Y: l# {. W3 O
  1. 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
  1. #include"led.h"
    6 H3 y( _  v; Q! `2 l7 a
  2. #include"STM32F4XX.h"
    4 U9 I4 _! `* ^6 `. b2 q
  3. void LED_Init(void)& J! {% W- R+ ?* ]+ \/ Y' I7 a
  4. {
    6 E: @2 c; Z* S; M% U& ?) }
  5. RCC->AHB1ENR |=1<<5;$ Y: O. @2 ~( Q2 _4 H* {
  6. ) C% n; [1 h1 I, `5 Q+ N2 n
  7. //PF9. b, ]% b( B+ j
  8. GPIOF->MODER &=~(3<<2*9);//清零,第19位,18位的值为00
      {& r3 A9 t+ f( L' M, i! {1 O
  9. GPIOF->MODER |=(1<<2*9);//置位,第19位,18位的值为01
    ; e  W) l0 L' N- {- f5 a' X

  10. 1 I8 p3 h" g4 h5 {$ m2 m
  11. GPIOF->OTYPER &=~(1<<9);//将第9位清零(单字节)
    " q2 J! U) Z4 s- v
  12. GPIOF->OTYPER |=(0<<9);//将第9位置零(单字节)
    ) P* g/ h/ G) M$ Y* S1 ^

  13. 8 r' ?$ K+ c  H3 M8 W1 n3 t+ `
  14. GPIOF->OSPEEDR &=~(3<<2*9);//将第18,19位清零(双字节), I6 T* L3 Z- L  m7 ?
  15. GPIOF->OSPEEDR |=(2<<2*9);//将第19,18位置为10(双字节)% X& c6 Y' k) v( m: y
  16. % ^" j0 }1 E. E7 [2 S
  17. GPIOF->PUPDR &=~(3<<2*9);//将第18,19位清零(双字节)
    , P6 c4 f; w  g
  18. GPIOF->PUPDR |=(1<<2*9);//将第19,18位置为01(双字节)' A: H+ w1 @3 y

  19. & ^- Z. y! q2 `4 [/ z) a
  20. GPIOF->ODR |=(1<<9);//将第9位置为1(单字节)
    9 t* [. o. l' b& b) x
  21. //GPIOF->ODR &=~(1<<9);//将第9位置为0(单字节)6 q1 X! S0 n- R! n$ K9 [3 [" _# _+ \
  22. * B0 m4 J/ I7 M# @6 r& a) ?9 D
  23. //PF10,注意移动的位数,每个寄存器都对应引脚10* Q" r2 P! F6 ]+ ]4 g6 r' r0 K
  24. GPIOF->MODER &=~(3<<2*10);//清零,第21位,20位的值为00
    8 h- \9 }% I8 s( }% J0 I
  25. GPIOF->MODER |=(1<<2*10);//置位,第21位,20位的值为014 ~3 T, O' m0 v8 w+ [
  26. + [1 x, l- D* u
  27. GPIOF->OTYPER &=~(1<<10);//将第10位清零(单字节)1 N" @! z& Q- _; o0 C, @5 e4 T
  28. GPIOF->OTYPER |=(0<<10);//将第10位置零(单字节)
    ' d0 ^1 O+ w* t( r; n7 E
  29. ) _  @# k; H3 H% W
  30. GPIOF->OSPEEDR &=~(3<<2*10);//将第21,20位清零(双字节)' w- n6 j+ d8 o! C# i, ~
  31. GPIOF->OSPEEDR |=(2<<2*10);//将第21,20位置为10(双字节)
    $ P; T# g* p* |0 C# C

  32. , w6 @) T$ d+ ]' o
  33. GPIOF->PUPDR &=~(3<<2*10);//将第21,20位清零(双字节)
    1 U( q. N1 `7 `6 R- U
  34. GPIOF->PUPDR |=(1<<2*10);//将第21,20位置为01(双字节)3 u6 P: W$ j, p
  35. 5 T0 X, S- Z% o+ G+ n1 d
  36. GPIOF->ODR |=(1<<10);//将第10位置为1(单字节)
    9 J& B- W$ y; P
  37. //GPIOF->ODR &=~(1<<10);//将第10位置为0(单字节)+ E( Q. c3 [+ `2 c4 g) T
  38. }# h, ]; C2 @5 L* n0 Y$ ~6 [& P
复制代码
; w3 y* R+ Q' x! E$ `) V
, b2 C# h3 M! O$ h  U% _
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 手机版