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

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

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

# E# f3 |% M" S7 t
1.输入配置:浮空(直接输入),上拉,下拉,模拟(AD)
   1)首先,对 I/O 端口进行编程作为输入时,根据图一判断:
  P1 p$ X+ A. x4 l' D! q# t" ?2 E
● 输出缓冲器被关闭
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开上拉和下拉电阻
● 输入数据寄存器每隔 1 个AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态
5 {+ }# G* j  l) j  h, f! {; ^
11.jpg

$ @# A, `# `! c% f* x" i( a( ?, g
2.输出:开漏输出,开漏复用输出,推挽式输出,推挽式复用输出
推挽输出:可输出强高低电平,接数字器件
开漏输出:可输出强低电平,高电平需要外部上拉;适合电流型驱动
4种最大输出速度:2M   25M  50M   100M
5V容忍:“FT”(允许输入5V)

4 Q- ]: n/ j0 X& L! Q: c
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 状态
● 对输出数据寄存器的读访问可获取最后的写入值
% W4 p- i6 t" x* d/ I0 O* J
22.jpg
* a: X* T6 ^4 K/ J  `
另外,复用功能和模拟功能在stm32开发过程中也是经常需要用到的,这里另作简要介绍:
% y" R) s$ S! I- B" o
对 I/O 端口进行编程作为复用功能时:
● 可将输出缓冲器配置为开漏或推挽
● 输出缓冲器由来自外设的信号驱动(发送器使能和数据)
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻
● 输入数据寄存器每隔 1 个AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态

2 F3 e& a! n' Z; B: O' R
33.jpg
% V/ v/ i: e( H+ P( k1 J
对 I/O 端口进行编程作为模拟配置时:
● 输出缓冲器被禁止。
● 施密特触发器输入停用,I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被强制处理为恒定值 (0)。
● 弱上拉和下拉电阻被关闭。
● 对输入数据寄存器的读访问值为“0”
% _0 r3 L+ [5 A" n
44.jpg

4 v) t, j# h6 v  R
二、相关寄存器
8 W# J! R9 l; c: [* 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配置置位
% O8 F8 A! M& l/ G
三、GPIO重要函数

+ n( {  p6 ~: h- H, A+ n
初始化: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)在使用前需要使能对应的时钟

$ H$ `* S+ h, T8 o5 a, ]
四、GPIO初始化例子
' u6 D; l- l3 c& J+ R7 `
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
, c6 G. K; i8 O3 P% j+ t
五、跑马灯设计
* P6 K- N) I  V7 W) \4 `
跑马灯实验步骤:
1)使能时钟RCC_AHB1PeriphClockCmd()
2)初始化IO端口模式,调用函数GPIO_Init();
3)操作IO口,输出高低电平:GPIO_Set();和GPIO_Reset():
% J" ^& o8 |, W$ T
77.jpg

9 K  h: L! H0 O! L, ?; Z
注意:assert_param();参数有效性判断,可以点开查看函数有效性设置
! U$ _' n1 C  k& y0 o3 J
By the way:
1.每次工程可在模板下建立,选择需要的头文件和函数即可;
2.需先建立HEARDER文件夹,把自己的.C和.H文件建立并放入,规范工程格式;
3.选择函数,右键选择“GO todefinetiong of 查看变量函数定义的使用方法。

* K0 l0 g3 ~4 W6 u% N) l4 W% ~; Y  T/ V4 a4 g! g* U( R

1 E! b) X- U8 L: @7 s' |
收藏 评论0 发布时间:2019-12-16 14:19

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版