新建工程
引入启动文件
Start中是启动文件,是STM32中最基本的文件,不需要修改,添加即可。
启动文件包含很多类型,要根据芯片型号来进行选择:
如果是选择超值系列,那就使用带 VL 的启动文件,若是普通版就选择不带VL的
然后再根据Flash的大小,选择LD(lower density),MD,HD或者XL
stm32f10x.h 是STM32的外设寄存器描述文件,是用来描述STM32有哪些寄存器和它对应地址的
system文件 是用来配置时钟的
由于STM32是由内核和内核外围的设备组成的,并且内核的寄存器描述(CoreSupport
)和外围的寄存器描述文件(DeviceSupport
)不是在一起的,因此还需添加“内核寄存器”的描述文件。
两个CM3 是内核的寄存器描述
引入库函数文件
当project中没有引入Library时,即无库函数,使用编程是通过直接操作寄存器来进行的。因此需要引入STM32的库函数。
1.引入头文件和源文件
STM32F10x_StdPeriph_Driver 为STM32标准外设驱动文件夹,其中
inc 是库函数的头文件
src 是库函数的源文件,在其中:misc 是内核的库函数,其他的是内核外的外设库函数
将这两个文件夹下的头文件和源文件全部复制到,项目文件夹下的Library中。
keil5 中将文件加入工程。
2.引入配置文件
STM32F10x_StdPeriph_Template 是一个示例项目文件夹,其中
stm32f10x_conf.h (configuration) 文件是用来配置库函数头文件的包含关系的,还有用于参数检查的函数定义,是所有库函数都需要的。
两个以 it 结尾的文件 是用来存放中断函数的。
将这3个文件复制到项目的User中。
keil5 中将文件加入工程。
4.Keil软件配置
打开主函数所引入的第一个头文件 stm32f10x.h, 在偏向最下方的部分找到
#ifdef USE_STDPERIPH_DRIVER
#include "stm32f10x_conf.h"
#endif
这是一个条件编译,表示:如果定义了 USE_STDPERIPH_DRIVER 语句(使用标准外设驱动),其中的引入头函数语句才有效。
因此,复制语句USE_STDPERIPH_DRIVER
到 keil5 软件的魔法棒 → C/C++ → Define:。
再把下方的头文件路径中加入 Library和user。
工程新建完成
经过以上两步操作,引入了启动文件和库函数文件,分别放在 Start 和 Library 之中,配置完成后,这两个文件夹中的文件都是不需要修改的(人家给的权限也是只读)。
需要修改的只有 User 文件夹下的代码。
GPIOC 是指单片机(如 STM32、Arduino 等)中的一个 GPIO 端口,其中 GPIO 是 General Purpose Input Output(通用输入输出)的缩写,而 C 表示这个端口属于 C 组。
在单片机中,GPIO 可以被用来控制数字信号的输入和输出。例如,可以将 GPIOC 配置为输出模式,在程序中控制它的高低电平,从而控制外部设备的状态或执行某些操作。另外,GPIOC 也可以被配置为输入模式,从而读取外部设备发送的数字信号。
GPIO
简介
- GPIO (General Purpose Input Output) 通用输入输出口
- 可配置8种输入输出模式
- 引脚电平:0V~3.3V,部分引脚可容忍5V(具体有哪些可以参考 STM32 的引脚定义,带FT的就是可容忍5V的)
- 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
- 输入模式下可读取端口的高低电平或电压,用以读取按键输入、外接模块电平信号输入(压敏)、ADC电压采集、模拟通信协议接收数据(MQTT)等
基本结构
- 在STM32种,所有的GPIO都是挂载到 APB2 外设总线上的,其中GPIO外设的名称是按照GPIOA,GPIOB,GPIOC这样来命名的,每个GPIO外设总共有16个引脚,编号是0到15。
- 寄存器:STM32 是32位的单片机,故寄存器都是32位的,寄存器的每一位对应一个引脚。但端口只有16位,因此寄存器只有低16位有对应端口,高16位未使用到。
- 驱动器:用来增加信号的驱动能力,寄存器只负责存储数据,若要进行点灯之类的操作,需要驱动器来增大驱动能力。
GPIO位结构
数据输入(从右向左看):
- 保护二极管:保护内部电路
当输入电压高于3.3V时,上方保护二极管导通,输入电压产生的电流会流入 V D D V_{DD} VDD,而不会流入内部电路,可避免过高的电压对内部电路产生伤害。
当输入电压比0V还要低(相比于 V S S V_{SS} VSS,故可以有负电压),下方二极管就会导通,电流会从 V S S V_{SS} VSS直接流出,也不会从内部汲取电流,保护了内部电路。 - 上拉电阻和下拉电阻(配置参数):给输入提供一个默认的输入电平(输入引脚不接高低电平)
上导通,下断开——上拉输入模式,此时引脚默认高电平(1)
下导通,上断开——下拉输入模式,此时引脚默认低电平(0)
两个都断开——浮空输入模式,此时引脚的输入电平极易受外界干扰而改变(?) - 施密特触发器:对输入电压进行整形
给一个上限阈值和下限阈值,当输入电压高于上限阈值时,输出就是高电平。当然输入电压低于下限阈值时,输出就是低电平。这样能够使得有噪声的模拟信号整形成稳定的信号,可以有效避免因信号波动造成的输出抖动现象。
由此,信号便进入了输入数据寄存器,再用程序读取寄存器中的数据,便可以获得端口的输入电平了。
也可以输入到片上外设,分别有模拟输入和复用功能输入。
数据输出(从左往右看):
数据输出的来源有两种:输出数据寄存器和片上外设。
- 位设置/清除寄存器:对单独某一位进行置1或置0
由于输出数据寄存器只能整体进行操作,故若想对某一位进行单独处理的话,就只能读出来,改变它,再写入的方式进行,而使用“位设置/清除寄存器”可以更高效地实现该目的。 - 输出控制(配置参数):选择数据来源是寄存器还是片上外设。
- MOS电子开关(配置参数):
- 推挽输出模式:P-MOS和N-MOS均有效
当寄存器的数据为1时,上管导通,下管断开,输出连接 V D D V_{DD} VDD,输出高电平。
当寄存器的数据为0时,上管断开,下管导通,输出连接 V S S V_{SS} VSS,输出低电平。
这种模式下,高低电平均有较强的驱动能力,故该模式也称 强推输出模式。 - 开漏输出模式:N-MOS有效,P-MOS无效(上管断开)
当寄存器的数据为1时,下管断开,输出相当于断开,高阻模式。Unknown
当寄存器的数据为0时,下管导通,输出连接 V S S V_{SS} VSS,输出低电平。
这种模式下,只有低电平均有驱动能力,故该模式可以作为通信协议的驱动方式,或用于输出5V的电平信号。 - 关闭模式:P-MOS和N-MOS均无效(引脚配置为输入模式时)
- 推挽输出模式:P-MOS和N-MOS均有效