主要学习STM32C8T6的基本配置以及各部件操作。
Q:哈希体系和冯洛伊曼体系区别?
前者是指令集和数据存储在不同存储器,后者是将两者存储在同一个存储器
计算机五大组成部分:控制器、运算器、存储器、输入设备、输出设备
32位处理器,一个指针4字节;64位处理器,一个指针8字节
STM32F103C8T6基本配置
STM32是小端存储,低地址的数据放在低字节上
堆从低地址向上增长,栈从高地址向下增长
内容
STM32F103C8T6最小系统版组成:MCU、时钟电路、复位电路、外部接口电路、电源电路,启动电路。
-
内核:Cortex-M3,32位处理器内核,最大寻址位2^32=4GB字节;
-
Flash:64K字节;
-
SRAM:20K字节;
2个ADC、4个定时器、2个IIC、2个SPI、3个USART、1个CAN
Q:Cotex-M3寄存器组的用法?
R0~R12为通用寄存器;R13是主堆栈指针(MSP)和进程堆栈(PSP);R14是链接寄存器(LR),R15是程序计数器(PC)
- R0—R3用于传参和表达式计算;
- R4—R11用于保存局部变量;
- R12是临时寄存器;
- R13是堆栈指针,别名:SP;
- MSP(Main Stack Pointer):主模式下使用
- PSP(Process Stack Pointer):操作系统/线程切换使用
- R14是链接寄存器,用于保存函数返回地址,别名:LR;
- R15是程序计数器,用于跳转到下一个执行的命令,别名:PC;
Q:STM32F1与F4的区别?
内核 :F1是M3,F4是M4
主频:F1最大主频是72MHz,F4最大主频是168MHz
浮点:F1无浮点计算,F4有
功能:F4外设比F1功能更强大
STM32的五个时钟源
-
HSI是高速内部时钟,RC振荡器,频率8MHz,精度不高
-
HSE是高速外部时钟,可接石英/陶瓷谐振器,频率4~16MHz,常用作主系统时钟源
-
LSI是低速内部时钟,RC振荡器,频率40KHz,通过低功耗时钟
-
LSE是低速外部时钟,石英晶体,频率32.768KHz
-
PLL是锁相环倍频输出,时钟源可以为HSI / 2、HSE或HSE / 2,倍频范围是2~16倍,最大72MHz
时钟树:系统时钟 SYSCLK → AHB(HCLK)→ APB1/PCLK1、APB2/PCLK2
Q:设置系统时钟的基本流程?
- 开启外部高速时钟HSE
- 设置Flash的等待周期
- 设置APB1、APB2、AHB分频系数(RCC_CFGR寄存器)
- 设置PLL的时钟来源和倍频系数
- 使能PLL
- 将系统时钟切换到PLL
STM32启动过程
-
通过Boot引脚决定启动方式(Flash、系统内存、SRAM)
-
加载中断向量表(从起始地址读取,比如0x0800 0000)
-
初始化栈指针(加载__initial_sp,这是向量表的第0项,0x0800 0000)
-
指向复位程序(执行Reset_Handler,这是向量表的第1项,0x0800 0004)
-
在Reset_Handler中
- 复制数据段(data)到RAM
- 清空BSS段
- 调用SystemInit设置系统时钟
- 调用 __main ----> main()
-
设置异常中断 HardFault_Handler
GPIO
-
四种输入:上拉输入、下拉输入、浮空输入、模拟输入
-
四种输出:通用推挽、复用推挽、通用开漏、复用开漏
APB1总线控制DAC、USB、I2C、SPI、CAN、串口2345、普通TIM
APB2总线控制ADC、USART1、GPIO、TIM1(高级定时器)、AFIO(复用功能)
Q:开漏与推挽的区别?
推挽可以正常输出高低电平,开漏只能输出低电平,高电平呈现高阻态,并且需要上拉电阻。
Q:通用和复用的区别?
通用是单纯做输入或输出,复用是用作外设功能引脚
蜂鸣器
内容
有源蜂鸣器:内部自带振荡电路,将正负极接上直流电压即可发声,频率固定。
无源蜂鸣器:内部不带振荡电路,需要控制器提供振荡脉冲发生,频率不固定。
中断
内容
EXIT(Extern Interrupt):外部中断控制器,监听GPIO引脚的电平变化
NVIC(Nested Vector Interrupt Control):嵌套向量中断控制器,负责中断响应,优先级管理
本质:程序运行时,EXIT监听指定GPIO电平,一旦发生改变,CPU会暂停当前任务并保存现场,向NVIC发出中断请求,去处理中断程序;当中断程序处理完成后,自行恢复现场,继续执行。
GPIO —> EXTI映射使用AFIO
触发方式:上升沿/下降沿/双边沿
Q:STM32支持多少个外部中断?
19个外部中断,但只有7个中断服务函数。
Q:中断和异常?
中断通常由外部硬件设备产生,如IO中断,时钟中断等;异常通常由CPU内部产生,如数组越界,除零操作等。
TIP:中断的优先级数值越小,优先级越高,比如抢占优先级和响应优先级。
TIMER
16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz时钟可以实现最大59.65s的定时。
-
基础定时器:仅支持计数
-
通用/高级定时器:支持向上计数、向下计数、中央对齐
HCLK是定时器输入时钟(一般是APB时钟),PSC是预分频器数值,RCC是自动重装寄存器(PWM的最大占空比)。

