首页 > 其他分享 >STM32基础

STM32基础

时间:2024-11-10 09:17:33浏览次数:3  
标签:输出 Pin 寄存器 基础 STM32 IO InitStruct GPIO

一、GPIO

主要知识点:

1、通用GPIO概述

2、GPIO的工作方式

3、GPIO的相关寄存器

4、GPIO的应用

5、GPIO的初始化代码

1、GPIO概述:

GPIO是通用输入/输出的简称,是单片机和外界通讯的必要窗口。换句话来说,GPIO就像我们的计算机的显示器和键盘,我们对单片机的读写操作就是通过I/O口来实现的。

2、GPIO的工作方式:

四种输入模式:

浮空输入

上拉输入

下拉输入

模拟输入

四种输出模式:

开漏输出

开漏复用功能        

推挽输出

推挽复用功能

四种最大输出速度:

2MHZ

25MHZ

50MHZ

100MHZ

GPIO接口结构图

GPIO的引脚状态:

上电复位后,GPIO默认为浮空状态,部分特殊功能引脚除外。

推挽输出:可以输出强高低电平,连接数字器件

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

GPIO的相关寄存器

每组GPIO端口的寄存器包括:

一个端口模式寄存器(GPIOx_MODER)

一个端口输出类型寄存器(GPIOx_OTYPER)

一个端口输出速度寄存器(GPIOx_OSPEEDR)

一个端口上拉下拉寄存器(GPIOx_PUPDR)

一个端口输入数据寄存器(GPIOx_IDR)

一个端口输出数据寄存器(GPIOx_ODR)

一个端口置位/复位寄存器(GPIOx_BSRR)

一个端口配置锁存寄存器(GPIOx_LCKR)

两个复位功能寄存器(低位GPIOx_AFRL & GPIOx_AFRH)

GPIO的应用

以STM32F4为例

1、点亮LED(输出)

第一步原理图

原理图分析:

  • 3组IO口A\B\C,每一组16个分别是0~15。
  • LED挂接在PC4/5和PB0上面,只要输出低电平,LED点亮。

第二步:输出低电平

根据数据手册中列出的每个I/O端口的特定硬件特征,GPIO端口的每个位可以由软件分别配置成八种模式。

  • 输入浮空:浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。做按键,是要读取电平状态,这种配置抗干扰性差,但是处理信号方面一般是配置这个功能。如测试一个波形,这时候可以配置这个功能。
  • 输入上拉:经过电阻连接到VCC,能让IO口在没有连接信号时有一个确定的高电平,并且也能从VCC处获得比较大的驱动电流。
  • 输入下拉:经过电阻连接到GND,能让IO口在没有连接信号时有一个确定的低电平。
  • 模拟输入:芯片内部外设专用功能(ADC,DAC对应的IO口功能)
  • 开漏输出:IO输出0接地,IO输出1悬空,需要外接上拉电阻,才能实现输出高电平。
  • 推挽式输出:IO输出0接地,IO输出1接VCC,拥有较强的驱动能力。
  • 推挽式复用功能:GPIO口被用作第二功能时的配置情况(即并非作为普通IO口使用),比如像片上外设的UART、SPI模块对应的输出数据线
  • 开漏复用功能:GPIO口被用作第二功能时的配置情况(即并非作为普通IO口使用),比如像片上外设的IIC模块对应的数据线和时钟线,使用时要外接上拉电阻。

第三步:模式设置

配置GPIO口需要使用到GPIO初始化函数GPIO_Init,具体描述如下:

typedef struct
{
    uint32_t GPIO_Pin;              //设置的 GPIO 管脚,使用操作符“|”可以一次选中多个管脚
    GPIOMode_TypeDef GPIO_Mode;    //设置的 GPIO 管脚模式
    GPIOSpeed_TypeDef GPIO_Speed;  //设置选中管脚的速率。
    GPIOOType_TypeDef GPIO_OType;  //设置选中管脚的输出类型。
    GPIOPuPd_TypeDef GPIO_PuPd;    //设置选中管脚的上下拉。
}GPIO_InitTypeDef;

  • GPIO_ResetBits:复位引脚电平,使得引脚输出低电平
  • GPIO_SetBits:置位引脚电平,使得引脚输出高电平

示例代码:

2、初始化代码

/**************************************
时间:2024年11月10日08点54分
修改:GPIO初始化
函数名:Gpio_Init()
参数:LED、MOTOR、BEEP
备注:LED1:PC4、LED2:PC5、LED3:PB0
备注:MOTOR:PC8、BEEP:PC12
****************************************/

void Gpio_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct={0};
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);//开启PC时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//开启PB时钟
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;			//通用输出模式
	GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;			//推挽输出
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8;//配置4、5、8引脚
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;			//无上下拉
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;		//速率50M(高速)
	GPIO_Init(GPIOC,&GPIO_InitStruct);					//初始化GPIOC

	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;				//配置0引脚
	GPIO_Init(GPIOB,&GPIO_InitStruct);					//初始化GPIOB
	//两种方法任用一种即可
	LED1=1;     										// 初始状态为灭灯(使用位带)
	LED2=1;
	LED3=1;
	
	GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4);			//初始状态灭灯(调用标准库)
	GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5);
	GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);

}

