STM32学习笔记--寒枫24年9月
Hanphone 2024.8
概念
单片机
单片机(Single-Chip Microcomputer),本质上是一种集成电路芯片,单片机包括 CPU,SRAM(静态存储),FLASH 和外设(IO、IIC、LCD 等),特点是体积小(<5mm*5mm)、功耗低(mA)、集成度高(都在一个芯片上,因此叫单片)。采用 RISC 精简指令集(ARM 与 RISC-C)。
STM32 含义
ST:意法半导体,M:MCU 微控制器,32:32 位处理器(包括寄存器)。
命名规则
图片 STM32F103C8T6
基本结构
引脚类型与接口
下载;电源;晶振;复位;BOOT;GPIO;
(下载建议使用SWD 接口,可以调试且占用引脚少)
最小系统
各模块内部电路暂时不了解
IO 分配
优先分配特定外设 IO,然后分配通用 IO,最后微调
STM32 串口与电脑 USB 通信
串口通信:
指串口按位(bit)发送和接收字节,是一种设备间非常常用的串行通讯方式。串口可以在使用一根线发送数据的同时用另一根线接收数据。进行串口通信时发送或者接收的每个字(即字节或字符)一次发送一位,每一位都是逻辑‘1’或者‘0’。 串口通信协议:指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。 知识链接
外设
外设指的是单片机外部的外围功能模块,分为片上外设(已经被集成到芯片上但又不属于内核)和片下外设,STM32 的关键外设包括 GPIO、定时器、ADC 等。。
存储器与寄存器映射
OLED 屏幕
常用驱动函数,掌握使用即可
| OLED_Init(); | 初始化 |
|---|---|
| OLED_Clear(); | 清屏 |
| OLED_ShowChar(1, 1, 'A'); | 显示一个字符 |
| OLED_ShowString(1, 3, "HelloWorld!"); | 显示字符串 |
| OLED_ShowNum(2, 1, 12345, 5); | 显示十进制数字 |
| OLED_ShowSignedNum(2, 7, -66, 2); | 显示有符号十进制数字 |
| OLED_ShowHexNum(3, 1, 0xAA55, 4); | 显示十六进制数字 |
| OLED_ShowBinNum(4, 1, 0xAA55, 16); | 显示二进制数字 |
STM32 开发环境
三种开发方式:
基于寄存器;基于标准库;基于 HAL 库(图形化,隐藏了底层逻辑)
Keli5 开发环境配置
统一放置在工程文件夹中新建 Start 文件夹:从固件库的 arm 中获取启动文件,外围寄存器、内核寄存器、时钟描述文件,添加到 Start 文件夹中
往 User 文件夹添加中断函数等,是使用库函数必须的
建立 main.c 文件,文件的最后一行必须是空行
点击扳手按钮,调整界面与编码格式
建立工程文件夹,Keil中新建工程,选择型号
工程文件夹里建立Start、Library、User等文件夹,复制固件库里面的文件到工程文件夹
工程里对应建立Start、Library、User等同名称的分组,然后将文件夹内的文件添加到工程分组里
工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹
工程选项,C/C++,Define内定义USE_STDPERIPH_DRIVER
工程选项,Debug,下拉列表选择对应调试器,Settings,Flash Download里勾选Reset and Run
启动文件选择: 根据 Flash 容量和型号来选择
烧录文件: output 文件夹里 .hex 文件
界面美化
视频链接 global.prop 保存配置
tab:选中代码段整体移动
F12: 选中变量或函数后跳转
三种调试方式
显示屏调试:将单片机和显示屏相连接,打印调试信息
Keli 调试:调试模式
串口调试:需要掌握串口通信,使用电脑
STLINK Utility
GPIO——通用输入与输出
GPIO(General Purpose Input/Output,直接翻译为:通用目的输入与输出)引脚是 STM32 单片机上最基本的 I/O 接口,用于连接各种外部设备。每个 GPIO 引脚都有一个对应的寄存器,用于控制其配置和状态。
具体请查看数据手册,原理图要有所了解
typedef struct {
uint32_t MODER; // 模式寄存器
uint32_t OTYPER; // 输出类型寄存器
uint32_t OSPEEDR; // 输出速度寄存器
uint32_t PUPDR; // 上拉/下拉电阻寄存器
uint32_t IDR; // 输入数据寄存器
uint32_t ODR; // 输出数据寄存器
uint32_t BSRR; // 置位/复位寄存器
uint32_t LCKR; // 锁定寄存器
uint32_t AFR[2]; // 复用功能寄存器
} GPIO_TypeDef;
//gpio.c和gpio.h 中有GPIO库函数
按键
按键弹簧有抖动,需要设置延时
中断
特定的中断触发条件(中断源),使 CPU 暂停当前程序,转而处理中断程序;中断可嵌套,且有优先级。 有内部中断和外设中(EXTI)
中断是一种重要的控制手段
NVIC 嵌套中断向量控制器
属于内核外设,直接连接 cpu。中断优先级分为抢占优先级和排队优先级,具体查表。
EXTI
监测指定 GPIO 口的电平信号

TIM(timer 定时器)
了解一定的结构,熟练使用相关函数
原理
定时器计时是通过计数来实现的。定时器内部有一个计数器,这个计数器根据一个时钟(这个时钟来自于 ARM 的 APB 总线,然后经过时钟模块内部的分频器来分频得到)来工作。每隔一个时钟周期,计数器就就计数一次,定时器的时间就是计数器计数值 x 时钟周期。
最重要的控制(控制产生中断),有正计时、倒计时(定时)、测量时间间隔
定时中断

