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引脚。

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

相关推荐
优信电子5 小时前
STM32F103C8T6连接ESP-01S实现WiFi通信:TCP客户端开发实战(二)
stm32·嵌入式硬件·物联网·tcp/ip·esp8266·stm32f103c8t6·esp01/01s
智闲电子设计6 小时前
STM32 外扩 QSPI Flash 实战:字库和开机图存不下,就把 W25Q64 映射成内存直接读
网络·stm32·嵌入式硬件
嵌入式阿蔡6 小时前
逻辑分析仪实战:从波形一眼看出 UART/SPI/I2C 通信错在哪
网络·stm32·单片机·嵌入式硬件·嵌入式实时数据库
LCG元6 小时前
STM32H743串口DMA空闲中断不定长接收与D-Cache一致性踩坑实录
stm32·单片机·嵌入式硬件
LCG元7 小时前
STM32内部温度传感器供电漂移8℃的根因定位与VREFINT比例校准实测
stm32·单片机·嵌入式硬件
我是一棵无人问荆的小草1 天前
stm32f103单片机的NVIC分组2介绍
stm32·单片机·嵌入式硬件
紫幽1 天前
从 0 用 Vue 做屏并生成 LVGL 单片机代码(完整源码备忘)
前端·单片机
智者知已应修善业1 天前
【51单片机数码管逐位显示1-8余位不亮】2024-10-23
c语言·经验分享·笔记·嵌入式硬件·51单片机
Be for thing1 天前
【嵌入式成长3】STC89C51外部中断|中断原理、寄存器、中断服务函数
单片机·嵌入式硬件·学习
科芯创展1 天前
1A,5.5VIN,同步升降压恒流芯片,XZ3442
单片机