Q:如何设置一个20ms定时器?
- HCLK = 72MHz;
- 设置预分频系数PSC = 7199,计算CK_CNT = 10KHz = 0.1ms;
- ARR计数199次(200 - 1)。
Q:如果HCLK=72MHz,PSC=999,ARR=7199,那么是多少s?
T = (999 + 1)(7199 + 1) / 72000000 = 0.1s
Q:如何开启定时器?
- 开启RCC时钟
- 配置时基单元的时钟源
- 配置预分频系数和自动重装载值
- 配置中断控制和NVIC中断优先级
- 使能定时器
ADC
Analog - Digital Converter:模拟 - 数字转换器
12位逐次逼近型ADC,转换时间约1us
输入电压:0 ~ 3.3V,转换范围:0 ~ 4095
ADC转换的步骤:采样 —> 保持 —>量化 —> 编码
Q:STM32 ADC的总转换时间如何计算
T = 采样时间 + 12.5个ADC周期(12个周期量化,0.5周期位采样保持转换的准备时间)
例 1:F1 常见配置
HCLK = 72 MHz,PCLK2 = 72 MHz,ADC_PRE = 6 ⇒ f_ADC=12 MHz
采样时间选 13.5 cycles
1 个通道:
T_ch = (13.5 + 12.5) / 12 MHz = 26 / 12000000 ≈ 2.17 us
- 若一次转换 3 个通道且都用 13.5 cycles:
T_total = 3 × 2.17 us ≈ 6.5 μs
STM32的Flash
- Flash写入只能将1写成0,不能将0写成1,因此要写新数据,必须先擦除(擦除是将0恢复成1)
- 结构层级:页 < 扇区 < 块 < 芯片
| 每块 | 每扇页 | 每页 |
|---|---|---|
| 16扇页 | 16页 | 256 Byte |
常用的Flash擦写规则
- 最小擦除:扇区
- 可选择擦除:扇区、块、全片
- 最大写入单位:页(不能跨页写入)
- 最小写入单位:1 字节
- 未写入时默认FLASH全为1(0xFF)
- 写操作只能把1变成0,若需恢复0变1,则必须先擦除
Q:NOR Flash和NAND Flash区别?
NOR Flash支持随机读取,NAND Flash块读取
NOR读得比NAND快
NOR写和擦慢,容量小,价格贵
存储器对比
-
SRAM:静态随机存储,不需要定时刷新充电,存储速度快,容量小,断电丢失
-
DRAM:动态随机存储,需要定时刷新充电,价格比SRAM便宜,但访问速度慢
-
E2PROM:带电可擦除可编辑只读存储器,断电后仍能保存信息,可以单字节擦除
-
FLASH(ROM):闪存,存取速度慢,容量大,掉电不丢失,按扇区/块擦除
- 在持续高速工作(如CPU缓存频繁读写)时,SRAM的动态功耗更高。
- 在待机或低速工作时,DRAM因必需的刷新操作,其功耗(特别是刷新功耗)可能更为显著。
DMA
Direct Memory Access:直接存储器访问控制器
用途:允许外设或存储器和存储器之间高速数据传输,无需CPU干预,节省CPU资源
使用小寄巧:DMA可以获取当前剩余数据量,根据设置的接收buffer大小减去当前剩余数据量,得到当前接收数据大小
STM32F103C8T6 DMA资源: DMA1
Q:DMA配置三要素
源地址、目标地址和传输长度(传输方向,数据宽度,地址递增模式,优先级、循环模式)
Q:DMA的传输模式有哪些?
- DMA_Mode_Normal,正常缓存模式,完成指定大小传输后停止
- DMA_Mode_Circle, 循环模式,传输完成后自动重新加载,连续传输
通信协议总览
| 名称 | 双工 | 时钟 | 电平 | 设备 | 引脚 |
|---|---|---|---|---|---|
| UART | 全双工 | 异步 | 单端 | 点对点 | TX、RX |
| I2C | 半双工 | 同步 | 单端 | 多设备 | SCL、SDA |
| SPI | 全双工 | 同步 | 单端 | 多设备 | CS、SCLK、MOSI、MISO |
| CAN | 半双工 | 异步 | 差分 | 多设备 | CAN_H、CAN_L |
| USB | 半双工 | 异步 | 差分 | 点对点 | DP、DM |
UART
串口通信