具体看 timer.c 文件
配置时基单元定时时间:
计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1) = CK_PSC / (PSC + 1) / (ARR + 1), PSC 预分频值,ARR 自动重装值
输出比较
OC(Output Compare),通过比较 CNT 与 CCR 寄存器值的关系,来对输出电平进行置 1、置 0 或翻转的操作,用于输出一定频率和占空比的 PWM 波形
PWM
(Pulse Width Modulation)脉冲宽度调制,通过微处理器的数字输出来对模拟电路进行控制。以一个较高的频率来让电平跳动从而实现器件在效果上的具有连续性的控制常用于控制舵机、直流电机等
PWM 输出 (掌握)
PWM 频率: Freq = CK_PSC / (PSC + 1) / (ARR + 1) PWM 占空比: Duty = CCR / (ARR + 1) PWM 分辨率: Reso = 1 / (ARR + 1)
脉冲宽度是高电平持续的时间
输入捕获
当通道输入引脚出现指定电平跳变时,当前 CNT 的值将被锁存到 CCR 中,可用于测量 PWM 波形的频率、占空比、脉冲间隔、电平持续时间等参数。
编码器接口
相关概念
时钟树
TM32 有很多外设器件,每个器件的始时钟信号不一样,所以要将一个固定的信号频率进行倍频/分频处理,达到每个外设需要的频率。时钟信号的分频就像树的分支一样,这就是时钟树。 知识链接
看门狗
看门狗就是一个定时器,只不过定时时间到了之后不只是中断,还可以复位 CPU。
RTC
RTC 实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器 TIM 外设,只有计时功能(也可以触发中断)。但其高级指出也就在于掉电之后还可以正常运行。 知识链接
ADC
ADC 将来自外部环境的模拟信号(例如来自传感器的温度、压力、光强等)转换为数字形式,常常用于采集传感器数据,比如监控温度、湿度、光照等环境参数。 知识链接
DMA
**给两种外设提供一条数据通路,直接让数据由 A 拷贝到 B 不经过 CPU 的处理,作用就是实现数据的直接传输,而去掉了传统数据传输需要 CPU 寄存器参与的环节。**受到触发后,进行存储地址的映射。知识链接
通信
概念
双工
全双工可双向通信互不影响,单工则只能单向通行,半双工位双向通信互相影响
同步与异步
接时钟线,则通信设备时钟同步;不接时钟线,则时钟异步,需要约定采样频率等,对齐采样位置
电平
单端:即共地,要接 GND;差分:电压差传输信号
串口通信
电平标准(常用 TTL)
串口参数及时序(协议)
TX 引脚输出定时翻转的高低电平,RX 引脚定时读取引脚的高低电平
USART
支持同步和异步的收发器,是实现串口协议的硬件电路 TM32 内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从 TX 引脚发送出去,也可自动接收 RX 引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里
支持同步模式、硬件流控制(由波特率控制器以及发送/控制控制器实现)、DMA、NFC、IrDA(红外)、LIN(局域网)
起始位侦测、数据采样、波特率计算
数据模式
HEX 模式/十六进制模式/二进制模式:以原始数据的形式显示
文本模式/字符模式:以原始数据编码后的形式显示
UART
只支持异步的收发器,由于很少用到同步收发,所以使用上与 USART 类似
芯片原理图与模块功能
芯片原理图P11

很好的一张电路原理图 ↓:
外设
24 个片上外设
| 英文缩写 | 名称 | 英文缩写 | 名称 |
|---|---|---|---|
| NVIC | 嵌套向量中断控制器 | CAN | CAN 通信 |
| SysTick | 系统滴答定时器 | USB | USB 通信 |
| RCC | 复位和时钟控制 | RTC | 实时时钟 |
| GPIO | 通用 IO 口 | CRC | CRC 校验 |
| AFIO | 复用 IO 口 | PWR | 电源控制 |
| EXTI | 外部中断 | BKP | 备份寄存器 |
| TIM | 定时器 | IWDG | 独立看门狗 |
| ADC | 模数转换器 | WWDG | 窗口看门狗 |
| DMA | 直接内存访问 | DAC | 数模转换器 |
| USART | 同步/异步串口通信 | SDIO | SD 卡接口 |
| I2C | I2C 通信 | FSMC | 可变静态存储控制器 |
| SPI | SPI 通信 | USB OTG | USB 主机接口 |
实践部分
以下实践部分见文件夹内项目代码与演示图片
串口通信实现 PC13 的闪烁
串口通信理论部分见上
OLED 屏显示串口通信数据
将串口通信中 stm32 接收到的数据在 OLED 上显示
PWM 舵机驱动
PWM 波形生成及工作原理
波形生成过程图:

PWM 就是一个 DA 转换,通过面积等效法将离散的数字信号模拟输出了连续的模拟信号。
s90 舵机工作原理
根据输入 PWM 信号占空比来控制输出 33333 角度:PWM 波形的周期通常为 20ms,而脉冲宽度在 0.5ms 到 2.5ms 之间变化,对应的舵盘位置从 0 度到 180 度呈线性变化。
驱动 s90 舵机实现旋转
接线方法: 红-------------------------VCC 棕色----------------------GND 橙色----------------------信号线