二、配置按键(输入)

老规矩先查看原理图

连接在PA0、PC13、PB1上,并且接有上拉或下拉电阻的,所以配置为浮空输入即可,记得开启对应的外设时钟。

初始化配置

/**************************************
时间:2024年7月16日10点12分
修改:KEY
函数名:KEY初始化
参数:KEY1、KEY2、KEY3
备注:key1:PA0、key2:PC13、key3:PB1
****************************************/
void Key_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct={0};
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//开启PC时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;				//输入模式
	GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;			//无上下拉
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;				
	GPIO_Init(GPIOA,&GPIO_InitStruct);

	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;
	GPIO_Init(GPIOC,&GPIO_InitStruct);
	

}

按键功能函数

/**************************************
时间:2024年7月16日11点11分
修改:按键消抖
函数名:int Key_Get_Num(void)
参数:KEY1、KEY2、KEY3
备注:key1:PA0、key2:PC13、key3:PB1
****************************************/
int Key_Get_Num(void)
{
	int KeyNum=0;
	if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)//按键按下
	{
		delay_led(20000);						  //消抖
	while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1){;}
		delay_led(20000);
		KeyNum=1;								 //按键1
	}
	
	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)
	{
		delay_led(20000);
	while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0){;}
		delay_led(20000);
		KeyNum=3;
	}
	
	if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==0)
	{
		delay_led(20000);
	while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==0){;}
		delay_led(20000);
		KeyNum=2;
	}
		
	return KeyNum;								//按键返回值

}

小习题:

实现流水灯

实现花式流水灯

使用按键分别控制流水灯、花式流水灯

标签:输出,Pin,寄存器,基础,STM32,IO,InitStruct,GPIO
From: https://blog.csdn.net/qq_56491232/article/details/143651719

相关文章

  • STM32+阿里云+ESP8266+MQTT+DHT11
    一、阿里云平台环境搭建注册完账号以后,找到控制台->物联网平台。    1.创建一个公共实例,若该实例有ID则为新公共实例2.创建一个产品[如何在物联网平台创建产品_物联网平台(IoT)-阿里云帮助中心(aliyun.com)](https://help.aliyun.com/zh/iot/user-guide/create......
  • 第五章 常用类与基础API面试题
    目录1.以下两种方式创建的String对象有什么不同?2.Strings=newString("xyz");创建了几个StringObject?3.Stringa="abc"Stringb="a"+"bc"问a==b?4.String中“+”怎样实现?5.Java中String是不是final的?6.String为啥不可变,在内存中的具体形态?7.String可......
  • IPD流程基础知识
    现如今可以看到很多公司都在使用IPD流程,那IPD流程到底是什么呢?一起来看下吧一、IPD流程包含什么内容?宏观的IPD流程其实包含了4大块内容:战略管理流程、市场管理流程、需求管理流程、产品开发流程。微观的IPD流程一般是指新产品集成开发流程,也叫小IPD或PDP(productdevelopment......
  • #2024-2025-1学号20241309《计算机基础与程序设计》第七周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里2024-2025-1计算机基础与程序设计第七周作业这个作业的目标作业正文2024-2025-1学号20241309《计算机基础与程序设计》第七周学习总结教材学习内容总结《计算机科学概论......
  • C++基础学习3
    //3.常量和变量://生活中的一些数据//有些数据不能变:血型、性别、圆周率//有些数据可以变:年龄、身高、体重、工资//在C语言中的描述://变量:能被改变的量//常量:不能被改变的量//intmain()//{// //创建一个变量// //int=类型、age=变量的名字、=是赋值的意思、23是数值// ......
  • 07 Oracle数据库恢复基础解析:从检查点到归档,一步步构建数据安全防线
    文章目录Oracle数据库恢复基础解析:从检查点到归档,一步步构建数据安全防线一、检查点(Checkpoint)1.1检查点定义1.2检查点重要性1.3检查点工作原理1.4手动触发检查点二、日志(RedoLog)2.1日志定义2.2日志重要性2.3查看当前使用的Redo日志成员三、归档机制(Archiving)3......
  • 博弈论基础
    算法竞赛中的博弈论问题:ICG(ImpartialCombinatorialGames公平组合游戏)特征如下:1.两名选手2.轮流操作,每次一步,每步在有限合法集合中选取一种进行3.任何情况,合法操作只取决于情况本身,与选手无关4.游戏败北条件:当某位选手需要进行操作时,当前没有任何可以执行的合法操作,则该选......
  • 2024-2025-1 20241403 《计算机基础与程序设计》第七周学习总结
    学期(如2024-2025-1)学号(如:20241403)《计算机基础与程序设计》第7周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标数组与......
  • C++基础学习2-数据类型
    ////数据类型:////计算机语言-写程序-解决生活中的问题////必须有能力来描述生活中的问题////购物商城-上架商品,价格-15.6元-小数////年龄50岁-整数////C语言-浮点数(小数点)////-整型//////a////'a'-字符a////intmain()//{// //char=字符类型// charch='a';......
  • 2024-2025-1 20241319 《计算机基础与程序设计》第七周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK07这个作业的目标数组与链表基于数组和基于链表实现数据结构无序表与有序表树图子程序与参数作业正文https://www.c......