低位先行:若发送信息0X0E,则传输数据位是0111 0000,最终接收信息0X0E
过程:起始一个低电平信号表示开始发送数据,接着是8个数据位,然后是校验位(奇/偶/NONE),最后是高电平表示停止位(0.5/1/1.5/2)

Q:开始位1Bit、数据位8Bit、停止位1Bit,波特率9600,则发送32个字节数据,需要多久?
波特率9600,即1s发送9600Bit,大概需要((1+8+1)*32)/9600=0.033s=33ms,要带上开始位和停止位。
Q:串口通信如何配置?
- 串口时钟使能,GPIO时钟使能
- 复位串口外设
- 配置GPIO
- RX为浮空输入,TX为复用推挽
- 初始化串口参数(波特率,数据位,校验位,收发模式)
- 开启中断并初始化NVIC
- 使能串口外设
- 编写串口函数
Q:描述下RS232和RS485的区别?
TTL(全双工):0V表示0,+3.3V~+5V表示1
RS232(全双工):+3V ~ +15V表示0,-3V ~ -15V表示1,(TTL通过RS232芯片)
RS485(半双工):两线电压差-2V ~ -6V表示0,+2V ~ +6V表示1(TTL通过RS485芯片)
I2C
Inter IC BUS(同步、半双工),支持一主多从和多主多从(MSB高位先行)
两根通信线:SCL(Serial Clock)、SDA(Serial Data),上拉电阻一般4.7K~10K
STM32支持7/10位地址模式,地址0x00通常被保留,不可用,因此从机地址127位。

Q:I2C总线在传输过程中有哪些类型信号?
- 开始信号:SCL高电平,SDA由高到低,开始发送数据
- 结束信号:SCL高电平,SDA由低到高,结束发送数据
- 应答信号:SCL高电平,发送8Bit数据,接收端向发送端发低电平,表示成功接收(在接收前需要释放SDA)
TIP:一旦 开始信号产生后,数据传输必须在 SCL 为低时开始。
1 | // 作图,记得SCL先行,他决定了此时的信号状态,想一想Start和Stop |
TIP:软件模拟I2C时,SDA电平切换只出现在SCL低电平阶段,不要搞混
Q:I2C的软硬件模式怎么配置?
硬件模式:复用开漏输出+上拉电阻;内部有固定I2C结构;有通信速率设置,400Kbps
软件模式:通用开漏输出+上拉电阻;通过GPIO模拟I2C信号;没有通信速率配置,需要自己写一个delay,100Kbps
TIP:有些人偷懒用 GPIO_MODE_OUTPUT_PP(推挽)来模拟,那必须手动释放SDA变高
Q:I2C的仲裁机制?
“线与”操作(&&),即低电平优先,谁先发送低电平,谁就对总线占有控制权。
Q:I2C的从机设备地址ID、写地址、读地址?
1
2
3
4
5
6
7 该部分需要查询对应芯片手册!
举例AT24C02,地址ADDR = 1010,控制格式1 0 1 0 A2 A1 A0 R/W。
若A2 = 0,A1 = 0,A0 = 0,写操作R/W=0,读操作R/W=1
// TIP: 正常I2C发送7位,是不带R/W,所以设备地址有变化,详细可以去问下GPT
设备地址 0101 0000 0X50(控制格式去掉R/W后右移,高位补0)
写地址为 1010 0000 0XA0(设备地址<<1 | 0)
读地址为 1010 0001 0XA1(设备地址<<1 | 1)
特定地址写

