江协科技STM32入门教程


前言

博主在学习STM32的同时,对学习内容做了较为详细的记录,包括理论知识和代码例程,为了方便整理总结,故发表此博客,希望和大家共同学习,共勉!

一、STM32 GPIO口简介

二、GPIO工作模式

2.1 四种输入:

在这里插入图片描述

浮空输入:此端口在默认情况下什么都不接呈高阻态,这种设置在数据传输时用的比较多。

上拉输入:上拉输入模式与浮空输入模式相比,仅仅是在数据通道上部,接入了一个上拉电阻,这个上拉电阻的阻值介于 30K~50K 欧姆,CPU 可以随时在输入数据寄存器的另一端,读出 I/O 端口的电平状态。
这种模式的好处在于我们什么都不输入时,由于内部上拉电阻的原因,处理器会觉得我们输入了高电平,这就避免了不确定的输入。该端口在默认情况下输入为高电平

下拉输入:下拉输入模式与浮空输入模式相比,仅仅是在数据通道上部,接入了一个下拉电阻。与上拉输入模式类似,这种模式的好处在于外部没有输入时,由于内部下拉电阻的原因,我们的处理器会觉得我们输入了低电平
在这里插入图片描述

模拟输入:STM32 的模拟输入通道的配置很简单,信号从 I/O 端口直接进入 ADC 模块。此时所有的上拉、下拉电阻和施密特触发器,均处于断开状态,因此输入数据寄存器将不能反映端口上的电平状态,也就是说,模拟输入配置下,信号不经过输入数据寄存器,CPU 不能在输入数据寄存器上读到有效的数据。该输入模式,使我们可以获得外部的模拟信号。
在这里插入图片描述

2.2四种输出:

在这里插入图片描述

开漏输出:开漏输出不可以直接输出高电平,开漏输出的输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。

推挽输出:推挽输出可以输出高、低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由 IC 的电源决定。
在这里插入图片描述

开漏复用输出:复用,即GPIO口的状态是由片上外设控制的,GPIO 的基本功能是普通的 I/O,而 STM32 有自己的各个功能模块
在这里插入图片描述

二、新建第一个工程

在这里插入图片描述
点击扳手,选择UTF8,防止中文乱码
在这里插入图片描述

三、库函数配置

Library文件:存放库函数
在这里插入图片描述
两个it(interrupt)文件是用来存放中断函数
宏定义:在这里插入图片描述
添加宏定义
库函数:间接配置寄存器

  1. 使能时钟、
  2. 配置端口模式
    在这里插入图片描述
    第一个选择显示哪个GPIO,第二个是参数的结构体
    跳转查看函数介绍
    在这里插入图片描述
    GPIO_InitTypeDef为结构体类型,GPIO_InitStructure为结构体类型定义的变量
    在这里插入图片描述
    开启使能->定义一个名字》选择推挽模式(高低电平)》选择P13口》速度
    GPIO_SetBits选择高电平
    GPIO_ResetBits选择低电平
    结构体定义放在第一行

三、GPIO基本结构

在这里插入图片描述
每个GPIO外设,都有16个引脚,所以只使用低16位
寄存器(32位 )就是特殊的存储器,用于存储数据,内核通过APB2总线对寄存器读写
驱动器用来增加信号的驱动能力
输出寄存器写1,对应引脚输出高电平
输出寄存器写0,对应引脚输出低电平
为了避免引脚悬空导致的输入数据不确定,需要加上上拉电阻或者下拉电阻
上拉输入默认为高电平输入模式
下拉默认为低电平输入模式
开漏模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”会使端口保持高阻态 (Hi-Z)(P-MOS 始终不激活)所以配置为开漏输出外部必须有上拉电阻,一般就面向一些总线设备如IIC。
高阻态(High impedance)表示电路中的某个节点具有相对电路中其他点相对更高的阻抗。通俗的讲,可以看作输出(输入)电阻非常大。它的极限状态可以认为悬空(开路)。也就是说理论上高阻态不是悬空,它是对地或对电源电阻极大的状态。
推挽模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”可激活P-MOS。
施密特触发器:用于对输入电压进行整形,可以有效避免因信号波动造成的输出抖动现象。
施密特触发器(Schmitt trigger)是包含正反馈的比较器电路。
• 当输入电压高于正向阈值电压,输出为高;
• 当输入电压低于负向阈值电压,输出为低;
• 当输入在正负向阈值电压之间,输出不改变,也就是说输出由高电准位翻转为低电准位,或是由低电准位翻转为高电准位时所对应的阈值电压是不同的。只有当输入电压发生足够的变化时,输出才会变化,因此将这种元件命名为触发器。
施密特触发器可作为波形整形电路,能将模拟信号波形整形为数字电路能够处理的方波波形。

