stm32-GPIO原理及代码分析

目录

一、输入

1模拟输入:

 2输入上拉:

3输入下拉

4模拟输入

二、输出

1开漏输出

2推挽式输出

3推挽式复用功能

4开漏复用功能

三、GPIO端口初始化

代码注解:

复用时需要函数

失能函数:

输出模式:

四、相关配置函数stm32f10x_gpio.h

设置输出电平函数:

读取输出电平函数:

读取输入电平:


结构图:

我们从上往下看:

我们先看最上面的虚框:

一、输入

1模拟输入:

        I/O口走上路,此时上拉下拉电阻都未打开,直接走自己专属线路。它不过肖特基触发器,就代表他不能用简单的0,1表示。所以它是专属于AD的接口。

 2输入上拉

        我们接通上拉电阻的开关,通过肖特基触发器。那么这个口由于上拉电阻那一路电路就默认高电平。

3输入下拉

        同输入入上拉相同,我们只需稍作改动。将上拉改为下拉。那他就默认了低电平。

4模拟输入

        我们想想我们不上拉,不下拉,不模拟输入。这个电路必然会很容易受到外界影响。

二、输出

        我们先看一个细节,输入输出殊途同归最后到了一条线。也就是说,我们输出的同时一些输入点路的寄存器也可以用。

1开漏输出

        也就是P-MOS屏蔽掉。N-MOS发挥作用(低电平有效P相反)也就是说他只可以输出低电平。除非电路外接上拉电阻。(通信使用iic之类)

2推挽式输出

        两个mos管都有效,既可以输出高电平也可以输出低电平。

3推挽式复用功能

4开漏复用功能

        这两个除了由片上外设控制外和普通的都一样。
我们将输入和输出写道一个结构体中。
        我们得到代码:
typedef enum
{ GPIO_Mode_AIN = 0x0,
  GPIO_Mode_IN_FLOATING = 0x04,
  GPIO_Mode_IPD = 0x28,
  GPIO_Mode_IPU = 0x48,
  GPIO_Mode_Out_OD = 0x14,
  GPIO_Mode_Out_PP = 0x10,
  GPIO_Mode_AF_OD = 0x1C,
  GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;

日常使用我们只需调用即可。

例如:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP

三、GPIO端口初始化

模板:

GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE);//打开时钟,选择挂载总线,端口//使能Px 端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;//PA15端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//选择输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//选择IO口速度
GPIO_Init(GPIOA,&GPIO_InitStructure);//写入
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE);//使能Px 端口时钟

代码注解:

STM32Fxx内部集成了很多的外设控制器,比如USART、SPI、bxCAN等等,这些外设控制器,也需要通过引脚与外设连接。复用功能是相对于单片机的引脚而言的。所谓“复用功能”,是指单片机的引脚既可以做普通GPIO使用,也可以作为内部外设控制器的引脚来使用。

复用时需要函数

GPIO_PinRemapConfig

函数GPIO_PinRemapConfig(u32GPIO_Remap, FunctionalState NewState);改变指定管脚的映射,很多复用功能的引出脚可以通过重映射,从不同的I/O管脚引出,即复用功能的引出脚位是可通过程序改变的。

举例GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);   // 改变指定管脚的映射 GPIO_Remap_SWJ_Disable,SWJ 完全禁用(JTAG+SW-DP),而且管脚映射函数,需要在GPIO配置函数GPIO_Configuration()中

失能函数:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE);

输出模式:

浮空输入_IN_FLOATING 上拉输入_IPU 下拉输入_IPD 模拟输入_AIN 开漏输出_OUT_OD 推挽输出_OUT_PP 开漏 复用输出_AF_OD 推挽复用输出_AF_PP

推挽输出:可以输出强高低电平,连接数字器件

开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极.要得到高电平状态需要上拉电阻才行.适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);

四、相关配置函数stm32f10x_gpio.h

设置输出电平函数:

GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//对应引脚输出高电平
GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//对应引脚输出低电平

读取输出电平函数:

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读取一个
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);//读取一组

读取输入电平:

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小趴菜学习记录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值