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

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

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

5 E0 M' Y$ z+ q5 E( R0 d" H2 |
1.输入配置:浮空(直接输入),上拉,下拉,模拟(AD)
   1)首先,对 I/O 端口进行编程作为输入时,根据图一判断:
: [! A( N( o6 M/ F+ q8 o! l
● 输出缓冲器被关闭
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开上拉和下拉电阻
● 输入数据寄存器每隔 1 个AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态
! g7 ?, `+ W$ s' ^0 r, Y1 v
11.jpg

, ^+ n: Z. P& A8 Z3 L. q" I
2.输出:开漏输出,开漏复用输出,推挽式输出,推挽式复用输出
推挽输出:可输出强高低电平,接数字器件
开漏输出:可输出强低电平,高电平需要外部上拉;适合电流型驱动
4种最大输出速度:2M   25M  50M   100M
5V容忍:“FT”(允许输入5V)
! L6 x. ^: c5 F
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 状态
● 对输出数据寄存器的读访问可获取最后的写入值

5 J- x! D& Q3 b3 U
22.jpg
6 A0 y" y9 j- T; c) U
另外,复用功能和模拟功能在stm32开发过程中也是经常需要用到的,这里另作简要介绍:
/ r; R( r# O* b" p& F# k9 v
对 I/O 端口进行编程作为复用功能时:
● 可将输出缓冲器配置为开漏或推挽
● 输出缓冲器由来自外设的信号驱动(发送器使能和数据)
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻
● 输入数据寄存器每隔 1 个AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态

  h, `7 R* d" g% m7 {" ?
33.jpg
# w' i% |, X7 X% t) g0 F& ]
对 I/O 端口进行编程作为模拟配置时:
● 输出缓冲器被禁止。
● 施密特触发器输入停用,I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被强制处理为恒定值 (0)。
● 弱上拉和下拉电阻被关闭。
● 对输入数据寄存器的读访问值为“0”

4 N( Z) ]$ ?% X. C
44.jpg

# v" X& l- e. ]) D. ~' Y
二、相关寄存器
. Y' P6 S, H% x7 K
每组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配置置位

6 d  M# `% R) }( Q
三、GPIO重要函数
7 T$ z0 T& V0 M9 |
初始化: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)在使用前需要使能对应的时钟

4 w$ m' D1 e/ l8 e" U
四、GPIO初始化例子
7 K. ?' R6 Y% Y# ~5 s- [  j0 }1 a' d
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
; t/ h- |/ {8 O
五、跑马灯设计
0 j+ Q% z) `( f1 S/ I
跑马灯实验步骤:
1)使能时钟RCC_AHB1PeriphClockCmd()
2)初始化IO端口模式,调用函数GPIO_Init();
3)操作IO口,输出高低电平:GPIO_Set();和GPIO_Reset():
# r- @2 t5 [5 \- X( U
77.jpg

6 [$ o* \! ]( G# }
注意:assert_param();参数有效性判断,可以点开查看函数有效性设置

6 {. _0 j( c, b
By the way:
1.每次工程可在模板下建立,选择需要的头文件和函数即可;
2.需先建立HEARDER文件夹,把自己的.C和.H文件建立并放入,规范工程格式;
3.选择函数,右键选择“GO todefinetiong of 查看变量函数定义的使用方法。

) v, I2 ^9 C9 K, e8 R) w* n" v$ S9 |4 [; k7 O8 Z5 }

: C5 B; m* ]! T# p+ |5 N3 F2 q
收藏 评论0 发布时间:2019-12-16 14:19

举报

0个回答

所属标签

相似分享

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