STM32快速复习(一)GPIO部分



前言

无聊写的,并不完善,见谅,缘由是发现以前学过的STM32,标准库函数忘的差不多了。在学校时都会写,上班忘了。
因为是复习,就没那么仔细了。。。
也想使睡在我下铺的逆子迅速入门,加了许多举例
适用于自己复习,和别人如有雷同,万分荣幸。

讲一个小故事,以前和舍友说过51和32的区别;51像老式火铳。扣扳机就好,32像现代武器。可以调连发,速度等。功能多,适配场景强,调试的参数多。
(个人理解:32最重要的是低功耗省电。。。。。)

后补一句,STM32只是工具,不需要会多么精深,会用即可
神枪手也不需要知道火药的化学成分和火药爆炸的化学方程式
神枪手只需会,上弹,瞄准,扣扳机即可。


一、GPIO是什么?GPIO结构?GPIO模式?

GPIO(General Purpose Input Output)通用输入输出口 可配置为8种输入输出模式。引脚电平范围为0V~3.3V,部分引脚可容忍5V

GPIO结构为什么加驱动器:单纯信号是带不起来的(想起考研时复习模电,三极管那一章。想象你操控着机器人,你只是给信号,机器人才是控制拿起放下的动力)
GPIOGPIO全部搭载在APB2总线上。所以要使用GPIO需要先使能APB2总线。(使能=开启)请添加图片描述
GPIO模式:八种模式(输入4种+输出4种)
输入浮空::GPIO_Mode_IN_FLOATING
可读取引脚电平,若引脚悬空则电平不确定,需要连续驱动源

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

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

模拟输入 :GPIO_Mode_AIN
GPIO无效,引脚直接接入内部ADC(ADC专属配置)

具有上拉或下拉功能的开漏输出: GPIO_Mode_Out_OD
可输出引脚电平,高电平为高阻态,低电平接VSS

具有上拉或下拉功能的推挽输出: GPIO_Mode_Out_PP
可输出引脚电平,高电平接VDD,低电平接VSS

具有上拉或下拉功能的复用功能推挽: GPIO_Mode_AF_PP
由片上外设控制,高电平接VDD,低电平接VSS

具有上拉或下拉功能的复用功能开漏: GPIO_Mode_AF_OD
由片上外设控制,高电平为高阻态,低电平接VSS
会选即可

二、使用库函数代码

1.GPIO赋值

代码如下(示例):

//开启-配置-赋值
// 开启APB2-GPIOA的外设时钟RCC
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//开启时钟函数固定,一个成熟设备会用到多个外设。全部打开就好。
//举例:手机打游戏,后台需要手机开机(电池供电),打开流量,打开游戏软件,声音等等

// 初始化PA0端口:定义结构体及参数   包括(引脚、速度和工作模式)
//固定搭配,引脚数可以更改 |
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;// GPIO_Pin_0|GPIO_Pin_1-15 or GPIO_Pin_All
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);



//GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
 GPIO_SetBits(GPIOA, GPIO_Pin_0);//(置1)选择的数据端口位,可以选同端口多位
//GPIO_ReSetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
 GPIO_ReSetBits(GPIOA, GPIO_Pin_0);//复位(置0)选择的数据端口位,可以选同端口多位
 GPIO_WriteBit(GPIOA, GPIO_Pin_1 | GPIO_Pin_2, BIT_SET);
 //对端口位进行写操作,支持BIT_SET/BIT_RESET,写1或写0,可以选同端口多位
 GPIO_Write(GPIOA, 0XFFFF);
 //对整个IO端口进行写操作,0xFFFF 对应 0-15 PIN全部置为1;0x0000全部置为0

请添加图片描述

2.GPIO读取

代码如下(示例):

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//这个函数是用来读取输入数据寄存器某一个端口的输入值,参数是GPIOx和GPIO_Pin,用来指定某一个端口。
//返回值是uint8_t,代表这个端口的高低电平。
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
//这个函数比上一个函数少了一个Bit,它是用来读取整个输入数据寄存器的,参数只有一个GPIOx,用来指定外设。
//返回值是uint16_t,是一个16位的数据,每一位代表一个端口值。
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//这个函数是用来读取输出数据寄存器的某一位,所以它并不是用来读取端口的输入数据的,这个函数一般用于输出模式下,用来看一下自己输出的是什么。
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
//这个函数比上一个函数少了一个Bit,是用来读取整个输出寄存器的。
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//这个函数是用来锁定GPIO配置的,调用这个函数,参数指定某个引脚,那这个引脚的配置就会被锁定,防止意外更改。
void GPIO_PinRemapConfig 
//【重要】:用于进行引脚重映射。将引脚功能重新定义到其他引脚
//重映射功能:如果需要某一个端口上实现两个功能,那么可以将其中一个功能重映射到另一个空闲端口上,这个空闲端口的重定义功能需要包含相应的功能。需查看芯片手册进行对照。

三、一点点C的基础

(1)C的数据类型。知道大小就好
C的数据类型
(2)宏定义 #define
用途:用一个字符串代替一个数字,便于理解,防止出错;提取程序中经常出现的参数,便于快速修改
定义宏定义:
#define ABC 12345
引用宏定义:
int a = ABC; //等效于int a = 12345
(3)关键字:typedef
用途:将一个比较长的变量类型名换个名字,便于使用
定义typedef:
typedef unsigned char uint8_t;
引用typedef:
uint8_t a; //等效于unsigned char a;
(4)结构体:struct
用途:数据打包,不同类型变量的集合
定义结构体变量:
struct{char x; int y; float z;} StructName;
因为结构体变量类型较长,所以通常用typedef更改变量类型名
引用结构体成员:
StructName.x = ‘A’;
StructName.y = 66;
StructName.z = 1.23;
(5)枚举:enum
用途:定义一个取值受限制的整型变量,用于限制变量取值范围;宏定义的集合
定义枚举变量:
enum{FALSE = 0, TRUE = 1} EnumName;
因为枚举变量类型较长,所以通常用typedef更改变量类型名
引用枚举成员:
EnumName = FALSE;
EnumName = TRUE;
代码中直接调用 FALSE,TRUE;即可


总结

喜欢举例子,方便理解。当个笑话看吧。
还是要单开一章用于C的指针。后面的中断和定时器会用到前面一点点的C的基础。不用刻意看,常用就熟了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值