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

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

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

9 h2 j( e  t) S" n0 ~! a
一、GPIO工作模式:

" R3 y* g8 C+ m& h1 o9 }
1.输入配置:浮空(直接输入),上拉,下拉,模拟(AD)
   1)首先,对 I/O 端口进行编程作为输入时,根据图一判断:

' n) H; |2 e( \, @
● 输出缓冲器被关闭
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开上拉和下拉电阻
● 输入数据寄存器每隔 1 个AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态
; r: e$ b0 N# R/ Z  I
11.jpg
5 y) i% l6 H! S& r( K9 f+ S
2.输出:开漏输出,开漏复用输出,推挽式输出,推挽式复用输出
推挽输出:可输出强高低电平,接数字器件
开漏输出:可输出强低电平,高电平需要外部上拉;适合电流型驱动
4种最大输出速度:2M   25M  50M   100M
5V容忍:“FT”(允许输入5V)
7 D, s' ]" T/ V8 b  t
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 状态
● 对输出数据寄存器的读访问可获取最后的写入值
( g' z% b9 m5 F9 `% i6 b# ~7 C
22.jpg
+ t, t$ s3 E: g' Q7 a  g9 C
另外,复用功能和模拟功能在stm32开发过程中也是经常需要用到的,这里另作简要介绍:

* @2 ~; S& x6 A' g! C  t3 Y
对 I/O 端口进行编程作为复用功能时:
● 可将输出缓冲器配置为开漏或推挽
● 输出缓冲器由来自外设的信号驱动(发送器使能和数据)
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻
● 输入数据寄存器每隔 1 个AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态

; T  b( d+ u3 G- o
33.jpg
9 B+ X( I3 C% a! |
对 I/O 端口进行编程作为模拟配置时:
● 输出缓冲器被禁止。
● 施密特触发器输入停用,I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被强制处理为恒定值 (0)。
● 弱上拉和下拉电阻被关闭。
● 对输入数据寄存器的读访问值为“0”
1 z8 w) S( @# R& y& v: M3 G+ i
44.jpg
8 n6 M+ P3 h8 R" H' r7 p. W
二、相关寄存器

2 o  w1 }. s6 t( N& @( O
每组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配置置位
5 }; v" ^# Q8 U+ z- G  p  v
三、GPIO重要函数

0 y/ G% U* Q# a* a
初始化: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)在使用前需要使能对应的时钟
$ J+ v6 R! B( w
四、GPIO初始化例子
/ H8 y7 f7 I$ S- F
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

+ L8 t5 z  I4 d' A
五、跑马灯设计
- G  |8 J5 Z+ ~0 w# r8 A# ~& X. a
跑马灯实验步骤:
1)使能时钟RCC_AHB1PeriphClockCmd()
2)初始化IO端口模式,调用函数GPIO_Init();
3)操作IO口,输出高低电平:GPIO_Set();和GPIO_Reset():

- O& H- U- L8 {; ?5 S
77.jpg

' @* y& |- d( R1 }$ V
注意:assert_param();参数有效性判断,可以点开查看函数有效性设置

, i& u1 {+ ]' t' W* s
By the way:
1.每次工程可在模板下建立,选择需要的头文件和函数即可;
2.需先建立HEARDER文件夹,把自己的.C和.H文件建立并放入,规范工程格式;
3.选择函数,右键选择“GO todefinetiong of 查看变量函数定义的使用方法。
0 k1 H1 p& @4 i3 u

8 n- \- y8 i* u$ I8 G; M8 @# }% P8 F! v9 h& Q
收藏 评论0 发布时间:2019-12-16 14:19

举报

0个回答

所属标签

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