当前地址读

SPI
Serial Peripheral Interface:串行外设接口(MSB先行),速度比I2C快很多
四根通信线:
- SCLK(Serial Clock)
- MOSI(Master Output Slave Input)
- MISO(Master Input Slave Output)
- CS
MISO输入为上拉或浮空输入,SCLK、MOSI输出配置为复用推挽输出、CS配置为推挽输出。
-
起止条件:CS高电平切换到低电平
-
终止条件:CS低电平切换到高电平
-
发送信息:CS一直为低电平
Q:四种工作模式
时钟极性CPOL(上升沿/下降沿);时钟相位CPHA(第一个边沿/第二个边沿)
- CPOL = 0 ------>上升沿
- CPOL = 1 ------> 下降沿
- CPHA = 0 ------>第一个边沿
- CPHA = 1 ------> 第二个边沿
Q:如何确定使用哪个模式
看从机空闲状态是低电平还是高电平,来确认CPOL;再从从机芯片时序图里确认何时采取数据。
下图解释:在没有进入Cycle时,通过SPICLK是高低电平来判断CPOL;CPHA通过正中间的那个边沿判断。
Q:陀螺仪可以用SPI通信吗,有什么好处?
有的既可以使用SPI,也可以使用I2C,当然SPI的传输速度会更快
MPU6050只能I2C,MPU9250/QMI8658可以I2C和SPI
看门狗
看门狗监控程序运行状态,当程序因为设计漏洞、硬件故障导致出现卡死等问题时,看门狗可以及时复位程序;本质是定时器,在指定范围内,程序没有执行喂狗(重置计数器),看门狗硬件会自动产生复位信号。
独立看门狗(IWDG):独立于主系统时钟,时间精度低,开启就无法关闭。
窗口看门狗(WWDG):能产生系统复位信号和提前唤醒中断。
I2S
I2S(Inter-IC Sound)是一种广泛应用于数字音频传输的串行接口标准
应用场景如下
I2S RX方向:麦克风在机械振动下将声音信号转变为电压信号,电压信号经过放大等处理,给到ADC采样,将模拟信号转化为数字信号;音频在ADC与DSP之间的传输协议就是使用的I2S协议。
I2S TX方向:数字信号经过编码、存储、压缩等技术后,发送给解码器DAC(DSP、专用解码器),将数字信号还原为模拟信号,最后给到喇叭完成声音/音频的播放。音频在DAC与DSP之间的传输就是使用I2S协议。

基本信号线

