资源描述:
《专题一GPIO输出模式-按键》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、专题一GPIO输入模式——按键STM32的IO口做输入使用的时候,是通过读取IDR的内容来读取IO口的状态的。典型的应用有按键,各种传感器状态开关(如红外开关、超声波、温度等),这些应用,都是IO的状态被动地被改变,因此,是做输入使用。本节,就以按键为例,介绍GPIO做输入使用时的编程方法。1、硬件设计图1开发板按键电路上述的按键电路设计方法是:在一个电源、地和电阻的连通支路中,嵌入按键开关,开关的正电源侧分出一路,与MCU的GPIO连接(四个按键分别接到PA0,PA8,PC1,PC2上),因此,当按键释放没有按下,按键连
2、接的GPIO管脚是正电平,按键按下,是地电平。注意:电阻要放在正电源一侧,请思考:如果电阻放在地一侧会出现什么情况呢?2、软件设计现在我们来进行软件编程。按键的程序设计与LED的一样,也要遵循这样一个步骤:首先使能对应端口的数字时钟,然后配置工作模式,——也就是初始化!初始化完毕,即可通过查询IDR寄存器的相应位值,即可知道对应按键是“按下”还是“释放”了。我们以这四个按键为例,讲解这四个GPIO口的初始化。2.1按键管脚的初始化1、首先以PA0为例,进行初始化:1)开启对应端口的数字时钟因为PA0是在GPIO的A组,而G
3、PIOA是挂接在APB2高级总线上的(课本Page2图1.1),因此要开启APB2的时钟。用下面的语句:RCC->APB2ENR
4、=1<<2;上面用了“
5、=”运算符号,是指先进行或运算,再进行赋值运算。1<<2,就是bit2。因此运算结果就是,APB2ENR的bit2位被置“1”,因为无论“0”还是“1”只要与“1”或运算,结果都是“1”。2)配置工作模式PA0工作在输入模式,输入模式对应的有“模拟输入”“浮空输入”“上拉/下拉输入”,在此,我们选择“上拉/下拉输入”。用下面的语句:GPIOA->CRL&=0xFFFFFF
6、F0;GPIOA->CRL
7、=0x00000008;上面要配置CRL,因为任何一组GPIO的0-7端口都在CRL里配置,8-15在CRH里进行配置。第1句将CRL的bit3-0复位为“0000”(任何值与0相与都是0),就是设置成输入;第2句将CRL的bit3-2置位为“10”(任何值与1相或结果都是1),就是设置成上拉/下拉输入。课本P13表2.2CNF[1:0]MODE[1:0]输入配置CNF[1:0]MODE[1:0]输出配置50MHz0000模拟输入0011通用推挽输出0100浮空输入(复位状态)0111通用开漏输
8、出1000上拉/下拉输入1011复用推挽输出1100保留1111复用开漏输出2、PA8的初始化仿照上面的例子,可以知道PA8的初始化如下:RCC->APB2ENR
9、=1<<2;GPIOA->CRH&=0xFFFFFFF0;GPIOA->CRH
10、=0x00000008;3、PC1的初始化RCC->APB2ENR
11、=1<<4;GPIOC->CRL&=0xFFFFFF0F;GPIOC->CRL
12、=0x00000080;4、PC2的初始化RCC->APB2ENR
13、=1<<4;GPIOC->CRL&=0xFFFFF0FF;GPIOC
14、->CRL
15、=0x00000800;5、将四个按键同时进行初始化,可以将上面的语句进行合并。RCC->APB2ENR
16、=1<<2;GPIOA->CRL&=0xFFFFFFF0;GPIOA->CRL
17、=0x00000008;GPIOA->CRH&=0xFFFFFFF0;GPIOA->CRH
18、=0x00000008;RCC->APB2ENR
19、=1<<4;GPIOC->CRL&=0xFFFFF00F;GPIOC->CRL
20、=0x00000880;2.按键查询GPIO的IDR寄存器是输入状态寄存器,因此查询按键状态,就是读取IDR
21、寄存器。PA0和PA8,对应GPIOA->IDR的bit0和bit8,PC1和PC2,对应GPIOC-IDR的bit1和bit2。因此,查询语句可以这样写:if(GPIOA->IDR&1<<0==0)//PA0按键按下if(GPIOA->IDR&1<<8==0)//PA8按键按下if(GPIOC->IDR&1<<1==0)//PC1按键按下if(GPIOC->IDR&1<<2==0)//PC2按键按下注意:对于按键矩阵,要操作行线和列线,也就是将按键两侧的控制线上拉或者下拉,此时可以写ODR寄存器。3、练习与仿真1、如果K
22、1按下,就令led0状态翻转;类似,令K2-K4,分别控制led1-3的状态。2、按键和流水灯:如果K1按下,就上流水;如果K2按下,就下流水。3、按键和蜂鸣器:如果K3按下,就令蜂鸣器响。