STM32入门学习

 新建工程

STM32的开发方式主要有寄存器的方式,基于标准库也就是库函数的方式和基于HAL库,基于寄存器的方式和51单片机的开发方式一样,使用程序配置寄存器,这种方式最底层、最直接、效率会高。STM32的结构复杂,寄存器太多,基于寄存器的方式不推荐。用标准库

(一)添加工程需要必要文件才能执行,在工程下新建文件夹Start,把必要文件复制在工程下的Start文件

Start文件里面有:启动文件,外设寄存器描述文件,内核寄存器描述文件,System文件函数配置文件

STM32启动文件,STM32程序就是从启动文件开始执行的

STM32F1系列启动文件型号分类,新建工程的启动文件选择,根据型号和Flash容量,添加了启动文件md.s

stm32f10x.h是STM32外设寄存器描述文件,他的作用跟51单片机的头文件REGX52.H一样,用来描述STM32寄存器和对应地址,main函数一开始要引用。两个System文件来配置时钟,STM32主频72MHZ,就是System文件函数配置的。

STM32是内核和内核外围的设备(外设)组成,内核的寄存器描述和外围设备的描述文件不是在一起的,还需要添加一个内核寄存器的描述文件,这两个cm3(Cortex-M3)文件就是内核寄存器描述,.c文件是内核配置函数

文件带了个小钥匙,文件只读,不可更改

因为文件不是放在一个组里面,所以需要添加路径

(二)在工程下新建一个Library文件夹,放库函数

misc是内核库函数(内核描述寄存器),其他是内核外的外设库函数(外设描述寄存器)

(三)在工程下新建User文件夹,把main函数放里面

conf(configration)文件是用来配置库函数头文件(Library文件夹)的包含关系,里面还有参数检测函数定义,这是所有库函数都需要的。两个it(interrupt)文件是用来存放中断函数的,放USER文件夹里面

这是一个条件编译,如果定义了USE_STDPERIPH_DRIVER这个字符串,这个stm32f10x_conf.h才有效

使用库函数必须定义,在魔术棒的C/C++的Define添加USE_STDPERIPH_DRIVER,定义USE_STDPERIPH_DRIVER。这样子才能包含标准外设库,也就是库函数。

在头文件路径,把User,Libary的路径都添加上

Libaray不用改,把Libaray往上,舒服点

startup启动文件,程序执行最基本的文件,启动文件内定义了中断向量表,中断服务函数,中断函数中有个复位中断,是整个程序的入口,当STM32上电复位或者按下复位键,程序进入复位中断函数执行,复位中断函数做了两件事情,第一个是调用SystemInit,第二个是调用main函数

stm32f10x.h已经包含了stm32f10x_conf.h,使用库函数时,只需要包含stm32f10x.h,就相当于包含了所有库函数头文件

占空间的主要是Listing和Object这两个文件夹,都是工程的中间文件。如果要把工程分享给别人,双击批处理文件,会把中间文件删除。重新编译,文件又回来

:批处理文件,可以把工程编译产生的中间文件都删掉,放在工程下

总结:main函数包含stm32f10x.h,stm32f10x.h定义USE_STDPERIPH_DRIVER,stm32f10x_conf.h有效,stm32f10x_conf.h配置了库函数头文件,库函数又封装了描述寄存器

GPIO输出/输入

GPIO简介

输出主机控制高低电平,输入从机控制高低电平,主机读取高低电平

:GPIO是俗称的IO口,容忍5V(FT)是可以在端口输入5V的电压,认为是高电平。对于输出最大只能输出3.3V,供电只有3.3V。

:外接模块电平信号输入是读取带有数字输出的一些模块,比如套件里的光敏电阻、热敏电阻。如果模块输出的是模拟量,GIPIO还可以配置模拟输入模式,再配合ADC外设,直接读取端口的模拟电压。

:模拟通信协议接受数据是接受通信线上的数据,也是靠GPIO的输入完成的。

GPIO基本结构

:每个GPIO外设,总共有16的引脚,编号从0-15。

:在每个GPIO模块,主要包含了寄存器和驱动器,寄存器是一段特殊的存储器,内核通过对APB2总线对寄存器进行读写,就可以完成输出电平和读取电平的功能。寄存器的每一位对应一个引脚,输出寄存器写1,对应的端口是高电平。

:STM32是32位的单片机,STM32内部寄存器是32位,但是端口只有16位(引脚),只有寄存器低16位对应有端口,高16位没有用到。

:驱动器是增加信号的驱动能力的,寄存器只负责存储数据,需要驱动器来增大驱动能力

GPIO位结构

:左边3个寄存器,中间是驱动器,右边是某一个IO口引脚。整体结构分为两个部分,上面是输入部分(I/O输入),下面是输出部分(I/O口输出)。

:IO引脚(输入)接了两个保护二极管,对输入电压进行限幅。上面二极管接VDD(3.3V),下面接VSS(0V)。输入电压比3.3V高,上方的二极管会导通。输入电压产生的电流直接流入VDD而不会流入内部电流。避免过高的的电压对内部电路产生伤害。输入电压比0V要低,电压相对于VSS的电压,可以有负电压,下方二极管会导通,电流从VSS流出去(负电压,阴极流向阳极),而不会从内部汲取电流,可以保护内部电路。输入电压0-3.3V,二极管不会导通。

