GPIO:(General Purpose Input Output (通用输入/输出)简称为GPIO)
使用方法大致为:
1、参考芯片手册,设置控制寄存器(将引脚设置为输入、输出或者中断模式)
2、如果是输出引脚,就是往数据寄存器写入高电平或者低电平。如果为输入引脚就是读取数据寄存器的状态(高电平还是低电平)
3、中断,打断cpu的操作,继而去做一部分事情
以上拿stm32举例:
注意:stm32的使用和51单片机不同,单片机接上晶振接上电源 直接就可以操作io口,但是stm32的时钟是经过了倍频器放大频率的,然后再由锁相环输出稳定的时钟频率。这么做的带来了很多好处,虽然stm32的外部时钟只有8Mhz ,经过倍频器后就可以得到好几种的时钟频率 给不同的外设提供不同的时钟频率。所以stm32有很多总线,这些总线的频率是不同的,而且在使用前总线是关闭的,使用外设前必须打开其对应的总线,这样也是处于为stm32降低功耗的考虑。配置方法:对于stm32的GPIO口还需要注意的一点是,通过GPIO寄存器,可以把GPIO口配置成8种工作模式:
- 浮空输入
- 带上拉电阻输入
- 带下拉电阻输入
- 模拟输入
- 开漏输出
- 推挽输出
- 复用推挽输出
- 复用开漏输出
其中前四种是输入状态:带上拉电阻是指stm32内部已经结了上拉电阻,下拉同理;浮空输入就是stm32内部什么都没接,需要自己外接上拉电阻;模拟输入使用在AD转换的时候。后四种是输出状态:开漏输出是指可以输出低电平,但是如果要输出高电平需要上拉电阻;推挽输出是指既可以输出高电平又可以输出低电平;后面两个是打开IO的第二功能,IO口复用时需要配置成该状态。操作寄存器stm32的每个I/O口可以自由编程,单I/O口寄存器必须按32位字被访问。 stm32的每个I/O端口都由7个寄存器来控制:
- 配置模式的2个32位端口配置寄存器CRL(低八位I/0口配置寄存器) 和 CRH ( 高八位I/0口配置寄存器 ),CRL和CRH控制着每个I/O口的模式和输出速率、
附图:
该寄存器的复位值为0X4444 4444 即配置端口为浮空输入模式,每个I/O口占用四位的配置位,高两位为CNF,设置输入输出模式。低两位为Mode,设置输出速率;
- 2个32位的数据寄存器IDR和ODR,但都只用了低16位,只能以16位的形式读出。 ODR寄存器可以用来选择各I/O口输入模式下为电阻上拉(相应位置1)或是下拉方式;或者在输出模式下设置各I/O口的输出电平高低;
- 1个32位的置位/复位寄存器BSRR;
- 1个16位的复位寄存器BRR;
- 1个32位的锁存寄存器LCKR;
下一步要将该GPIO的pin的时钟总线enable一下
上代码:
<span style="background-color: rgb(255, 255, 255);"><span style="color:#333333;">#include <stm32f10x_lib.h> #include "system.h" //LED端口定义 #define LED0 PAout(4)// PA4 void Gpio_Init(void); int main(void) { Rcc_Init(9); //系统时钟设置 Gpio_Init(); //初始化与LED连接的硬件接口 while(1) { LED0=0; delay(300000); //延时300ms LED0=1; delay(300000); } } void Gpio_Init(void) { RCC->APB2ENR|=1<<2; //使能PORTA时钟 GPIOA->CRL&=0XFFF0FFFF; GPIOA->CRL|=0X00030000;//PA4 推挽输出 GPIOA->ODR|=1<<4; //PA4 输出高 } </span></span>
以上参考网络资料··