STM32-GPIO(1)

1.startup_stm32f10x_md.s启动文件中的复位中断,是整个工程的入口;

当STM32上电复位或者按下复位键以后,程序先进入复位中断函数执行;中断函数:调用SystemInit函数,调用main函数。

SystemInit函数作用:设置微控制器(STM32)启动;初始化嵌入式闪存接口,锁相环;更新系统内核的始终变量(此函数仅在复位后需要调用)

stm32f10x.h是外设的寄存器描述,core_cm3.h是内核的寄存器描述;包含:寄存器信息,地址信息。

(32位微处理器)使用十六进制进行,表示就是(32/4=8)使用8位十六进制进行表示(定义32位变量进行使用)

conf中包含了Library全部外设库函数的头文件,在f10x.h文件(Start)中又将conf文件包含(User)

conf配置文件包含全部的库函数头文件,这里声明可以外部调用;我们在stm32的外设寄存器描述文件(stm32f10x.h)中,又包含了conf.h文件,所以,我们加入stm32外设寄存器描述头文件(stm32f10x.h)就可以库函数和寄存器文件相对应,我们加入stm32f10x.h一个头文件就包含全部库函数头文件!!!

2.GPIO的输出

GPIO 通用输入输出口:可配置为8种输入输出模式

引脚电平:0~3.3v,部分引脚可容忍5v(可输入5v,也看作高电平;输出最大也就3.3v(供电3.3v))

注意:容忍5v输入的引脚(FT:Five Tolerate)

输出模式:控制端口输出高低电平,用来驱动LED,控制蜂鸣器,模拟通信协议输出时序

注意:在其他应用场景,只要是用高低电平控制的设备,都可以用GPIO来控制;对于功率需求比较大的设备,加入驱动电路即可。

输入模式:读取端口的高低电平或电压,用于读取按键输入,外接模块电平信号输入(光敏电阻模块,热敏电阻模块),ADC电压采集,模拟通信协议接收数据

3.GPIO挂载在APB2总线上面,GPIO外设根据,GPIOA、GPIOB、GPIOC进行命名,每个GPIO有16个引脚。(GOIPA:PA0~PA15)端口:Pin

(寄存器都是32位的,端口Pin只有16位,所以是寄存器低16位配置到端口,高16位没有用到)

注意:寄存器配驱动电路,增加寄存器输出信号的驱动能力;寄存器只负责存储数据!!

4.GPIO位结构

左边三个寄存器,中间驱动电路,右边是某一个GPIO端口引脚

上下:上面是输入部分,下面是输出部分

(1)端口接保护二极管:对输入电压进行限幅(VDD:3.3V VSS:0V)

如果输入电压大于3.3V,那么引脚和VDD有电压差,二极管导通,输入电压产生的电流流入VDD,而不会流入内部电路。避免过高电压对电路产生伤害。

如果输入电压小于0V(相对应VSS的电压,可以有负电压)下方二极管导通,电流从端口直接流出去,而不会从内部电路流出电流(汲取电流)从而保护电路。

如果输入电压在 0V~3.3V之间,二极管对电路无影响,正常工作使用!!!

(2)输入部分

(1)进入输入部分先连接一个上拉电阻和一个下拉电阻(通过程序控制开关的通断)接通上面,就是上拉输入模式,就将输入拉至上面,保持一个稳态;

接通下拉电阻开关,就是下拉输入模式,就将输入拉至下面,保持稳定;

如果两个开关都不接,就处于浮空状态;浮空状态是不对引脚输入电压做任何处理,这样极易受到外界干扰而改变。

注意:为了避免引脚悬空导致的输入数据不确定,我们在这里加上上拉或者下拉电阻,就将引脚置1或置0;上拉和下拉的阻值较大,即通过压降后,输入的电压较小(上拉下拉能力小);是弱上拉和弱下拉,目的是尽量不影响正常的输入操作。

(2)后面是一个TTL施密特触发器(将输入电压转换成高低电平)

施密特触发器(运放电压比较器):对输入电压进行整形;执行逻辑:当输入电压大于上限阈值,输出就会变为高电平;当输入电压小于下限阈值,输出就会变为低电平

注意:输入端输入数字信号,实际情况可能会产生各种失真;有一个夹杂波动的高低变化电平信号,如果没有施密特触发器,很可能因为这些毛刺、波动干扰导致信号误判,定义两个阈值

端口也能输入模拟信号,使用ADC转换得到数字量

(输入模拟信号,模拟量是连续变化的不需要整形;当端口输入数字信号时候,有波动,需要整形)

(上限阈值、下限阈值)只有高于上限(输出高电平)或者低于下限(输出低电平)输出电平才会变化,在阈值范围内,输出不会变化(会维持上一个电平)(滞回比较器?)

注意:有效避免因信号波动出现的输出抖动

(3)后面写入输入数据寄存器,然后我们可以进行读取

(3)输出部分

输出部分可以由输出数据寄存器或者片上外设控制

输出数据寄存器(只能整体读写):普通IO口输出,写寄存器的某一位(低16位)就可以操作对应的某个端口

操作输出数据寄存器某一位的方式

(1)先将此时寄存器是数据读出,然后根据按位与按位或,更改某一位,最后将更改后的数据写到寄存器进行输出!!

(2)位设置/位清除寄存器:某一位 置1,在位设置寄存器对应位写1即可,剩下不操作的位写0,会自动将输出数据寄存器对应位写1,剩下写0位,保持原来的值。

(3)读写STM32的位带区域(51的位寻址)专门有一段地址区域,映射了RAM和外设寄存器所有的位,读写这段地址的某一位,就相当于读写映射位置的某一位。

位设置/位清除寄存器:单独操作输出数据寄存器的某一位,不影响其他位;还可以进行输出数据寄存器清零的操作。

