02 STM32F429 使用寄存器点亮led GPIO简介

STM32F429 使用寄存器点亮led GPIO简介

GPIO简介

image-20220924132735443

在stm32中,我们主要通过c语言编程控制gpio的引脚输出0\1来与外部设备通信

image-20220924133553230

源代码

代码

main.c
/*
	使用寄存器的方法点亮LED灯
  */
#include "stm32f4xx.h" 


/**
  *   主函数
  */
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);

}

// 函数为空,目的是为了骗过编译器不报错
void SystemInit(void)
{	
}



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)
	


寄存器分析

image-20220924141952351

该寄存器可更改对应端口的输出模式 默认情况下是00复位状态只有输入,若想要输出数据到端口,需要更改对应端口至01输出模式.

ps: 要先把20和21位置0再置为1,不然若处于10 11状态下 1或上0\1都为1

	/*GPIOH MODER10清空*/
	GPIOH_MODER  &= ~( 0x03<< (2*10));	
	/*PH10 MODER10 = 01b 输出模式*/
	GPIOH_MODER |= (1<<2*10);

image-20220924142214912

image-20220924142227571

该寄存器将设置端口默认的值,在此程序中若不设置ph10的初值为1,则电路会被直接打通,灯亮.

	/*GPIOH OTYPER10清空*/
	GPIOH_OTYPER &= ~(1<<1*10);
	/*PH10 OTYPER10 = 0b 推挽模式*/
	GPIOH_OTYPER |= (0<<1*10);

推挽输出:可以输出高,低电平,连接数字器件;
开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。

image-20220924142814795

	/*GPIOH OSPEEDR10清空*/
	GPIOH_OSPEEDR &= ~(0x03<<2*10);
	/*PH10 OSPEEDR10 = 0b 速率2MHz*/
	GPIOH_OSPEEDR |= (0<<2*10);

image-20220924145020851

image-20220924145031912

上拉电阻的目的是为了保证在无信号输入时输入端的电平为高电平。而在信号输入为低电平是输入端的电平应该也为低电平。

如果没有上拉电阻,在没有外界输入的情况下输入端是悬空的,它的电平是未知的无法保证的,上拉电阻就是为了保证无信号输入时输入端的电平为高电平,同样还有下拉电阻它是为了保证无信号输入时输入端的电平为低电平

	/*GPIOH PUPDR10清空*/
	GPIOH_PUPDR &= ~(0x03<<2*10);
	
	/*PH10 PUPDR10 = 01b 上拉模式*/
	GPIOH_PUPDR |= (1<<2*10);

即现在的输入端是推挽+上拉 即默认值为1 这样的话就能让led在一开始保持熄灭状态而非闪烁一下

image-20220924154415458

	/*PH10 BSRR寄存器的 BR10置1,使引脚输出低电平*/
	GPIOH_BSRR |= (1<<16<<10);
	
	/*PH10 BSRR寄存器的 BS10置1,使引脚输出高电平*/
	//GPIOH_BSRR |= (1<<10);

简单理解 :复位就是清0 置位就是置1

9kmNcVT-1664006007474)]

	/*PH10 BSRR寄存器的 BR10置1,使引脚输出低电平*/
	GPIOH_BSRR |= (1<<16<<10);
	
	/*PH10 BSRR寄存器的 BS10置1,使引脚输出高电平*/
	//GPIOH_BSRR |= (1<<10);

简单理解 :复位就是清0 置位就是置1

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值