初识STM32——从点灯开始

目录

一、功能描述

二、GPIO介绍

2.1 GPIO的基本结构

2.2 GPIO位结构和输入/输出模式

三、程序

四、效果演示


一、功能描述

        通过库函数来配置寄存器,控制GPIO的输出。要使用GPIO,首先要使能时钟,再调整GPIO的输出模式、引脚选择、输出速度。本次实验就是学会GPIO的使用。

二、GPIO介绍

  • GPIO(General Purpose Input Output)通用输入输出口可配置为8种输入输出模式
  • 引脚电平:0V~3.3V部分引脚可容忍5V
  • 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
  • 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

2.1 GPIO的基本结构

  •  GPIO都是挂在APB2上的,所以GPIO时钟是由APB2外设时钟控制函数来开启。

2.2 GPIO位结构和输入/输出模式

         通过配置寄存器来控制上图中各个开关的打开和闭合、推挽输出、开漏输出或者输出关闭。

  • 上拉输入:上拉电阻开关闭合,引脚悬空时为高电平。
  • 下拉输入:下拉电阻开关闭合,引脚悬空时为低电平。
  • 模拟输入:施密特触发器关闭,引脚直接接内部ADC。
  • 推挽输出:P-MOS和N-MOS都工作。输出为1时,P-MOS导通,输出为高电平;输出为0时,N-MOS导通,输出为低电平。
  • 开漏输出:只有N-MOS工作。输出为1时,N-MOS不导通,输出为高阻状态;输出为0时,N-MOS导通,输出低电平。在I2C总线,可用于多机通信。

模式名称

性质

特征

浮空输入

数字输入

可读取引脚电平,若引脚悬空,则电平不确定

上拉输入

数字输入

可读取引脚电平,内部连接上拉电阻,悬空时默认高电平

下拉输入

数字输入

可读取引脚电平,内部连接下拉电阻,悬空时默认低电平

模拟输入

模拟输入

GPIO无效,引脚直接接入内部ADC

开漏输出

数字输出

可输出引脚电平,高电平为高阻态,低电平接VSS

推挽输出

数字输出

可输出引脚电平,高电平接VDD,低电平接VSS

复用开漏输出

数字输出

由片上外设控制,高电平为高阻态,低电平接VSS

复用推挽输出

数字输出

由片上外设控制,高电平接VDD,低电平接VSS

三、程序

GPIO初始化步骤:

  1. 使能时钟。GPIO是挂在APB2上的,所以用RCC_APB2PeriphClockCmd这个函数开启时钟。
  2. GPIO初始化。包括GPIO的输出模式、引脚选择、输出速度。

注意:GPIO配置好后默认是低电平。

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main()
{
	//初始化GPIOA口
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure1;
	GPIO_InitStructure1.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure1.GPIO_Pin=GPIO_Pin_All;
	GPIO_InitStructure1.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure1);
	//初始化GPIOB口
	GPIO_InitTypeDef GPIO_InitStructure2;
	GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_12;
	GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure2);

	while(1)
	{
		GPIO_Write(GPIOA,~0x0001);
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0002);
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0004);
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0008);
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0010);
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0020);
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0040);
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0080);
		Delay_ms(100);
		
		GPIO_ResetBits(GPIOB,GPIO_Pin_12);
		Delay_ms(100);
		GPIO_SetBits(GPIOB,GPIO_Pin_12);
	}
}

四、效果演示

        LED流水灯,每循环一次蜂鸣器都响100ms。

STM32点个灯

猜你喜欢

转载自blog.csdn.net/ssssshhbh/article/details/129338605