好了朋友们,又是新的一天,今天你学会了吗?哈哈
好了话不多说,让我们直接上干货!
下面这些都是例程。
int main(void)
{
/*开启 GPIOH 时钟,使用外设时都要先开启它的时钟*/
RCC_AHB1ENR |= (1<<7);
/* LED 端口初始化 */
/*GPIOH MODER10清空*/
GPIOH_MODER &= ~( 0x03<< (2*10));
/*PH10 MODER10 = 01b 输出模式*/
GPIOH_MODER |= (1<<2*10);
/*GPIOH OTYPER10清空*/
GPIOH_OTYPER &= ~(1<<1*10);
/*PH10 OTYPER10 = 0b 推挽模式*/
GPIOH_OTYPER |= (0<<1*10);
/*GPIOH OSPEEDR10清空*/
GPIOH_OSPEEDR &= ~(0x03<<2*10);
/*PH10 OSPEEDR10 = 0b 速率2MHz*/
GPIOH_OSPEEDR |= (0<<2*10);
/*GPIOH PUPDR10清空*/
GPIOH_PUPDR &= ~(0x03<<2*10);
/*PH10 PUPDR10 = 01b 上拉模式*/
GPIOH_PUPDR |= (1<<2*10);
/*PH10 BSRR寄存器的 BR10置1,使引脚输出低电平*/
GPIOH_BSRR |= (1<<16<<10);
/*PH10 BSRR寄存器的 BS10置1,使引脚输出高电平*/
//GPIOH_BSRR |= (1<<10);
while(1);
}
这里是stm32f4xx.h
/*片上外设基地址 */
#define PERIPH_BASE ((unsigned int)0x40000000)
/*总线基地址 */
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)
/*GPIO外设基地址*/
#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00)
/* GPIOH寄存器地址,强制转换成指针 */
#define GPIOH_MODER *(unsigned int*)(GPIOH_BASE+0x00)
#define GPIOH_OTYPER *(unsigned int*)(GPIOH_BASE+0x04)
#define GPIOH_OSPEEDR *(unsigned int*)(GPIOH_BASE+0x08)
#define GPIOH_PUPDR *(unsigned int*)(GPIOH_BASE+0x0C)
#define GPIOH_IDR *(unsigned int*)(GPIOH_BASE+0x10)
#define GPIOH_ODR *(unsigned int*)(GPIOH_BASE+0x14)
#define GPIOH_BSRR *(unsigned int*)(GPIOH_BASE+0x18)
#define GPIOH_LCKR *(unsigned int*)(GPIOH_BASE+0x1C)
#define GPIOH_AFRL *(unsigned int*)(GPIOH_BASE+0x20)
#define GPIOH_AFRH *(unsigned int*)(GPIOH_BASE+0x24)
/*RCC外设基地址*/
#define RCC_BASE (AHB1PERIPH_BASE + 0x3800)
/*RCC的AHB1时钟使能寄存器地址,强制转换成指针*/
#define RCC_AHB1ENR *(unsigned int*)(RCC_BASE+0x30)
好,程序列出来了,我们一步一步的分析。
/GPIOH MODER10清空/
GPIOH_MODER &= ~( 0x03<< (2*10));
这一步有同学会问了。为啥是0x03呀
0x03就是二进制的11. 当然了以后看见&=~就是清零的意思就好了。
但是深入追究一下。刚才做了软件仿真,所以00没有用。
自己理解的更深入了。0x03就是11 11左移20位就是Moder10的位置。让这两个数清零即可。其余是一样的。
还有这里的输入。
上拉输入是输出啥是啥。
上拉输出是高电平。
谨记谨记谨记!