四、工程示例

4.1 LED灯闪烁

第一步:RCC开启GPIO时钟(时钟相当于GPIO外设心脏)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
第二步:使用GPIO_Init函数初始化GPIO
在这里插入图片描述

跳转GPIO_Pin的时候,会有多个定义,选择member这一项
在这里插入图片描述
点灯用推挽输出
第三步:使用输出或者输入函数控制GPIO口
在Library找到rcc.h这个文件,在.h文件最下遍,一般都是库函数所有函数声明
最常用的RCC函数:AHB,APB2,APB1
介绍:
这里插入图片描述
GPIO外设:
void GPIO_DeInit(GPIO_TypeDef* GPIOx);调用这个外设后,所指定GPIO外设就会被复位
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);用结构体的参数来初始化GPIO口
一般初始化外设都用INIT函数
GPIO_StructInit,这个函数可以把结构体变量赋一个默认值
GPIO_WriteBit()用于将引脚电平置一或者清零(点灯就可以直接用这个)
在这里插入图片描述
实现读写函数

4.2 LED流水灯

通过按位或
在这里插入图片描述

4.3 按键介绍

示意图:使用引脚PB12口
在这里插入图片描述
在这里插入图片描述
单片机需要对抖动进行过滤
在这里插入图片描述
图一:按下按键引脚为低电平,松手引脚为高电平(常用)
下边两种相反
按键一端接GPIO口,另一端接GND

4.3 按键控制LED

对于驱动代码,一般会进行封装
LED.c用来存放驱动程序的主体代码,LED.h用来存放这个驱动程序对外提供的函数或者变量的声明
没有代码提示的话摁 ctrl+alt+空格(代码提示)

在LED.c初始化完成后将LED_Init初始化函数放到LED.h(注意+分号)
在这里插入图片描述
在这里插入图片描述
两个下划线前边+空格
Endif和ifndef组成括号
对模块外部声明,这个函数可以被外部调用
在主函数头文件中加入#include “LED.h
在这里插入图片描述
void在函数的最前面代表没有返回值,就是KEY初始化这样,void在括号里面代表不输入参数,但需要有返回值

4.5 OLED硬件介绍

在这里插入图片描述
硬件电路
在这里插入图片描述
在这里插入图片描述
Show Char显示函数:第一个参数指定行第二个参数指定列,第三个参数是要显示的字符
ShowNum显示十进制数字,第四个为长度,长度参数比数字长度大,就会在前边补0,比数字长度小,就会把高位切掉
Stm32引脚上电后,如果不初始化,默认浮空输入模式
Keil5调试功能:Debug –使用st-link

五、C语言补充知识

在这里插入图片描述

unsigned char无符号字符型
因为左边一列的名字比较长,而且int的位数根据系统的不同也会不同,所以起了新的名字_t表示是用typedef命名的变量类型
在这里插入图片描述
在这里插入图片描述
宏定义和typedef的区别:宏定义的新名字在左,typedef的新名字在右边且typedef只能专门给变量类型换名字
在这里插入图片描述
作用:组合不同类型变量
例:struct{char x;int y;float z;}c即为定义一个结构体变量,名字叫c
结构体的引用:格式为结构体变量名称加点然后为结构体子项的名称,来引用结构体成员,或者使用结构体指针
在这里插入图片描述
因为比较长,用typedef将结构体换个名字
在这里插入图片描述
在主函数中,还需要给结构体变量类型命名一个结构体变量名字,直接使用结构体变量的名字来引出结构体成员数据
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值