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

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

[复制链接]
飞行的UPS 发布时间:2019-12-16 14:19
STM32入门之输入输出端口(I/O)操作。众所周知,IO端口操作是单片机的学习基础,如同学习51单片机一般,我们大部分人都是从“点亮一盏灯”开始了解和学习STM32的,本文重点介绍IO端口的配置,以及教你如何点亮一盏灯~
5 B8 |0 X+ F0 ]' L
一、GPIO工作模式:
  i1 R/ H7 H- |' v5 L1 }
1.输入配置:浮空(直接输入),上拉,下拉,模拟(AD)
   1)首先,对 I/O 端口进行编程作为输入时,根据图一判断:
+ k3 U  R0 i1 W1 r& M
● 输出缓冲器被关闭
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开上拉和下拉电阻
● 输入数据寄存器每隔 1 个AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态

2 R( N4 |3 t5 G1 J/ L
11.jpg
; {, X4 Z2 J6 A3 P5 Q
2.输出:开漏输出,开漏复用输出,推挽式输出,推挽式复用输出
推挽输出:可输出强高低电平,接数字器件
开漏输出:可输出强低电平,高电平需要外部上拉;适合电流型驱动
4种最大输出速度:2M   25M  50M   100M
5V容忍:“FT”(允许输入5V)
; q5 F# L& i$ B" O9 K2 c! _3 D  s
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 c- G" e" d" S1 w* G+ c- C
22.jpg
+ @2 ]+ }5 i9 ?( [. J/ p
另外,复用功能和模拟功能在stm32开发过程中也是经常需要用到的,这里另作简要介绍:
& z8 B& B( `* m5 z
对 I/O 端口进行编程作为复用功能时:
● 可将输出缓冲器配置为开漏或推挽
● 输出缓冲器由来自外设的信号驱动(发送器使能和数据)
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻
● 输入数据寄存器每隔 1 个AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态
$ Z2 _- R: a9 X) _8 J% q# p2 f5 Z
33.jpg
5 e) R: G9 [; b- b2 @& w
对 I/O 端口进行编程作为模拟配置时:
● 输出缓冲器被禁止。
● 施密特触发器输入停用,I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被强制处理为恒定值 (0)。
● 弱上拉和下拉电阻被关闭。
● 对输入数据寄存器的读访问值为“0”
6 g# ~6 _. c! Q8 Y
44.jpg
2 G( F3 A. s, f, V
二、相关寄存器

1 ~  e% I3 C# Z- ?$ h4 ]6 ]8 ^$ 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 P# B4 y2 T6 y5 `# ?
三、GPIO重要函数
' T0 m: a: u8 K1 w  N% k  E" d4 ^9 l7 j
初始化: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)在使用前需要使能对应的时钟

8 b6 W. I# ^6 b
四、GPIO初始化例子

4 ?0 z3 U7 @  q9 s" `/ M1 o
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

  r* w; d' o, y; p4 @
五、跑马灯设计
3 [. o. Y- R% d  n& Q
跑马灯实验步骤:
1)使能时钟RCC_AHB1PeriphClockCmd()
2)初始化IO端口模式,调用函数GPIO_Init();
3)操作IO口,输出高低电平:GPIO_Set();和GPIO_Reset():
7 ^6 Q8 u! C3 w6 O1 I/ N
77.jpg
* B( Y% `$ }& o
注意:assert_param();参数有效性判断,可以点开查看函数有效性设置
3 j% t2 X6 d7 W5 v% `6 }
By the way:
1.每次工程可在模板下建立,选择需要的头文件和函数即可;
2.需先建立HEARDER文件夹,把自己的.C和.H文件建立并放入,规范工程格式;
3.选择函数,右键选择“GO todefinetiong of 查看变量函数定义的使用方法。

% V! ]. Z9 v9 F/ H, O
& `! E% G2 z5 S7 V9 ?, j
6 R* p. K( \& S8 p
收藏 评论0 发布时间:2019-12-16 14:19

举报

0个回答

所属标签

相似分享

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