GPIO-general purpose input output
是软件可以控制的引脚 1/0
(12之间为反相器)
IO口推挽输出:高电平推,低电平挽。一对MOS管控制,电流大,效率高25ma。
开漏输出:只能输出低电平。高电平需要外部电路上拉。好处是,如果需要驱动5V元器件。只需要把VDD改成5V就可以。具有“线与”功能,一个为0,都为0。
输出:
GPIOx_ODR直接操作。
GPIOx_BSRR (bit set reset register)置位清除寄存器:高16位置1输出为0(清零),低16位置1输出1(置位),都置1 ,置位有效。目前觉得这个玩意就是脱了裤子放屁。可能以后会有用。上下拉有用(补)。
复用功能输出,来自片上外设。如USART_DR数据寄存器。
输入:
GPIOx_IDR输入数据寄存器:等同ODR,当输出寄存器输出时,数据可从输入寄存器看到。可监控。
肖特基触发器:门作用,输入高于2v置1,低于1.2v置0。ADC采集时不经过触发器了,直接模拟输入。同样模拟输出时也不经过MOS管直接输出,这个图上没画出来。
GPIO初始化顺序
- 选定GPIO
- 配置工作模式(CRL CRH)
- 控制输出电平高低(ODR,BRR,BSRR)
*认真看手册,不要偷懒
寄存器映射环节
// 用来存放STM32寄存器映射的代码
// 外设 perirhral
#define PERIPH_BASE ((unsigned int)0x40000000)
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE + 0x18)
//星号是为了把数变成地址,能让计算机访问,有点后悔数据结构没好好学了
#define GPIOB_CRL *(unsigned int*)(GPIOB_BASE + 0x00)
#define GPIOB_CRH *(unsigned int*)(GPIOB_BASE + 0x04)
#define GPIOB_ODR *(unsigned int*)(GPIOB_BASE + 0x0C)
// 打开 GPIOB 端口的时钟
RCC_APB2ENR |= ( (1) << 3 );
// 配置IO口为输出
GPIOB_CRL &= ~( (0x0f) << (4*0) ); //先清零,较为严谨
GPIOB_CRL |= ( (1) << (4*0) );
// 控制 ODR 寄存器
GPIOB_ODR &= ~(1<<0);
//GPIOB_ODR |= (1<<0);
又重新学了一遍,感觉理解又加深了,单片机是个好玩的东西,希望能学好它。