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

浅析STM32之GPIO寄存器(CRL/CRH)配置

[复制链接]
STMCU小助手 发布时间:2022-10-26 22:03
浅析STM32之GPIO寄存器(CRL/CRH)配置" F0 {. q% x1 ^- d! A$ X
一、前言
- @$ D- p% z& u3 l) ?. t3 L- Z
GPIO的配置可以说是STM单片机的一大特色,通过GPIO的配置我们可以进行多种不同模式的输入和输出,并且进行配置的方式也有多种,一般我们在使用的过程中可能大多数都是通过库函数来进行配置的,这样确实也比较方便,但有时候我们也不难免会使用寄存器进行配置,代码可能会更加简洁,所以掌握寄存器的配置对我们来说也很重要。
4 L% z0 {, f: E9 i5 v( L
$ x1 x( p/ J: t& J  B* v) |特别是在进行IIC的数据引脚输入输出配置时寄存器的作用十分重要
, O7 T0 E% e1 V6 X+ c9 X0 f* F* y8 m) \; o+ [( |# o4 u3 e7 S- N
二、寄存器配置分析
6 R" n& O& |# u- M1 t3 O
  1. #define IIC_INPUT_MODE_SET()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
    + i* G8 J9 u) v+ I& i1 B: }
  2. #define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}//改变PB7对应位为0011,设置成通用推挽输出
复制代码
上述代码是我在另一篇博文进行IIC的数据引脚进行输入输出配置的代码,下面我会进行相关寄存器的讲解,然后进行此代码的分析,相信大家会一目了然了。
( i5 H- G; F: s. z: U
$ ]4 O: e6 D: |" F' y8 M在stm32单片机中我们可以发现,单片机的引脚分成了很多组GPIOA~GPIOE,并且每一组中又有0-15共16个引脚,每个IO口由4bit位来控制,那么一组IO就需要16*4 = 64bit,但我们使用的是32位的单片机,所以又将64Bit分成了两部分,高32bit又GPIOX_CRH寄存器来配置,低32bit由GPIOX_CRLj寄存器来进行配置.对应的引脚CRL为0到7CRH为8到15。: f2 e$ a/ u! a$ j
9 }/ e' Y* x5 H) \! t
下面是官方数据手册的内容
; {6 _+ @  u7 ^* W2 [# ^GPIOX_CRL
0 a) U( H  P8 S7 D$ [1 B2 q/ Q3 R9 @- Q( B8 {$ v9 k$ a: Q. y
4f5420b0f4a548148f7a66445e4b093a.png $ f* C5 A) ?6 G- O

% k  N7 [$ M. B+ i5 ]GPIOX_CRH3 t5 h+ }. o! D3 s! N

; t- N- Z6 }+ L( h cf250bafb54f4f96a5d76c2d354d0adc.png
0 s) |* q; s) w9 s% F( D! }$ B$ G7 k# h! N$ I
从上面我们可以看出不管是GPIOX_CRL还是GPIOX_CRH每个IO都是由CNF[1:0]和MODE[1:0]两部分进行配置选择的,其中MODE[1:0]是进行配置输入还是输出一般00为输入 11为输出。CNF[1:0]则配合MODE[1:0]进行具体的模式配置。! Z  Y8 `6 C) _
4 i/ n# R% X- Y4 ]: a) d' @
  1. 譬如GPIOA中的GPIO_Pin_0配置上拉输入模式
    7 s4 v; M1 m, k; r  K
  2. CNF[1:0] 则为10  MODE[1:0] 则为00
    # U# |3 b4 w/ r2 E- ?
  3. GPIOA->CRL &= 0xfffffff0;GPIOA->CRL |= 8;
    ! w, V8 H% X  D0 w  e
  4. 0xfffffff0先进行配置IO清零其余的保持不变,8为1000 相应的IO配置成上拉输入模式
复制代码
3 ]4 j3 h, y8 E4 t& g6 D3 b0 \
三、代码解析
; c6 ?! {( z4 _# C) TGPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;, C- _# b8 w+ i1 {$ w5 W0 X* e8 w. t
首先我们从0x0FFFFFFF这句代码中可以看出我们是进行GPIO_Pin_7配置,先将7引脚Io的控制位清零其余的位保持不变,8 ----->1000 为CNF[1:0] 为10 上拉MODE[1:0] 为00输入则将引脚配置成上拉输入模式 8 << 28 可以看成 1111 1111 1111 1111 1111 1111 1111 1000 左移28位则变成了1000 1111 1111 1111 1111 1111 1111 1111,可以看出就是GPIO_Pin_7引脚进行配置了上拉输入模式。
* a- V+ M/ i2 E7 C, H5 h
! U6 I( g1 h# v5 V3 k& M  q  v7 H同理5 q* B# m6 y4 L- z. T3 ?$ \) K

% s( H4 J. b/ I" z1 M( e- |GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;
( q8 D" ?% T! `& \! F. \首先从0X0FFFFFFF这句代码我们是进行GPIO_Pin_7配置,先将7引脚Io控制位清零其余位保持不变,3------>0011为CNF[1:0] 为00推挽,MODE[1:0]为11输出则将相应的引脚配置成推挽输出,3<<28可以看出1111 1111 1111 1111 1111 1111 1111 0011 左移28位后变成了0011 1111 1111 1111 1111 1111 1111 1111,正好是将GPIO_Pin_7设置成了推挽输出模式  p) ?( U, }" }/ M1 F
————————————————8 z/ d% I7 @' o& ]  ~( m. I4 x
版权声明:@slow-walker- J1 j9 e$ x( ^6 v, M3 L& L- a" v' S

2 {" R5 `  z6 `
收藏 评论0 发布时间:2022-10-26 22:03

举报

0个回答

所属标签

相似分享

官网相关资源

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