时钟线(Continues Serial Clock,SCK):SCK提供传输时的时钟信号,确定了数据传输的速度和时序,也称之为BCLK;SCK的频率 = 2 x 采样频率 x 位宽
左/右声道线(Left-Right Clock,LRCK):LRCK线指示了当前传输的是左声道的音频数据还是右声道的音频数据。又称帧同步信号。LRCK的频率 = 采样频率
数据线(Serial Data,SD):SD线用于传输实际的音频数据。数据的位宽可以根据具体应用而变化,通常为16位或32位。TX方向为:Serial Data Out(SDOUT);RX方向为:Serial Data In(SDIN)。
常见参数说明
-
采样率:1s中采样总次数
-
位宽(Word Length):位宽指定每个采样数据的位数,通常为16位或32位。较大的位宽可以提供更高的分辨率和动态范围。
-
时钟极性(Clock Polarity):时钟极性确定了数据位传输的时钟沿。根据具体的I2S设备和系统设置,可以定义在时钟上升沿或下降沿开始数据传输
-
帧同步极性(Frame Sync Polarity):帧同步极性确定了帧同步信号的有效电平。帧同步信号指示音频数据的帧起始和结束位置。
-
传输格式(Data Format):传输格式定义了音频数据的编码方式,传输格式还可以指定数据的顺序,如左声道先传输还是右声道先传输
主从模式
I2S工作模式可以是主模式(Master Mode)或从模式(Slave Mode)。两者唯一的区别是:Master Mode提供时钟信号(SCK)和帧同步信号(LRCK)

数据传输模式
I2S接口标准中,存在三种数据传输模式,分别是:飞利浦标准模式(I2S mode),左对齐(Left Justified)和右对齐(Right Justified)三种传输模式。
- 飞利浦标准模式

(1)LRCK(左右声道选择信号):LRCK信号用于指示当前数据帧是左声道数据还是右声道数据。飞利浦格式中,当LRCK为低时,表示当前传输的数据是左声道数据;当LRCK为高时,表示当前传输的数据为右声道数据
(2)SCK(位时钟):数据传输的时钟信号。在SCK下降沿发送数据,在SCK上升沿采样数据
(3)Data Delay:发送的有效数据相对于LRCK的跳变沿(从0到1或从1到0)延迟一个时钟周期
(4)数据发送从MSB开始;数据MSB与LRCK delay 1个SCK的边沿对齐
- 左对齐模式

(1)在左对齐格式中,LRCK为高时,表示当前传输的数据为左声道数据;当LRCK为低时,表示当前传输的数据为右声道数据
(2)在SCK下降沿发送数据,在SCK上升沿接收数据
(3)无data delay:发送的有效数据相当于LRCK跳变沿(从0到1或从1到0)不延迟
(4)数据发送从MSB开始;数据MSB与LRCK跳变沿对齐
- 右对齐模式

(1)右对齐格式中,LRCK为高时,表示当前传输的数据为右声道数据;当LRCK为低时,表示当前传输的数据为左声道数据
(2)在SCK下降沿发送数据,在SCK上升沿接收数据
(3)无Data delay:发送的有效数据相当于LRCK跳变沿(从0到1或从1到0)不延迟
(4)数据发送从MSB开始;数据LSB与LRCK跳变沿对齐
数据位宽与位深
位宽计算过程:
位宽:每个通道在一帧里占用的比特数
f_LRCK,左右声道时钟,就是采样率f_s
f_SCK,串行时钟,传输每一位数据的时钟频率
N,通道数,一帧里面包含的音频通道数;比如I2S->N=2;TDM_I2S->N=4,8…
位宽(槽宽):在一帧中,每个通道占用的bit数
位深:表示音频数据量化后的精度(位宽 >= 位深)
下面是32位位宽,20位位深,实际位宽就是一个通道能采到多少数据,位深是实际有效的数据,也就是不包括donnot care部分。

CAN(以下的不建议看,去看另外一篇吧)
内容
CAN总线(Controller Area Network Bus)控制器局域网总线。
一个节点包括3个部分:微处理MCU、CAN控制器、CAN收发器。(CAN_H、CAN_L为双绞线)
开环网络两端必须有2.2KΩ的终端电阻;闭环网络两端必须有120Ω的终端电阻(抗干扰作用);
(信号到终端被电阻吸收,避免反射回干扰下一次信号,所以一般都是放两端)

