GPIO寄存器
GPIOx->MODER 模式寄存器 32位
00:输入(复位状态)
01:通用输出模式
10:复用功能模式
11:模拟模式
GPIOD->OTYPER
端口输出类型寄存器 16位
0
:输出推挽(复位状态)
1:输出开漏
注:输出推挽的带负载能力强,输出开漏的吸收电流能力相对强,要得到高电平需要上拉电阻
GPIOD->OSPEEDR
端口输出速度寄存器 32位
00
: 2 MHz(低速)
01: 25 MHz(中速)
10: 50 MHz(快速)
11: 30 pF 时为 100 MHz(高速)( 15 pF 时为 80 MHz 输出(最大速度))
GPIOD->PUPDR
端口上拉
/下拉寄存器 32位
00:无上拉或下拉
01:上拉
10:下拉
11:保留
使能GPIOx时钟
RCC->AHP1ENR
RCC AHB1
外设时钟使能寄存器 32位 一些位被保留
0:禁止
1:使能
注:此寄存器只能使能/禁止挂载在AHB1上的外设
主要代码
RCC->AHB1ENR |=1<<(3*1); //使能GPIOD时钟
GPIOD->MODER &= 0;
GPIOD->MODER |= ((1<<(2*12))|(1<<(2*13))|(1<<(2*14))|(1<<(2*15))); //模式:输出
GPIOD->OTYPER &= 0;
GPIOD->OTYPER |=((0<<(13))|(0<<(13))|(0<<(14))|(0<<(15))); //推挽输出
GPIOD->OSPEEDR &= 0;
GPIOD->OSPEEDR |=((1<<(13*2))|(1<<(2*13))|(1<<(2*14))|(1<<(2*15))); //输出速度25M 不知道为什么不能写大于1的数如:2<<(13*2)
GPIOD->PUPDR &= 0;
GPIOD->PUPDR |= ((1<<(2*12))|(1<<(2*13))|(1<<(2*14))|(1<<(2*15))); //上拉
记错
RCC->AHB1ENR |=1<<(4*1); //错误,位移应从0数起
RCC->AHB1ENR |=1<<(3*1); //正确