对某一位进行清零的操作,在位清除寄存器的对应位写1即可

注意:位设置/位清除寄存器,包含两个寄存器,一个是位设置一个是位清除,这是因为一个GPIO只有16个端口,寄存器都是32位的,刚好可以设置两个16位寄存器在一个32位寄存器中,16位刚好对应端口数!!!

输出控制之后就接到两个MOS管,上面是P-MOS,下面是N-MOS(电子开关)

NMOS是高电平导通,低电平断开,PMOS是低电平导通,高电平断开。

可以选择 推挽输出 ,开漏输出,关闭 三种输出方式

1.推挽输出:P-MOS和N-MOS都有效果;要输出高电平,就上面P-MOS(高电平)接通,接到VDD,输出高电平;要输出低电平,就下面NMOS(低电平)接通,接到VSS,输出低电平。(高低电平都有较强的驱动能力,所以推挽输出模式也可叫做强推输出模式)

注意:推挽输出模式下,STM32对IO口有绝对的控制权,高低电平都由STM32说了算

2.开漏输出:N-MOS有效,P-MOS无效;数据寄存器为1时,N-MOS(开关)断开,输出相当于断开,高阻模式(输出引脚是悬浮状态);数据寄存器为0时,N-MOS接通,拉到VSS,输出低电平。(1没有驱动能力,高阻态模式;0有驱动能力)

注意:

开漏模式的作用:

(1)作为通信协议的驱动方式!!!避免各个设备的相互干扰

(2)输出5V的电平信号,在IO口直接接上拉5V的电阻;高电平在开漏模式下无法输出,低电平可以输出,通过外接的5V电平输出高电平,实现输出5V的电平信号;用于兼容5V电平的设备。

3.关闭:引脚配置为输入模式,P-MOS,N-MOS都无效,输出关闭;端口的电平由外部信号来控制!!

GPIO模式

通过配置GPIO的端口配置寄存器(位结构的电路就会根据我们的配置改变,如:开关通断,NOMS,PMOS是否有效,数据寄存器的选择)

端口可以配置成以下8种模式

浮空输入:电平是不确定的,使用浮空输入时,端口一定要接一个连续的驱动源,不能出现悬空的状态。(也是为了保持稳定)

在输出模式下,输入也是有效的;在输入模式下,输出模式是无效的

一个端口只能有一个输出,但是可以有多个输入。配置成输出模式的时候,内部也可以顺便输入以下。

复用的引脚电平由片上外设控制;其他模式由stm32控制

端口配置寄存器:低寄存器,高寄存器(进行模式,输入输出功能配置)

每一个端口的模式由4位进行控制;16个端口由64位进行配置,需要两个寄存器

端口输入数据寄存器:接收端口的高低电平,低16位对应16个引脚;高16位不使用

端口输出数据寄存器:输出端口的高低电平,低16位对应16个引脚,高16位不使用

端口位设置/位清除寄存器:高16位实现位清除功能,低16位实现位设置功能。

注意:写1进行位设置/位清除,写0就是对位不产生影响

端口位清除寄存器:低16位和上面寄存器高16位功能是一样的,如果只想单一使用位清除或位设置的操作,分别使用两个寄存器就可以;两个功能都要使用,就使用上面的寄存器进行配置。

LED:发光二极管

蜂鸣器:有源蜂鸣器,无源蜂鸣器

有源蜂鸣器:内部自带振荡源:政府及接上直流电压即可持续发声,频率固定

无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,可以改变提供的振荡脉冲频率,发出不同频率的声音。(51,不停的反转IO口,产生脉冲信号,从而使蜂鸣器发声(可以调节周期频率))

一般选择低电平使使能,一般单片机都是高电平驱动能力若,低电平驱动能力强

注意:PNP型的接蜂鸣器在下面;NPN型的接蜂鸣器在上面;

(左边基极,上面发射极,下面集电极)

因为三极管的通断需要在发射极和基极之间产生一定的开启电压(有一定的)如果接负载可能导致三极管不能导通

(流入或者流出的两级之间不能接负载,需要一定的电压,接负载之后就降压了,导致不能导通)

面包板:竖着的五个孔,内部都是连接在一起的,上下两排+-是全部连在一起的。

LED :长脚是正极

LED点亮:为了方便没有接限流电阻

Keilkill.bat文件可以把工程编译产生的中间文件删掉,给程序瘦身(20M到2M)

相关推荐
最后一个bug42 分钟前
rt-linux中使用mlockall与free的差异
linux·c语言·arm开发·单片机·嵌入式硬件·算法
musir11 小时前
寄存器控制LED灯亮
单片机
JaneZJW1 小时前
Proteus仿真——《51单片机AD和DA转换器的设计》
单片机·嵌入式硬件·51单片机·proteus
NEWEVA__zzera223 小时前
利用光耦来隔离485芯片与串口引脚,实现自动收发485电路
单片机·嵌入式硬件
m0_748240543 小时前
STM32第十一课:STM32-基于标准库的42步进电机的简单IO控制(附电机教程,看到即赚到)
stm32·单片机·嵌入式硬件
温柔的男孩像海洋丶4 小时前
vscode的keil assistant 中搜索不到全局变量
ide·vscode·单片机
沐欣工作室_lvyiyi4 小时前
基于单片机的多功能智能小车(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·单片机毕业设计
鸿喵小仙女5 小时前
C# WPF读写STM32/GD32单片机Flash数据
stm32·单片机·c#·wpf
lucy153027510795 小时前
MCU 功耗基准测试
科技·单片机·嵌入式硬件·智能家居·信号处理·工控主板
m0_748240916 小时前
OpenMV与STM32通信全面指南
stm32·单片机·嵌入式硬件