CAN BUS(右边那一块)上的总线电平称为隐形电平和显性电平。
IOS11898标准
| 名称 | 性质 | 逻辑 | CAN_H | CAN_L | 两条线上的电压差 |
|---|---|---|---|---|---|
| Recessive | 隐性 | 逻辑1 | 2.5V | 2.5V | 0 |
| Dominant | 显性 | 逻辑0 | 3.5V | 1.5V | 2V |
多个节点一起开始发送,会涉及到总线仲裁。
CAN帧的种类
| 序号 | 名称 | 帧用途 |
|---|---|---|
| 1 | 数据帧 | 用于发送单元向接收单元传送数据的帧。 |
| 2 | 遥控帧 | 用于接收单元向具有相同 ID 的发送单元请求数据的帧。 |
| 3 | 错误帧 | 用于当检测出错误时向其它单元通知错误的帧。 (硬件自动完成) |
| 4 | 过载帧 | 当一个节点正忙于处理接收的信息,可以通知其它节点暂缓发送新报文。(硬件自动完成) |
| 5 | 帧间隔 | 用于将数据帧及远程帧与前面的帧分离开来的帧(硬件自动完成) |
每个节点都可以自己发送帧(帧是CAN协议规定发送或接收的单位)


| 序号 | 名称 | 描述 |
|---|---|---|
| 1 | 帧起始 | 表示帧的开始,产生一个bit的显性电平 |
| 2 | 仲裁段 | 表示帧的优先级, 由标识符(ID)和传送帧类型(RTR)组成 |
| 3 | 控制段 | 表示数据的字节数,由6个bit构成 |
| 4 | 数据段 | 数据的具体内容,可发送0~8 个字节的数据 |
| 5 | CRC段 | 用于校验传输是否正确 |
| 6 | ACK段 | 表示确认是否正常接收(0为应答) |
| 7 | 帧结束 | 表示此帧结束 |

-
仲裁段:可以根据配置好的设置,自动判断要不要接收报文,该方案也叫作过滤,判断依据是每个报文的ID。
-
标准格式的标识符长度为11位,拓展格式是29位
-
RTR位,它来表明是数据帧(0)还是远程帧(1)
-
IDE表明此帧是标准帧(0)还是拓展帧(1)。
-
控制段:控制段表示数据段的字节数。
-
保留位(r0、r1),必须全部以显性电平发送,但接收方可以接收显性、隐性的各种组合。
-
数据长度码(Data Link Control),数据字节必须为0-8字节,但接收方对数据字节数=9~15的情况并不视为错误。

数据段:0-8个字节数据,CAN控制器有对应的寄存器。
位填充机制:当检测到五个连续相同的位信号,实际发送会自动插入一个补码,位填充区域为SOF到CRC结束之间
仲裁方案
-
在总线空闲时,最先开始发送的节点获得发送权,一旦开始发送,不会被其他节点抢占。
-
多个节点同时开始发送时,各发送节点从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的节点可继续发送。(从左到右,Dominant :显性优先)
-
具有相同ID的数据帧和远程帧在总线上竞争时,仲裁段的最后一位(RTR)为显性位的数据帧具有优先权可继续发送。
-
标准格式ID与具有相同ID的远程帧或者扩展格式的数据帧在总线上竞争时,标准格式的RTR 位为显性位的具有优先权可继续发送。
CAN过滤器配置
过滤模式:列表模式和掩码模式
列表模式:列出ID名称,判断ID是否一致来判断是否接受或者丢弃,受到列表容量大小限制。
掩码模式:确定ID特定位的值来判断是否接受或丢弃,不受列表容量大小限制。
配置过滤器,有三个重要的寄存器:CAN_FSIR、CAN_FxR1、CAN_FxR2
CAN总线错误分类

CubeMX配置
1、配置波特率
位数据段:同步段----传播段(补偿CAN网络的物理延迟)----相位缓冲段1----相位缓冲段2(补偿相位误差)
可能会有早到的,也可能会有晚到的,通过上面的四段可以进行拉长缩小来操作。
2、打开CAN的接受中断,两个接收邮箱、三个发送邮箱。
参考
嵌入式面试知识点总结 – STM32篇_stm32 112+16+64-CSDN博客
嵌入式知识点(STM32、uart、spi、iic等总线)_i2c dma hardfault-CSDN博客
STM32: ADC采样频率及相应时间的确定_adc采样频率计算公式-CSDN博客
基础通信协议之 IIC (I2C) 详细讲解_i2c通信的详细讲解-CSDN博客