:从IO口往左走上面的输入部分,连接了一个上拉电阻和下拉电阻,上拉电阻至VDD,下拉电阻至VSS。这个开关可以通过程序进行配置。输入引脚不接,会处于一种浮空状态,引脚输入电平极易受外界干扰而改变,上拉输入称作默认高电平的输入模式,下拉是默认低电平的输入方式。输入引脚接入,如果外部设备没有提供足够的电流,则上拉电阻可以确保GPIO输入端口保持在高电平状态,从而消除输入信号的任何浮动或干扰。上拉下拉断开,浮空输入模式。上拉电阻和下拉电阻阻值比较大,是弱上拉和弱下拉,不影响正常的输入操作。

蓝色是施密特输出信号

:ttl肖特基是施密特触发器的一个低功耗产品。施密特触发器的作用是对输入电压进行整形,执行逻辑是输入电压大于某一阈值,输出瞬间升为高电平。输入电压小于,则降为低电平。高于上限或低于下限才会转电平。没有施密特触发器,数字信号会产生失真,可能因为干扰导致误判。

:经过施密特触发器整形的波形就可以直接输入数据寄存器,再用程序读取输入寄存器对应某一位数据,就可以知道端口的输入电平。

:至片上外设是连接片上外设的端口,模拟输入是连接ADC,ADC需要接收模拟量,所以接到施密特触发器前面的。复用功能输入是连接到其他需要读取端口的外设,比如串口的输入引脚。这根线接收的是数字量,所以接到施密特触发器后面。

:数字部分可以由输出数据寄存器或上片外设控制,两种控制方式通过这个数据选择器接到了输出控制部分。选择通过输出数据寄存器进行控制,就是普通的IO口输出,写这个数据寄存器的某一位就可以操作对应的某个端口。输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写。位设置/清除寄存器可以用来单独操作数据寄存器的某一位,不影响其他位。对某一位进行置1,在位设置寄存器对于位写1,不需要操作的写0。对某一位进行清零,在位清除寄存器对于位写1。

:输出控制之后接到了两个MOS管,MOS管用来输出高低电平。上面是P-MOS,下面是N-MOS,MOS管是一种电子开关,信号控制开关的导通和关闭,开关负责将IO口接到VDD和VSS。在推挽输出模式下,P-MOS和N-MOS均有效。数据寄存器为1,上管导通,下管断开,输出直接接到VDD,输出高电平。数据寄存器为0,上管断开,下管导通,输出直接接到VSS,输出低电平。这种模式下,高低电平均匀较强的驱动能力,推挽输出也可以叫强推输出模式。在推挽模式下,STM32对IO口就有绝对的控制权,高低电平由STM32决定。在开漏输出模式,P-MOS是无效的,只有N-MOS工作,数据寄存器为1时,下管断开,输出限定于断开,是高阻模式。数据寄存器为0时,下管导通,输出直接到VSS,输出低电平。这种模式下,只有低电平有驱动能力,高电平是没有驱动能力的。开漏模式可以作为通信协议的驱动方式,I2C的通信模式使用开漏模式。在多机通信的情况下,这个模式避免多个设备相互干扰。另外开漏模式可以用于输出5V的电平信号,在IO口外接一个上拉电阻5V的电源。输出低电平时(I/O口输出),内部的N-MOS直接接VSS(电流由VSS到I/O口)。但输出高电平,MOS管关闭,由外部的上拉电阻拉高至5V,这样可以输出5V的电平信号,兼容5V电平的设备。 当I/O配置输入模式,两个MOS管关闭,输出关闭,端口(I/O口)电平由外部信号控制。

:两个推挽输出,构成H桥电路,控制直流电机反转。三个推挽输出,可以用于驱动三相无刷电机。

GPIO模式

:除了模拟输入会关闭数字的输入功能,其他模式输入都有效

:引脚悬空时,上拉输入默认高电平,下拉输入默认低电平。浮空输入(上拉和下拉都不工作)电平是不确定的,在使用浮空输入,端口一定要接上一个连续的驱动源,不能出现悬空的状态。

:上面的输入保护写的是VDD或者VDD_FT,是3.3V端口和容忍5V的区别。容忍5V的引脚,上边保护要做一下处理,直接接VDD3.3V,外接入5V电压导致上边二极管开启。

:模拟输入是ADC模数转换器的专属配置

:数字输出口,可以用于输出高低电平。两个的区别是开漏输出的高电平呈现高阻态,没有驱动能力,推挽输出的高低电平都是具有驱动能力的。

:输出是由输出数据寄存器控制的,P-MOS无效,就是开漏输出,P-MOS和N-MOS都有效,推挽输出。

:在输出模式下,输入模式也是有效(内部可以顺便输入)。在输入模式下,输出模式无效。

:片上外设用复用开漏/推挽输出

:普通输出(输出数据寄存器)是没有连接的,引脚的控制权转移到了片上外设,由片上外设控制。输入部分,片上外设也可以读取引脚的电平。普通输入有效,顺便接收电平。

拓展

在STM32微控制器中,使用复用功能的输出模式通常是为了将GPIO引脚分配给内置外设的功能。

串口通信:当你需要使用USART(通用同步异步收发器)进行串口通信时,相关的TX(发送)和RX(接收)引脚需要设置为复用推挽输出或复用开漏输出模式,以便它们能够按照USART协议传输数据。

I2C通信:对于I2C接口,涉及的SCL(时钟线)和SDA(数据线)同样需要配置为复用输出模式,以确保正确的I2C通信协议。

定时器输出:在使用定时器生成PWM信号或其他输出时,相关引脚也需要设置为复用推挽输出或复用开漏输出模式,以便定时器能够控制引脚的状态。

外部设备控制:当需要控制连接到STM32的外部设备时,如LED灯、传感器等,如果这些设备是通过STM32的某些内置外设功能(如ADC、DAC等)进行控制,则相应的GPIO引脚也需要设置为复用输出模式。

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值