1. 1. Q:哈希体系和冯洛伊曼体系区别?
  • STM32F103C8T6基本配置
    1. 1. 内容
    2. 2. Q:Cotex-M3寄存器组的用法?
    3. 3. Q:STM32F1与F4的区别?
  • STM32的五个时钟源
    1. 1. Q:设置系统时钟的基本流程?
  • STM32启动过程
  • GPIO
    1. 1. Q:开漏与推挽的区别?
    2. 2. Q:通用和复用的区别?
  • 蜂鸣器
    1. 1. 内容
  • 中断
    1. 1. 内容
    2. 2. Q:STM32支持多少个外部中断?
    3. 3. Q:中断和异常?
  • TIMER
    1. 1. Q:如何设置一个20ms定时器?
    2. 2. Q:如果HCLK=72MHz,PSC=999,ARR=7199,那么是多少s?
    3. 3. Q:如何开启定时器?
  • ADC
    1. 1. Q:STM32 ADC的总转换时间如何计算
  • STM32的Flash
    1. 1. Q:NOR Flash和NAND Flash区别?
  • 存储器对比
  • DMA
    1. 1. Q:DMA配置三要素
    2. 2. Q:DMA的传输模式有哪些?
  • 通信协议总览
  • UART
    1. 1. Q:开始位1Bit、数据位8Bit、停止位1Bit,波特率9600,则发送32个字节数据,需要多久?
    2. 2. Q:串口通信如何配置?
    3. 3. Q:描述下RS232和RS485的区别?
  • I2C
    1. 1. Q:I2C总线在传输过程中有哪些类型信号?
    2. 2. Q:I2C的软硬件模式怎么配置?
    3. 3. Q:I2C的仲裁机制?
    4. 4. Q:I2C的从机设备地址ID、写地址、读地址?
      1. 4.1. 特定地址写
      2. 4.2. 当前地址读
  • SPI
    1. 1. Q:四种工作模式
    2. 2. Q:如何确定使用哪个模式
    3. 3. Q:陀螺仪可以用SPI通信吗,有什么好处?
  • 看门狗
  • I2S
    1. 1. 基本信号线
    2. 2. 常见参数说明
    3. 3. 主从模式
    4. 4. 数据传输模式
    5. 5. 数据位宽与位深
  • CAN(以下的不建议看,去看另外一篇吧)
    1. 1. 内容
    2. 2. IOS11898标准
    3. 3. CAN帧的种类
    4. 4. 仲裁方案
    5. 5. CAN过滤器配置
    6. 6. CAN总线错误分类
    7. 7. CubeMX配置
  • 参考
  • 主要学习STM32C8T6的基本配置以及各部件操作。

    Q:哈希体系和冯洛伊曼体系区别?

    前者是指令集和数据存储在不同存储器,后者是将两者存储在同一个存储器

    计算机五大组成部分:控制器、运算器、存储器、输入设备、输出设备

    32位处理器,一个指针4字节64位处理器,一个指针8字节

    STM32F103C8T6基本配置

    STM32是小端存储,低地址的数据放在低字节上

    堆从低地址向上增长,栈从高地址向下增长

    内容

    STM32F103C8T6最小系统版组成:MCU、时钟电路、复位电路、外部接口电路、电源电路,启动电路。

    • 内核:Cortex-M332位处理器内核,最大寻址位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:设置系统时钟的基本流程?

    1. 开启外部高速时钟HSE
    2. 设置Flash的等待周期
    3. 设置APB1、APB2、AHB分频系数(RCC_CFGR寄存器)
    4. 设置PLL的时钟来源和倍频系数
    5. 使能PLL
    6. 将系统时钟切换到PLL

    STM32启动过程

    1. 通过Boot引脚决定启动方式(Flash、系统内存、SRAM)

    2. 加载中断向量表(从起始地址读取,比如0x0800 0000)

    3. 初始化栈指针(加载__initial_sp,这是向量表的第0项,0x0800 0000)

    4. 指向复位程序(执行Reset_Handler,这是向量表的第1项,0x0800 0004)

    5. 在Reset_Handler中

      • 复制数据段(data)到RAM
      • 清空BSS段
      • 调用SystemInit设置系统时钟
      • 调用 __main ----> main()
    6. 设置异常中断 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的定时。

    • 基础定时器:仅支持计数

    • 通用/高级定时器:支持向上计数、向下计数、中央对齐

    定时器计数频率:CK_CNT=HCLKPSC+1 定时器计数频率:CK\_CNT = \frac{HCLK}{PSC + 1}

    HCLK是定时器输入时钟(一般是APB时钟),PSC是预分频器数值,RCC是自动重装寄存器(PWM的最大占空比)。

    定时器溢出周期:T=(PSC+1)(ARR+1)fhclk 定时器溢出周期:T = \frac{(PSC+1)(ARR+1)}{f_{hclk}}

    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:如何开启定时器?

    1. 开启RCC时钟
    2. 配置时基单元的时钟源
    3. 配置预分频系数和自动重装载值
    4. 配置中断控制和NVIC中断优先级
    5. 使能定时器

    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:串口通信如何配置?

    1. 串口时钟使能,GPIO时钟使能
    2. 复位串口外设
    3. 配置GPIO
      • RX浮空输入,TX复用推挽
    4. 初始化串口参数(波特率,数据位,校验位,收发模式)
    5. 开启中断并初始化NVIC
    6. 使能串口外设
    7. 编写串口函数

    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
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // 作图,记得SCL先行,他决定了此时的信号状态,想一想Start和Stop

    /* SCL高电平,SDA从高到低,记得拉低SCL,防止被错误认为是另一个起始条件 */
    void I2C_Start(void)
    {
    SCL_H; // SCL高
    SDA_H; // SDA高
    Delay_us(2);
    SDA_L; // SDA低
    SCL_L; // SCL低
    }
    /* End信号,SCL高电平,SDA从低到高 */
    void I2C_Stop(void)
    {
    SCL_L;
    SDA_L;
    SCL_H;
    SDA_H;
    }

    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

    fLRCK=fs(每通道的采样率) f_{LRCK}=f_{s}(每通道的采样率)

    f_SCK,串行时钟,传输每一位数据的时钟频率

    fSCK=每帧比特数×采样率 f_{SCK}=每帧比特数 \times 采样率

    N,通道数,一帧里面包含的音频通道数;比如I2S->N=2;TDM_I2S->N=4,8…

    位宽(槽宽):在一帧中,每个通道占用的bit数

    每帧比特数=通道数N×位宽(单位bit)fSCK=N×fLRCK×位宽位宽=fSCKN×fLRCK 每帧比特数=通道数N \times 位宽(单位bit) \\ f_{SCK} = N \times f_{LRCK} \times 位宽 \\ 位宽 = \frac{f_{SCK}}{N \times f_{LRCK}}

    位深:表示音频数据量化后的精度位宽 >= 位深

    下面是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结束之间

    仲裁方案

    1. 在总线空闲时,最先开始发送的节点获得发送权,一旦开始发送,不会被其他节点抢占。

    2. 多个节点同时开始发送时,各发送节点从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的节点可继续发送。(从左到右,Dominant :显性优先)

    3. 具有相同ID的数据帧和远程帧在总线上竞争时,仲裁段的最后一位(RTR)为显性位的数据帧具有优先权可继续发送。

    4. 标准格式ID与具有相同ID的远程帧或者扩展格式的数据帧在总线上竞争时,标准格式的RTR 位为显性位的具有优先权可继续发送。

    CAN过滤器配置

    过滤模式:列表模式和掩码模式

    列表模式列出ID名称,判断ID是否一致来判断是否接受或者丢弃,受到列表容量大小限制

    掩码模式:确定ID特定位的值来判断是否接受或丢弃,不受列表容量大小限制

    配置过滤器,有三个重要的寄存器:CAN_FSIR、CAN_FxR1、CAN_FxR2

    CAN总线错误分类

    CubeMX配置

    1、配置波特率

    位数据段:同步段----传播段(补偿CAN网络的物理延迟)----相位缓冲段1----相位缓冲段2(补偿相位误差)

    可能会有早到的,也可能会有晚到的,通过上面的四段可以进行拉长缩小来操作。

    CAN波特率=TQ(TBS1+TBS2+SJY)=APB总线频率(TBS1+TBS2+SJY)分频系数 CAN波特率=TQ*(TBS1 + TBS2 + SJY) \\ \\ = \frac{APB总线频率 * (TBS1 + TBS2 + SJY)}{分频系数}

    2、打开CAN的接受中断,两个接收邮箱、三个发送邮箱。


    参考

    Stm32最小系统板的构成详解-CSDN博客

    嵌入式面试知识点总结 – STM32篇_stm32 112+16+64-CSDN博客

    嵌入式知识点(STM32、uart、spi、iic等总线)_i2c dma hardfault-CSDN博客

    flash基础知识_flash擦除最小单位-CSDN博客

    STM32: ADC采样频率及相应时间的确定_adc采样频率计算公式-CSDN博客

    基础通信协议之 IIC (I2C) 详细讲解_i2c通信的详细讲解-CSDN博客

    SPI原理超详细讲解—值得一看-CSDN博客

    (11 封私信) 【I2S】数字音频接口—I2S总线协议基本概念 - 知乎

    一文读懂CAN总线协议 (超详细配34张高清图)_can总线协议详解-CSDN博客