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

STM32零基础入门---IO口操作

[复制链接]
飞行的UPS 发布时间:2019-12-16 14:19
STM32入门之输入输出端口(I/O)操作。众所周知,IO端口操作是单片机的学习基础,如同学习51单片机一般,我们大部分人都是从“点亮一盏灯”开始了解和学习STM32的,本文重点介绍IO端口的配置,以及教你如何点亮一盏灯~

2 @0 \; T4 R( z3 F2 F
一、GPIO工作模式:

1 _& l! k4 K+ O( g" F; @
1.输入配置:浮空(直接输入),上拉,下拉,模拟(AD)
   1)首先,对 I/O 端口进行编程作为输入时,根据图一判断:
3 R: Q5 L% }. u% q2 S
● 输出缓冲器被关闭
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开上拉和下拉电阻
● 输入数据寄存器每隔 1 个AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态

) Q4 F4 L' M1 f
11.jpg

; [4 F  e% n5 z
2.输出:开漏输出,开漏复用输出,推挽式输出,推挽式复用输出
推挽输出:可输出强高低电平,接数字器件
开漏输出:可输出强低电平,高电平需要外部上拉;适合电流型驱动
4种最大输出速度:2M   25M  50M   100M
5V容忍:“FT”(允许输入5V)
2 a/ z7 j4 N) m+ u
1)对 I/O 端口进行编程作为输出时,根据图二判断:
● 输出缓冲器被打开:
— 开漏模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”会使端口保持高组态 (Hi-Z)(P-MOS 始终不激活)。
— 推挽模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”可激活
P-MOS。
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻
● 输入数据寄存器每隔 1 个AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态
● 对输出数据寄存器的读访问可获取最后的写入值

# O7 t4 u5 ^' n7 y, A! v* Y( ]
22.jpg
7 ?1 u/ q% q" A. e$ y8 ]
另外,复用功能和模拟功能在stm32开发过程中也是经常需要用到的,这里另作简要介绍:
4 {5 T+ s6 W8 L1 @1 |" H( q
对 I/O 端口进行编程作为复用功能时:
● 可将输出缓冲器配置为开漏或推挽
● 输出缓冲器由来自外设的信号驱动(发送器使能和数据)
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻
● 输入数据寄存器每隔 1 个AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态
' U4 E$ V5 R0 M- R& W8 h- F8 G
33.jpg
5 T/ J7 d( k# X5 }; e  \8 e) Z
对 I/O 端口进行编程作为模拟配置时:
● 输出缓冲器被禁止。
● 施密特触发器输入停用,I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被强制处理为恒定值 (0)。
● 弱上拉和下拉电阻被关闭。
● 对输入数据寄存器的读访问值为“0”
  g6 p! r$ ^5 T  e+ u1 P4 z; O
44.jpg

  V  _6 o4 Y8 H" N; R
二、相关寄存器

6 k. B$ G$ Z9 ?! ]2 M. i, ^
每组GPIO端口(16个)包括10个寄存器:
1)端口模式寄存器:GPIO_MODER
2)输出类型寄存器:GPIO_OTYPER
3)输出速度寄存器:GPIO_OSPEEDR
4)上拉下拉寄存器:GPIO_PUPDR
5)输入数据寄存器:GPIOx_IDR
6)输出数据寄存器:GPIOx_ODR
7)端口置位复位寄存器:GPIO_BSRR
8)端口配置锁存寄存器:GPIOx_LOCKR
9)10)复位功能寄存器:  GPIOx_AFRL&GPIOx_AFRH)
前四个:32位配置寄存器
5,6个:32位数据寄存器
若配置一个IO需要2个位,则32位寄存器刚好一组16个IO口
若配置一个IO需要1个位,则32位寄存器的高16位保留
BSRR寄存器,高16位BSRRH配置复位状态(为1时复位);BSRRL配置置位

7 s( t5 m8 Q) z
三、GPIO重要函数
3 H% S1 `  A. x8 B8 x* N5 u
初始化:void GPIO_Int (GPIO_TypeDef*GPIOx,GPIO_IntTypeDef*GPIO_InitStruct)
初始化一个或一组IO的工作模式,输出类型,速度及上下拉(及4个配置寄存器)
读取输入电平:unit8_tGPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,unit16_GPIO_Pin);
unit16_tGPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx);
实际操作GPIOx_IDE寄存器
例:unit8_t GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5);
unit8_t GPIO_ReadInputDataBit(GPIOA);
读取输出电平:unit8_t GPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,unit16_GPIO_Pin);
unit16_tGPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx);
实际操作GPIOx_ODE寄存器
例:unit8_tGPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5);
unit16_t GPIO_ReadOutputDataBit(GPIOB);
设置输出电平:voidGPIO_SetBits(GPIO_TypeDef*GPIOx,unit16_t GPIO_Pin);
操作BSRRL寄存器,设置某个IO输出为1
voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,unit16_t GPIO_Pin)
操作BSRRH寄存器,设置某个IO输出为0
voidGPIO_WriteBits(GPIO_TypeDef*GPIOx,unit16_t GPIO_Pin,BitAction BitVal)
voidGPIO_SetBits(GPIO_TypeDef*GPIOx,unit16_t PortVal)
此两个函数不常用,也是设置IO输出电平
外设(包括GPIO)在使用前需要使能对应的时钟

  D5 }$ j  V% K$ J& C% F
四、GPIO初始化例子
7 i0 t9 X8 v4 E
GPIO_Init函数初始化例子:
GPIO_InitTypeDef GPIO_InitStrure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//使能GPIOF时钟
//GPIOF9,F10初始化设置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9 |GPIO_Pin10
GPIO_InitStructure.GPIO_MODE=GPIO_Mode_OUT;普通输出
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;上拉
GPIO_Init(GPIOF,&GPIO_InitStructure);//初始化GPIOF9,10
! k0 u5 P' u6 T7 D7 A" g& V
五、跑马灯设计
4 @- B8 _( m" ?" r, x  y
跑马灯实验步骤:
1)使能时钟RCC_AHB1PeriphClockCmd()
2)初始化IO端口模式,调用函数GPIO_Init();
3)操作IO口,输出高低电平:GPIO_Set();和GPIO_Reset():

2 U) ^9 t( b# f' n+ Q
77.jpg
: T' {4 {4 ?) e) F2 s. w
注意:assert_param();参数有效性判断,可以点开查看函数有效性设置

  ]! P$ f! n  n. C) x, r2 K5 u
By the way:
1.每次工程可在模板下建立,选择需要的头文件和函数即可;
2.需先建立HEARDER文件夹,把自己的.C和.H文件建立并放入,规范工程格式;
3.选择函数,右键选择“GO todefinetiong of 查看变量函数定义的使用方法。

* W6 v* x; j/ `! o- m5 y$ R
7 L+ f' d  H/ C2 ~
: F! u+ `+ g, {1 r
收藏 评论0 发布时间:2019-12-16 14:19

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版