STM32

寄存器

寄存器:就是一个地址的别名

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交叉连接。串口要通过导线传输数据就要有数据格式,数据格式就是双方都懂的数据。

串口传输协议:在空闲时输出高电平,在数据开始之前输出一个低电平。之后输出数据,数据输出完成之后有一个高电平的停止位。之后是空闲电平。

数据传输协议可以设置下面三个内容。

  1. 数据尾可以把最后一位作校验位。
  2. 停止位也可以设置为0.5,1,1.5,2。
  3. 数据位可以是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引脚。

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

相关推荐
HQB202610 小时前
EG1198|屹晶微电子 120V 内置 MOS 异步降压 DC‑DC(高性价比)
嵌入式硬件·硬件工程
果壳science11 小时前
张祥前实验如何获取正电荷
笔记·科技·嵌入式硬件·硬件工程·制造
南山电子nscn11 小时前
中科芯CETC汽车电池管理系统BMS进口芯片国产型号替代指南
单片机·汽车·bms
沉淀的.晴天12 小时前
can总线
stm32
桀人12 小时前
认识AT24C02
stm32·单片机·嵌入式硬件
国科安芯13 小时前
星间激光通信终端CANFD控制网络的时延确定性与辐射可靠性
网络·嵌入式硬件·信息与通信·canfd·低轨卫星·商业航天·抗辐射
一直C14 小时前
嵌入式 Linux 驱动开发学习笔记:内核定时器、platform 总线与 I²C 驱动
linux·驱动开发·嵌入式硬件·学习·imx6ull
传感器与混合集成电路14 小时前
150MHz主频、8路DAC与6路PWM:JLH221360伺服控制SIP解析
嵌入式硬件
comyccccc14 小时前
STM32PID控制板设计全解析学习笔记
单片机·嵌入式硬件
碧海银沙音频科技研究院15 小时前
实现炬芯ATS308X的usb cdc 串口IAP 固件升级功能实现
人工智能·嵌入式硬件·深度学习·算法