跑马灯实验

本文详细介绍了STM32的GPIO基础知识,包括8种工作模式和4个配置寄存器。通过实例展示了如何使用寄存器版及HAL库函数版代码设置GPIO端口为推挽输出并控制LED灯的亮灭。文中还提供了初始化系统时钟、使能GPIO时钟等关键步骤。
摘要由CSDN通过智能技术生成

一、GPIO相关基础知识

8种GPIO工作模式

输入模式:输入浮空、输入上拉、输入下拉、模拟输入

输出模式:开漏输出、开漏复用功能、推挽式输出、推挽式复用

每组GPIO端口包括10个寄存器 

注:GPIO寄存器定义在F429的头文件中

GPIO的具体知识点可以参照我的另一篇GPIO的相关文章哦!

二、硬件连接

 将端口设置为低电平0,于是和VCC有电压差,导通即LED灯点亮

端口设置为高电平1,于是和VCC没有电压差,电路没有导通即LED灯不亮

GPIO输出方式:推挽输出(上拉)【开漏则需要另外加一个上拉电阻,否则没法输出高电平】

三、相关代码

1、相关步骤

初始化HAL库->初始化系统时钟->使能IO口时钟【RCC_AHB1ENR】->初始化IO口模式  配置四个配置寄存器->操作IO口,输出高低电平【配置寄存器GPIOX_ODR/GPIOX_BSRR】【HAL版本则调用相关函数】

2、具体代码

(1)寄存器版本

#include "sys.h"
#include "delay.h"
#include "usart.h"

int main(){
	HAL_Init(); //初始化函数
	Stm32_Clock_Init(360,25,2,8);
	delay_init(180);
	RCC->AHB1ENR=1<<1; //1左移1位,即第二位为1,同时进行或运算,从而实现置位第二位而不影响其它位
	
	//配置相关配置寄存器
	GPIOB->MODER=0X05; //PB0和PB1均为1(通用输出模式) 0101->0x05
	GPIOB->OTYPER=0x00;  //PB0和PB1均设置为1 (推挽输出)
	GPIOB->OSPEEDR=0x0F;  //PB0和PB1均设置为高速 均为11  1111->0x0F
	GPIOB->PUPDR=0x05;  //PB0和PB1均设置为01 上拉 0101     0101->0x05
	
	
	while(1){
			//配置输入输出寄存器
			GPIOB->BSRR=0x00000003;  //输出高电平   BS0和BS1置为1
		  delay_ms(500); //延时500ms
			GPIOB->BSRR=0X00030000;  //输出低电平   BR0和BR1置为1
		  delay_ms(500); //延时500ms
	}
	
}

(2)库函数版本

1、GPIO重要库函数

初始化函数  void HAL_GPIO_Init(GPIO_TypeDef *GPIOx,GPIO_InitTypeDef *GPIO_Init);

作用:用于初始化一个或者多个IO口(同一组)的工作模式,输出类型,速度以及上下拉方式,即一组的4个配置寄存器 (GPIOx->MODER、OSPEEDR、OTYPER、PUPDR)

读取输入电平函数   GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);

作用:读取某个GPIO的输入电平 (GPIOx_IDR寄存器)

设置引脚输出电平函数   void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx,unit16_t GPIO_Pin,GPIO PinState PinState);

l例如:HAL_GPIO_WritePin(GPIO B,GPIO_PIN_1,GPIO_PIN_RESET)  PB1为RESET 即0(SET为1)

2、相关代码

#include "delay.h"
#include "usart.h"

int main(){
    GPIO_InitTypeDef GPIO_InitStructure; //入口参数结构体
	HAL_Init();   //初始化HAL库
	Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
    delay_init(180); //延时函数初始化
	
	__HAL_RCC_GPIOB_CLK_ENABLE();  //使能PB时钟

    //成员变量初始化
    GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    GPIO_InitStructure.Pin=GPIO_PIN_0 | GPIO_PIN_1;  //PBO和PB1
    GPIO_InitStructure.Pull=GPIO_PULLUP;  //上拉
    GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
    
	HAL_GPIO_Init(GPIOB,&GPIO_InitStructure); 

    while(1)
	{
		  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);  //PB0=0;
		  delay_ms(500);  //延时500ms
		  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);  //PB0=1;
		  delay_ms(500);  //延时500ms
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值