寄存器
寄存器:就是一个地址的别名
c
#define GPIOF_BASE 0x40021400
#define GPIOF_ODR *(unsigned int*)(GPIOF_BASE+0x14)
GPIOF_ODR = 0xFF;
LED闪灯实验
实现功能:实现蓝灯闪烁、红灯常亮。
点亮LED的原理图见图1.2,图2为推挽接法,当VDD导通时LED亮,当VSS导通时LED灭。也就是通过编程的方式,向IO引脚写0或者写1来控制LED的点亮或者熄灭。
除了推挽接法可以控制LED点亮和熄灭之后,还有开漏接法,见图1.3,在开漏接法中P‑MOS一直不导通,当N‑MOS关闭时,LED点亮,当N‑MOS打开时,LED熄灭。
那么怎么判断该采用推挽接法还是开漏接法呢?
对于内置的LED而言,无法选择采用推挽接法还是开漏接法,因为内部已经接好了。而对于外置LED既可以设置IO引脚为推挽还是开漏。如果外接电源则选择开漏,不外接电源则采用推挽。
见图1.4为STM32的最小系统板原理图,1代表板子上的芯片,2中D1 LED是红灯,是电源指示灯,只要给系统板通上电就会亮。D2 LED就是蓝色LED,连接的是单片机上PC13这个引脚,根据左侧VCC判断这个LED是开漏接法。后续设置PC13引脚的工作模式设置为开漏模式。
首先需要开启GPIOC的时钟,因为需要使用PC13引脚来控制LED点亮和熄灭,而PC13引脚归单片机中的GPIOC外设管理,时钟可以理解为心跳,外设可以理解为器官,給外设开启时钟可以理解为让这个外设开始工作。
之后调用GPIO的编程接口。
GPIO_Init接口是初始化一根IO引脚,初始化的意思就是在使用IO引脚之前配置一下IO引脚的参数,具体来说,
1)对于一个IO引脚一共有八种工作模式可选,4种输入、4种输出,对于一个IO引脚需在这8种中选择1钟。
2)IO引脚还有最大输出速度,是选择2M、10M、50M最大输出速度。
GPIO_WriteBit接口是向输出数据寄存器写1个bit位。
例将IO接口设置为通用输出推挽模式,调用GPIO_WriteBit函数向bit写1则IO引脚向外输出高电压,写0则IO引脚输出低电压。
IO接口设置为通用输出开漏模式,调用GPIO_WriteBit函数向bit写1则IO引脚向外输出低电压,写0则IO引脚输出高电压。
GPIO四种输入模式
GPIO 输入模式:外部电平 → 芯片物理引脚 → 引脚内部输入缓冲器 → 片内寄存器(输入数据寄存器 IDR),CPU 通过读取寄存器获知引脚电平。
施密特触发器的作用是只有电平越过上限阈值才输出高;必须跌到下限阈值以下才变回低。小幅噪声跨不过两个阈值,不会产生抖动。施密特触发器的作用最直接的就是电压转数字。
按钮实验
实现功能:按下按钮时LED点亮、松开按钮LED熄灭。
例子 1:按键读取 → 选用【上拉输入】
引脚内部默认高电平,按键一端接引脚、一端接地。
- 没按键:引脚 = 高电平
- 按下按键:引脚被拉低 = 低电平
单片机读取电平就能判断有没有按下。
- 上拉电阻:接线:按键一端接 GPIO,一端接 GND
- 下拉电阻:接线:按键一端接 GPIO,一端接 VCC
例子 2:点亮 LED → 选用【推挽输出】
GPIO 输出高电平→电流流出点亮 LED;输出低电平→熄灭。
推挽驱动力足,不用额外加电阻增强驱动。
例子 3:I2C 通信 → 选用【开漏输出 + 外部上拉电阻】
多条设备总线共用两根线,任意一个设备拉低电平即可通信,不会短路。
简易选择口诀
如果要向芯片内部输入信号,选用上拉或下拉电阻,如果外部有电源则选择下拉电阻,如果没电源则选择上拉电阻
如果要向芯片外部输出信号,选用推挽或开漏输出,如果外部有电源则选择开漏输出,如果没有电源则选择推挽输出。
先设置初始化GPIOA的时钟,之后初始化引脚gpio_pin_0和gpio_pin_1,pin_0设置为推挽输出,pin_1设置为上拉输入,因为设置为上拉输入了所以输入寄存器默认是高电平0。
串口通信协议
串口是通信接口,通信就是用来传输数据的,比如在两个芯片之间传输数据就可以通过串口。左面芯片通过TX引脚发送数据,右边芯片通过RX引脚接收数据。所以接线的时候需要将两个芯片的TX和RX交叉连接。串口要通过导线传输数据就要有数据格式,数据格式就是双方都懂的数据。
串口传输协议:在空闲时输出高电平,在数据开始之前输出一个低电平。之后输出数据,数据输出完成之后有一个高电平的停止位。之后是空闲电平。
数据传输协议可以设置下面三个内容。
- 数据尾可以把最后一位作校验位。
- 停止位也可以设置为0.5,1,1.5,2。
- 数据位可以是8位+1个校验位 以及 7位+1个校验位。校验位可以用于积校验和偶校验。
UART
芯片内部的UART模块会将发送数据寄存器中的数据进行并到串转化,将接收寄存器的内容进行串到并的转化。并且可以设置数据帧格式,有多少个数据位、终止位有几个、校验方式是什么。如下图

串口数据帧是由一个位一个位组成的,比如起始位占1位,数据位占8位。波特率就是每秒钟最多传输多少位。常用波特率有:9600、115200、921600。
波特率可以根据时钟和波特率寄存器进行设置。波特率寄存器的值就是X,X也是分频器的值。如下图

具体编程接口如下图


USART_Init ()配置 USART 外设的通信参数,把串口硬件逻辑配置好,此时参数写到寄存器,但串口模块还没运行。USART_Init只做参数配置,不会打开 USART 外设时钟,也不会使能 USART 模块本身,配置完串口还不能收发数据。STM32 外设默认时钟是关闭的,不给时钟,外设寄存器无法读写,硬件不工作。USART 的 TX/RX 引脚是 GPIO,GPIO 也需要时钟。
初始化完USART外设之后,需要设置USART模块的TX和RX引脚,但引脚编号是多少,输入输出模式是什么,都不知道。

如下图所示,USART外设一共有5个引脚,根据数据手册中的引脚分布表,查询可知对应引脚编号。
引脚的输入输出模式分为通用和复用两种。如下图所示,通用模式是CPU直接往寄存器写值,而复用模式是CPU向对应外设模块写,外设模块再向寄存器中写值控制引脚输出。

如下图所示,是IO引脚分布表,可以看出USART1的TX和RX引脚对应PA9和PA10。

而如果PA9、PA10引脚出现问题,则可以重映射到PB6、PB7引脚。


那么知道是哪个引脚之后,就需要知道相关引脚的输入输出模式。
