×
嵌入式 > 嵌入式开发 > 详情

GPIO的操作

发布时间:2020-08-31 发布时间:
|
一、对IO的单个引脚操作,采用宏定义较为方便
(1)对单个IO的单个引脚基本操作,下面采用宏定义的例子
#defineDS18B20_BIT GPIO_Pin_2//宏定义GPIO_Pin_2引脚新名为DS18B20_BIT,也可以为其他名称
#defineDS18B20_PORT GPIOC////宏定义GPIOC端口新名为DS18B20_PORT,也可以为其他名称
#defineREAD_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引脚为输出模式
#defineCLR_OP_1WIRE() GPIO_ResetBits(DS18B20_PORT,DS18B20_BIT)//设置端口DS18B20_PORT的DS18B20_BIT位为0
#defineSET_OP_1WIRE() GPIO_SetBits(DS18B20_PORT,DS18B20_BIT)//设置端口DS18B20_PORT的DS18B20_BIT位为1
(2)设置端口IO方向
1)其中设置端口方向输入的方式为a或b
a)
DIR_1WIRE_IN()
b)
GPIO_InitTypeDefGPIO_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_InitTypeDefGPIO_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_InitTypeDefGPIO_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_InitTypeDefGPIO_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)的顺序


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机汇编语言 如何实现点亮熄灭二极管