一、对IO的单个引脚操作,采用宏定义较为方便
(1)对单个IO的单个引脚基本操作,下面采用宏定义的例子
#define DS18B20_BIT GPIO_Pin_2 //宏定义GPIO_Pin_2引脚新名为DS18B20_BIT,也可以为其他名称
#define DS18B20_PORT GPIOC ////宏定义GPIOC端口新名为DS18B20_PORT,也可以为其他名称
#define READ_DS18B20() GPIO_ReadInputDataBit(DS18B20_PORT, DS18B20_BIT)//读取端口DS18B20_PORT的DS18B20_BIT位状态 GPIO_ReadInputDataBit()为库函数,不用自己写
#define DIR_1WIRE_IN() {DS18B20_PORT->CRL &= 0xFFFFF0FF;DS18B20_PORT->CRL |= 0x00000400;}//设置DS18B20_PORT的第2个IO引脚为输入模式,CRL寄存器仅能设置端口的低8个引脚,高8个用CRH,详见手册113页
#define DIR_1WIRE_OUT() {DS18B20_PORT->CRL &= 0xFFFFF0FF;DS18B20_PORT->CRL |= 0x00000300;}////设置DS18B20_PORT的第2个IO引脚为输出模式
#define CLR_OP_1WIRE() GPIO_ResetBits(DS18B20_PORT, DS18B20_BIT)//设置端口DS18B20_PORT的DS18B20_BIT位为0
#define SET_OP_1WIRE() GPIO_SetBits(DS18B20_PORT, DS18B20_BIT)//设置端口DS18B20_PORT的DS18B20_BIT位为1
(2)设置端口IO方向
1) 其中设置端口方向输入的方式为a或b
a)
DIR_1WIRE_IN()
b)
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//此处有其他参数可以选择,参见固件库说明和手册说明
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//此处有其他参数可以选择,参见固件库说明和手册说明
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
2) 其中设置端口方向输出的方式为a或b
a)
DIR_1WIRE_OUT()
b)
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
3)使用DIR_1WIRE_IN()和DIR_1WIRE_OUT() 时这两个函数在设置对应端口时,应根据DS18B20_BIT的对应位设置与或的参数。上面例子因为是对DS18B20_PORT的DS18B20_BIT位操作,DS18B20_BIT实际对应Pin_2即第2个引脚,所以修改位置为倒数第3个f处(倒数第3个f为Pin_2对应位置,倒数第1个f为Pin_0对应位置)
3)如果读取IO,先设置为输入模式,再读取
DIR_1WIRE_IN()
READ_DS18B20()
即实现了读取DS18B20_PORT端口的DS18B20_BIT的数据
(4)如果设置为输出状态,在先设置输出模式,在向外输出
DIR_1WIRE_OUT()
输出1则为SET_OP_1WIRE()
输出0则为CLR_OP_1WIRE()
(5)如果先设置为输出,输出1,再设置为输入,读取输入,则为
DIR_1WIRE_OUT()
输出1则为SET_OP_1WIRE()
DIR_1WIRE_IN()
READ_DS18B20()
(6)如果先设置为输出,输出1,再设置为输入,读取输入,则为
DIR_1WIRE_IN()
READ_DS18B20()
DIR_1WIRE_OUT()
输出1则为SET_OP_1WIRE()
二、对同一端口的多个IO一块操作
(1)设置同一端口的多个IO设置输入方向和模式
设置端口IO的多个引脚为输入,如果程序中一直为输入,则在程序初始化时设置一次即可
例如设置DS18B20_PORT端口的引脚5,3为输入
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_3 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//此处有其他参数可以选择,参见固件库说明和手册说明
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//此处有其他参数可以选择,参见固件库说明和手册说明
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
(2)对某个IO端口的多位读取
如果对某个IO端口的多位读取,这几个IO已经设置成输入
则采用GPIO_ReadInputData(DS18B20_PORT);//读取端口DS18B20_PORT
然后采用与或形式得到对应的若干位
例如想获得PIN_2的数据,可以采用
result1=GPIO_ReadInputData(DS18B20_PORT); //参见库函数stm32f10x_gpio.c
result2=result1&DS18B20_BIT;
其他依次类推,或者简单的,读取最低的两位1,0端口数据
result2=result1&0x3;//
(3)设置同一端口的多个IO设置输出方向和模式
设置端口IO的多个引脚为输入,如果程序中一直为输出,则在程序初始化时设置一次即可
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_3 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
(4)向某个端口的若干个引脚写数据
如果向某个端口的若干个引脚写数据,这几个IO已经设置成输出,
则先采用与或的形式把需要操作的若干位置成对应形式,不需操作的位保持原来不变
1)例如向端口的引脚5,3写数据1,1
则为
result1=GPIO_ReadOutputData(DS18B20_PORT);//读取DS18B20_PORT的输出数据,参见库函数stm32f10x_gpio.c,手册参见115页
result2=0x0028;//设置引脚5,3为1,1
result1&=0xffd7;//引脚5,3先清零,同时获取其他引脚的原始状态
result1=result1|result2;//设置引脚5,3为1,1 ;其他引脚不变
2)例如向端口的引脚5,3写数据1,0
result1=GPIO_ReadOutputData(DS18B20_PORT);//读取DS18B20_PORT的输出数据,参见库函数stm32f10x_gpio.c,手册参见115页
result2=0x0020;//设置引脚5,3为1,0,此处注意与上面的区别
result1&=0xffd7;//引脚5,3先清零,同时获取其他引脚的原始状态
result1=result1|result2;//设置引脚5,3为1,0 ;其他引脚不变
(5)如果程序中某端口的若干引脚即作为输入有又作为输出
如果先输入再输出,则是 (1)(2)(3)(4)的顺序
如果先输出再输入,则是 (4)(3)(2)(1)的顺序
关键字:GPIO 引脚操作 宏定义
引用地址:
GPIO的操作
推荐阅读最新更新时间:2024-03-16 14:38
LPC1768之中断
一外中断:只有特定的4个外中断引脚, 1 在特定的引脚上,引脚功能要选对应的外中断功能 2设定的触发条件(高低电平、上升/下降沿) 3 NVIC设定,特定的通道。 二GPIO中断: 1只有GPIO0和GPIO2上的引脚,且与外中断3共用NVIC通道。即NVIC设置、中断使能、中断函数名、清楚NVIC中断标记都是用EXIT3_IRQ 2只能配置成上升沿、下降沿中断、总中断(先判断是那个端口、然后判断是那个位中断)。(异步检测无需电平可在掉电情况下使用。) 3管脚配置成通用的输入输出。参考http://www.mamicode.com/info-detail-516502.html 三引脚上的特殊中断:如定时器捕获CAP0/1
[单片机]
GPIO初始化之PB3/PB4/PA13/PA14/PA15引脚的复用
说明:库文件版本:3.5.0 1.为什么要复用PB3/PB4/PA13/PA14/PA15 在mcu复位的时候这几个引脚被作为jtag的功能。当我们要使用这些引脚作为普通的I/O时必须进行引脚的功能复用。 2.PB3/PB4/PA13/PA14/PA15引脚默认功能参照 PB3-----------------JTDO PB4-----------------JNTRST PA13-----------------JTMS PA14-----------------JTCK PA15-----------------JTDI 3.重映射的方法: 通过设置复用重映射和调试I/O配置寄存器
[单片机]
STM32F4开发板----GPIO(001)
STM32F4开发板快速入门—-GPIO篇 GPIO 设置输入/出总共8种模式 * 输入浮空,输入上拉,输入下拉,模拟输入。 * 开漏输出,推挽输出,推挽复用共功能,开漏复用功能 模式选择的话,一般得看具体电路了,具体看输入的信号,比如接低电平信号,上拉成高电平,接高电平信号下拉成低电平。 初始化参数 /** * @brief GPIO Init structure definition */ typedef struct { uint32_t GPIO_Pin; /*! Specifies the GPIO pins to be configured.
[单片机]
STM32的四种输出模式
1、普通推挽输出(GPIO_Mode_Out_PP): 使用场合:一般用在0V和3.3V的场合。线路经过两个P_MOS 和N_MOS 管,负责上拉和下拉电流。 使用方法:直接使用 输出电平:推挽输出的低电平是0V,高电平是3.3V。 2、普通开漏输出(GPIO_Mode_Out_OD): 使用场合:一般用在电平不匹配的场合,如需要输出5V的高电平。 使用方法:就需要再外部接一个上拉电阻,电源为5V,把GPIO设置为开漏模式, 当输出高组态时,由上拉电阻和电源向外输出5V的电压。 输出电平:在开漏输出模式时,如果输出为0,低电平,则使N_MOS 导通,使输 出接地。若控制输出为1(无法直接输出高电平),则
[单片机]
stm32专题三:位带操作—GPIO输出和输入
位带操作其实很简单,就是把位带区某寄存器的特定位,用公式给映射到位带别名区的32位地址上,该地址在编译器看来是个立即数,因此需要强制类型转换成32位地址指针,最后对指针取值操作。 特别值得注意的是,在强制类型转换成地址时,一定要加volatile关键词,不然一定会被编译器level-3优化掉,导致程序出错。博主一开始是直接使用(unsigned int *),然后在这里调试了很久,一直没发现问题所在,突然想到三级优化,加上volatile后程序正常执行。 以下是位带宏定义和输入—输出测试代码, #include stm32f10x.h #include bsp_led.h #include bsp_key.h
[单片机]
STM32 GPIO的输入输出-HAL库
本文将介绍STM32基于HAL库的GPIO使用,利用上文创建好的HAL库工程模板,可以方便的编写应用程序。 我们目标是编写一个LED灯和按键的使用例子,每按下一次按键,LED的亮灭状态将进行一次反转。 1. LED软件设计 我们创建 led.h 和 led.c 在工程模板的inc和src文件夹中。 1.1 头文件定义 该模块代码作用是防止在某一个代码文件中引入多个.h文件时,防止重复引入同一个.h文件,如果重复引入的话,在编译时候汇报“redefine”错误。 ifndef 全称是 if not define ,当在一个代码中第一次引入led.h文件时__LED_H未定义,则代码会继续往下执行,同时定义了__LED
[单片机]
STM32的GPIO输入输出的几种模式的总结
最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD开漏输出 (6)GPIO_Mode_Out_PP推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但一直未曾对这些做过归纳。因此,在这里做一个总结:
[单片机]
STM32单片机GPIO寄存器
每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分别控制每个端口的高八位和低八位,如果IO口是0-7号的话,则写CRL寄存器,如果IO口是8-15号的话,则写CRH寄存器,两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR)一个是只读作输入数据寄存器,一个是只写作输出寄存器,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。常用的IO端口寄存器只有四个:CRH,CRL,IDR,ODR。 数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。每个I/
[单片机]