STM32

STM32内部结构图
Stm32开发方式:1.基于寄存器 2.基于库函数 3.基础HAL库 (图形化)
(学习2后3必须要学)
型号区分:MD是中容量产品,flash容量 64-128K C8T6是64K

GPIO 通用输入输出口

可配置为8种输入输出模式
引脚电平 0-3.3V,部分引脚可以“容忍”5V (说明书带FT的引脚)
输出模式下可控制端口输出高低电平,用来:驱动LED、蜂鸣器、模拟通信协议输出时序
输入模式下可读取端口输出高低电平或电压,用于:
读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议输出时序

图中是 施密特触发器:对电压进行整形,if V>??,输出瞬间变为高电平,反之V<下限,瞬间变为低电平,注意区间内是不会发生变化,只有高于和低于才会

GPIO口的8种输入输出模式
RCC库函数主要是控制AHBAPBAPB2外设时钟
GPIO函数有DeInit复位函数,还有Init初始化函数,还有基本的读写函数
推挽输出高电平有驱动能力,开漏模式高电平没有驱动能力(相当于高阻态)
开漏模式低电平有驱动能力

库函数中可以用按位或选择多个引脚是因为每个pin代表一位,所以相当于0001 | 0010 | 0100等等,结果就是0111就等于同时选中了多个引脚

GPIO输入

按键抖动:由于按键内部使用的是机械式弹簧片来进行通断的,所以按下和松手瞬间会有一连串的抖动。
延时消抖
在这里插入图片描述
强/弱上下拉指的就是 “弹簧弹力”的大小,即可视为两个电阻(弹簧)在对抗,谁的阻值(弹力)更强
在这里插入图片描述
为常用开关接法,图一可上拉,图二由于有外部上拉电阻,所以可以浮空或者上拉,不过上拉的话由于有两个上拉电阻,高电平会更稳定,而引脚被强行拉低时,损耗也会增大

C语言知识:
Unsigned无符号的 _ttypedef
#define 用一个字符串代替一个数字;提取程序中经常出现的参数
typedef 将一个较长变量类型换个名字,ex. typedef unsigned char unit8_t;(注意加分号)

在这里插入图片描述
在这里插入图片描述
可以以星期为举例,没有星期八,所以是受限的整型变量,其次,MONDAY=1,TUESDAY=2,WEDNESDAY=3可以被省略成MONDAY=1另外两个写变量名就行

OLED

Organic LED 有机发光二极管:功耗低(无背光)、响应速度快(高刷)、宽视角、轻薄柔韧
供电:3-5.5V
通信协议:i2c/spi 4pin用i2c,7pin的用spi
分辨率:128*64
单片机调试方式:1.串口调试 2.显示屏调试 3.keil调试模式(可单步、设断点、查看寄存器和变量等)
不同pin脚的OLED

中断

中断:在主程序运行过程中,出现了特定的中断触发条件,使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又回来原来被暂停的位置继续执行。
中断优先级:中断的紧急程度
中断嵌套:相当于中断的中断,即当前中断比上一个中断的中断优先级高。
在这里插入图片描述在这里插入图片描述
中断向量表:中断程序的地址

在这里插入图片描述
类似于医生的叫号系统
在这里插入图片描述
在这里插入图片描述
红线四个是来蹭网的,节省功耗或者怎样需要借助外部中断来执行
事件响应:不传信号去cpu,而是可以让外设做事儿
在这里插入图片描述
AFIO的机制:所以GPIO里ABC不能触发相同的pin的中断

在这里插入图片描述
其实就是数据选择器

在这里插入图片描述
或门 前 相当于有中断触发条件了,那么请求挂起置1,1&X=X,所以上面的与门就是中断屏蔽判断的开关,下面的与门则是判断有没有事件屏蔽,如果有,则会输出脉冲信号(电平信号)给外部

旋转编码器
中间图,为图2剖解,可以输出位置速度和旋转方向,是通过 正交波形实现的(左右A、B触点形成相位差),当然还有一种使用分开输出的也可以实现判断旋转方向
RCC管的都是内核(CPU)外的外设

TIM 定时器

(timer)

定时器:可以对输入的时钟进行计数,并在计数值达到设定值时触发中断
时基单元:由 16位计数器、预分频器、自动重装寄存器 组成,在72MHz计数时钟下可以实现最大59.65s的定时(72MHz/65536/65536取倒数,也就是预分频器和自动重装寄存器都取最大16位的时候,定时器的时间可以达到 且stm32可以级联,理论上两个stm32就可以让定时器的时间达到八千多年
1.定时中断 2. 内外时钟源选择 3.输入捕获 4.输出比较 5.编码器接口 6.主从触发

高级定时器>通用定时器>基本定时器

定时器
在这里插入图片描述

实际分频系数=预分频器的值+1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
跨文件的变量直接使用extern声明变量,就可以跨文件使用
或者把要用的放在一个文件
外部信号影响很小,内部电阻会影响信号,这个时候就可以用浮空输入,但浮空输入容易让电平跳个没完。

可以加滤波器消抖,就不会一次跳几下那么不稳定,对于这个对射式的

OC 输出比较

TIMOC(output compare)
通过比较CNT(时基单元里的那个)和CCR(capture/compare register)寄存器值的关系,来对输出电平进行置0、1 or 翻转的操作,用于输出一定频率和占空比PWM波形
每个高级通用定时器有4路OC通道
高级定时器前三个另有死区生成(防止短路,让改变电流流向的时候延时一会儿再改变(等待另一边的操作))和互补输出(也就是H桥、三相无刷的功能)

在这里插入图片描述
上图为死区生成和互补输出,右边红色图为外部推挽电路:

在这里插入图片描述
输出比较模式

PWM

PWM(pulse width modulation)脉冲宽度调制
在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效模拟信号,常用于电机控速

PWM参数:频率f=1/TS=CK_PSC/(PSC+1)/(ARR+1) 占空比=TON=TS=CCR/(ARR+1) 分辨率=占空比变化步距=1/(ARR+1)

在这里插入图片描述
在这里插入图片描述
舵机是一种根据输入PWM信号占空比来控制输出角度的装置
输入PWM信号要求:周期20ms,高电平宽度:0.5~2.5ms

在这里插入图片描述
直流电机属于大功率器件,GPIO口无法直接驱动,需要配合电机驱动电路来操作
TB6612 是一款双路H桥型的直流电机驱动芯片,可以驱动个直流电机并且控制其转速和方向

在这里插入图片描述
TB6612

IC 输入捕获

输入捕获模式下,当通道输入引脚出现指定电平跳变时,CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数

每个高级、通用定时器对应有4
可配置PWMI(input)模式,同时测量频率和占空比
可配合主从触发模式,实现硬件全自动测量(不需要软件手动清零

测频率

在这里插入图片描述
fc 标准频率就是单片机内部的
中界频率:两种办法,误差相等时,的频率点
即让fx相等解方程,此时N即是频点

在这里插入图片描述
在这里插入图片描述
其中,rising falling分别设置,这里没有单独画出来,TI1FP1TI1FP2TI2FP1TI2FP2存在交叉信号传递,即让不同口接受同一种信号,或者??

主从触发模式

在这里插入图片描述
主模式:主动触发
从模式:被控制
触发源选择:为从模式服务

在这里插入图片描述
注意上面那个图片,这里是没有TI3、TI4的

PWMI模式 测频率占空比

在这里插入图片描述
这里其实fp2占用的是ti2 ch2的通道

PWMI的配置通道可以一次性配两个
OC Compare:CCR只写 SetCompare
IC Capture:CCR只读 GetCapture

滤波器虽然也计次,但是它的采样频率远高于信号频率,所以只会滤除高频噪声,让信号更平滑

关于测频法和测周法的总结,和误差:

TIM 编码器接口

Encoder Interface 编码器接口
编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置旋转方向旋转速度
每个高级定时器和通用定时器都拥有1个编码器接口
两个输入引脚借用了输入捕获的通道1和通道2
在这里插入图片描述

抗噪声电路:一个值不变,一个值正常跳变,就保持电平不变;也就是说,一条腿不动,但是另一条腿走了好几步,就是有问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Note:GPIO模式:与默认外部电平保持一致来设置上下拉输入
不确定外部电平默认状态 or 外部信号输入功率非常小,就浮空模式

ADC 模拟数字转换器

ADC: 可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁

PWM调节led亮度、电机速度就是dac的功能
DAC应用:信号发生器、音频解码芯片等 (波形生成领域

12位逐次逼近型adc,1us转换时间(对应1MHz
输入电压范围:0-3.3V,转换结果范围:0~4095(也就是211+···+20,因为是12位的)
18个输入通道,可测量16个外部(GPIO口)和2个内部信号源(温传(如CPU温度)和内部参考电压(基准电压1.2V))

规则组和注入组两个转换单元 stm32的高级adc,不是转换一次读一次值,而是一组一组的
模拟看门狗自动监测输入电压范围 (相当于硬件电路,可以不占用软件资源,帮助判断(if)一些门限)

Stm32f103c8t6 adc资源:adc1、adc2、10个输入通道

在这里插入图片描述
8位逐次逼近型adc

在这里插入图片描述

规则组可以一次性选择16个通道 最好配合DMA使用(因为他一次只能存一个结果)
相当于你可以点一个菜单,上面有十六个菜,你点完了你桌子只能放一个菜,所以不存储的话你就只有一个菜吃
注入组最多可以选择4条通道

在这里插入图片描述
定时器中断以触发,当然TRGO也是很重要的一个方式,主模式输出更新事件则可触发AD转换

在这里插入图片描述
看门狗卡门限,超出则申请中断,通向NVIC

在这里插入图片描述
规则组和注入组转换完成后会置一个标志位EOC

在这里插入图片描述
这里支持双ADC模式,相当于左右手交叉打拳,提高采样率,而且也可以分开使用

转换模式:单次/连续 + 扫描/非扫描,C21∗C21,共四种模式
扫描模式相当于可以点菜,而不是只能点单一菜品
单次转换相当于每次都要触发,连续转换则相反
扫描模式下还有间断模式:在扫描过程中,每隔几个转换,就暂停一次

在这里插入图片描述
在这里插入图片描述
一般右对齐,左对齐的好处是可以只使用一半,舍弃掉低四位的精度
有采样电路,需要采样时间,所以有保持

在这里插入图片描述
因为是12位的,所以要12个adc周期,0.5是做别的事
采样时间短速度快,采样时间长避免毛刺干扰
校准:
ADC内部有一个自校准模式。校准可大幅减小因内部电容器组的变化而造成的精度误差。校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差

  1. 建议在每次上电后执行一次校准
  2. 启动校准前,ADC必须处于关电状态超过两个ADC时钟周期

在这里插入图片描述
在这里插入图片描述
相当于下面那个可变电阻

可以与固定电阻相反放置,可改变极性
通过外部来控制开关灯等等,可以使用施密特触发器,相当于两个朝外的开区间,而不是一个单独的上下限圈起来的区间

DMA

direct memory access 直接存储器读取

DMA可以提供外设(外设寄存器 一般有data register)和存储器(运行内存sram和程序存储器flash)存储器与存储器之间的高速数据传输,无须CPU干预,节省了CPU资源
12个独立可配置的通道:DMA1 7个 DMA2 5个
每个通道都支持软件触发和特定的硬件触发
存储器到存储器,一般使用软件触发;外设和存储器的,一般使用硬件触发
Stm32f103c8t6 dma1 7个

在这里插入图片描述

计算机五大组成部分:运算器、控制器、存储器、输入设备和输出设备
CPU: 运算器+控制器
系统存储器和选项字节其实也是flash,只不过一般说flash就是主闪存flash
选项字节里是:flash的读保护、写保护、看门狗配置等等
外设寄存器的介质就是sram,这样叫跟上面flash一样,也是习惯
内核外设就是NVIC和SysTick 内核外设和外设不是一个厂家,所以分开了

在这里插入图片描述
非常重要,寄存器相当于链接软件和硬件的桥梁,比如cpu读写寄存器,就可以实现:置高低电平、开关、数据选择、或者多位结合起来当做计数器、数据寄存器等等,如上图红色

在这里插入图片描述
主动单元是总线矩阵左边的,被动单元(模块)是总线矩阵右边的,其中DCode是专门访问Flash的,DMA由于要转运数据,他也有访问的主动权,同时他也是AHB上的被动单元

这总线矩阵里还有总线仲裁器,DMA访问同一个目标时暂停CPU访问,总线仲裁器仍然会保证CPU得到一半的带宽

注意DMA目的地址不可写flash地址,因为他是rom寄存器,只读,这样设置会出错
当然,想写入flash的话,可以配置flash接口控制器
Sram运存,可任意读写

在这里插入图片描述
32位系统中,一个字等于四个字节
传输计数器自减 是否自动重装,决定了是单次模式还是连续模式

M2M:memory to memory
软件触发和自动重装的循环模式不能同时使用,而这里的软件触发与之前不同,这个就是尽快触发把计数器清零完成这一轮循环,而不是计数器只自减一下
不能在dma开启时写传输计数器

DMA进行转运条件

  1. DMA_Cmd()必须使能
  2. 传输计数器的值大于0
  3. 必须有触发信号(触发源)

硬件触发注意通道,每个都有特定的通道,触发信号不是随便一个通道都能走
软件触发没有要求
不同外设的通道
EN相当于控制这个通道打不打开,而不是数据选择,当然其实从一整张图来看,也是一种数据选择器,只不过每个通道都只是一小部分
这里是或门,理论上三个都开启都可以进行触发

在这里插入图片描述低位到高位补零,高位到低位舍高位

在这里插入图片描述
复制转运,转运完成后DataA并不会消失

在这里插入图片描述
阿婆主说:Adc单个通道转换完之后,会有DMA请求
注意手册,有空看看其实很有作用

C语言知识:const是常量,被const定义的变量只能读不能写
在stm32中,const定义的变量是存储在flash里面
用途:一大批数据时,定义常量可以节省SRAM空间,比如查找表、字库数据等等
Stm32中,使用结构体访问寄存器,让他的成员的顺序和数据类型与寄存器一致,就可以完美映射
ADC->DR就是一种结构体+地址偏移,因为ADC的结构体里访问了DR这个成员

ps. keil5中,按alt选中,可以批量修改

USART

USART(Universal Synchronous / Asynchronous Receiver / Transmitter)
通用同步/异步收发器
同步状态下只支持同步输出,不支持同步输入,一般是用来兼容别的协议的

通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统
通信协议:制定通信的规则,通信双方按照协议规则进行数据收发
通信的目的是进行信息传递,双方约定的规则就是通信协议。

Eg. Stm32内部有很多功能:Adc、pwm …,但如果你要使用蓝牙功能、陀螺仪测姿态(角速度、加速度等),就需要通信来获取外设的数据

实际上在串口中只能发送二进制数

在这里插入图片描述

串口外设

在这里插入图片描述
在这里插入图片描述
左图上面芯片是CH340 可以将串口协议转换为USB协议
中图是陀螺仪,左边是串口的引脚,右边是I2C的引脚
右图是蓝牙模块,下面是串口引脚,上面是可和手机互联的芯片,可以实现手机遥控单片机

串口协议

在这里插入图片描述

在这里插入图片描述

RS232一般在大型的机器上使用,由于环境可能比较恶劣,静电干扰比较大
RS485通信距离可以达上千米

在这里插入图片描述
串口的空闲状态是电平
奇偶校验,例如:奇校验,根据数据位1的个数,决定校验位要不要补1,使数据位8位和校验位1位,总共9位中的1的个数是奇数
当然检出率不是很高,如果其中两位同时出现翻转,是检不出的
停止位可以选择1位、1.5位、2位等

在这里插入图片描述
不同的波特率和加不加校验位、停止位宽度的波形图

在这里插入图片描述

  1. 同步模式:多时钟信号线 CLK
  2. 硬件流控制:比如A设备向B设备发送数据,发送太快B接收不过来,就会有一根线,从B到A,发送高低电平代表B设备准备好没有,这样A设备只会在B设备准备好的情况下进行传输 (CTS、RTS信号线等等
  3. 除了USART1是在APB2总线上的设备,其他都是挂载在APB1总线上

IrDA :用于红外通信,一个红外发光管,一边是红外接收管,靠闪烁红外光通信
不是遥控器的那种红外通信,并不能模拟遥控器
LIN:局域网的通信协议

USART框图

  1. 发送移位寄存器:向右移位,和通信协议规定的低位先行是一致的
  2. TDR 发送数据寄存器 和移位寄存器有双重缓存,可以保证连续发送数据的时候,数据帧之间不会有空闲
  3. TXE,TX EMPTY;RXNE, RX NOT EMPTY ,接收寄存器非空;这两个是中断标志位
  4. nRTS:Request to send,nCTS:Clear to send n的意思是低电平有效
  5. SCLK:类SPI,并且支持自适应波特率
  6. 唤醒单元:支持多设备,可分配地址 类似“从设备”

例如,nRTS:也就是说置高电平,发送到对方cts的时候,对方接收到就会暂停发送
TX和CTS是一对的,RX和RTX是一对的

USART基本结构
软件层面,只有DR(Data Register)一个寄存器可以供我们使用

在这里插入图片描述
四种选择:就是不管几位字长,都可以选择要不要设置奇偶校验位,所以可以有四种选择
空闲帧和断开帧是局域网使用

在这里插入图片描述

输入要考虑的:

  1. 输入的采样频率和波特率一致
  2. 每次输入采样的位置,要正好处于每一位的中间,过早或过后会遇到电平正在翻转,或电平不稳定的情况
  3. 噪声有一定的判断能力,如果是噪声,最好置个标志位提醒我一下

判断过程:

  1. 检测到下降沿 从1->0
  2. 在3、5、7次采样频率位置检测,3位里面至少要两个0,if no{则重新开始检测下降沿}//说明下降沿可能也是噪声干扰导致;3位里面有2个0,另一个是1,在状态寄存器里会置NE(Noise Error),代表数据收到了,但有噪声
  3. 8910,保证在位的正中间,后面数据位也是在这个地方检测
    在这里插入图片描述
    数据采样的时候,8910就在正中间了,但起始位检测起始也在正中间,只不过逻辑来看,前面算空闲状态后面算起始位,但实际上8910次采样就是在整个采样过程的正中间

数据采样:在8910中间进行采样,按照“三局两胜”“少数服从多数”的规则判定是数据是0还是1,如果三个采样不全为同一个电平,那么NE也会标志

在这里插入图片描述
CH340CH340的模块内部电路图

串口发送与接收

串口输出的三种方法:

  1. 重定向printf,因为单片机没有屏幕,所以要重定向到屏幕上输出,但只有一个串口可以用
  2. sprintf 可以指定打印位置,于是打印在本来就在串口输出的字符串中
  3. 封装 可变参数的写法 放置参数表和vs进行封装

多个printf使用需求是2和3
以上就是printf的移植方法

UTF-8编码:在C/C++的杂项里面输入参数 --no-multibyte-chars 就不会报错中文
由于软件兼容性有区别,所以有1.UTF-8 2.GB2312 两种编码方式
GB2312编码:设置完会变成宋体,然后不用设置参数,然后接收GBK不会变成乱码,按道理UTF-8是不兼容的
但我这里结果相反,不知道为啥?

接收RX分为:

  1. 查询
  2. 中断

如果选择中断 代码里还要配置NVIC
程序简单可以使用查询方法

串口收发数据包

在这里插入图片描述

把属于同一批的数据进行打包和分割
例如陀螺仪的数据,有xyz轴的,但是一批一批的发送容易乱,用数据包打包可以分割发送

为避免包头包尾出现错误,即数据载荷出现与包头包尾一样的数据,导致误判

  1. 规定数据范围,进行限幅:如可以设置0~100,这样就不会出现fe和ff
  2. 使用固定包长的数据包
  3. 增加包头包尾的数量,如ff、fe作为包头,fc、fd作为包尾

至于数据转换为字节流的问题,发送16、32位整形数据、float、double,甚至是结构体
用一个uint8_t指向它,当做一个字节数组发送就行了
适合一些使用串口通信的比如陀螺仪、温湿度传感器等

在这里插入图片描述
适合人机交互的场合:蓝牙模块常用的AT指令、CNC和3D打印机常用的G代码

在这里插入图片描述
在这里插入图片描述
设计状态机

C语言知识:与全局变量不同,静态变量只能在本函数使用(当前函数)
记住写代码的时候中括号只能剩一句,一句以上就不奏效了

这里接收数据包还存在粘包问题,可以使用互斥锁或者加判断

在写hex代码的时候,发送数据包出现问题,即数组的1号位一直数据都是0x02不管怎么变,但是我将数组长度均赋值成4的时候,就正常显示了(数据长度赋值)

FlyMcu 串口下载和 STLINK Utility

FlyMcu 串口下载程序
这个芯片串口下载适配USART1
Bootloader

在这里插入图片描述
此时boot0=1
按reset,此时usart1会不断接收数据,刷新到主闪存

切换boot引脚后要按reset,stm32只有在刚复位时才会读取boot引脚,程序运行之后,切换boot引脚是无效的

两个问题:

  1. Boot引脚是干啥的,为啥这样配置,bootloader是干啥的,串口下载的原理 在这里插入图片描述利用程序进行自我更新
    Ex. 为了给大机器人换电池,有一个小机器人帮助大机器人换电池
    这个小机器人就是bootloader
    Bootloader程序也叫自举程序
    类似于刷机在这里插入图片描述启动配置
    (A)从主闪存启动,就是启动大机器人
    (B)从系统存储器启动,就是启动小机器人

  2. 拔插两次跳线帽太繁琐,有没有解决方法在这里插入图片描述RTS DTR是输出引脚,不使用流控可以把他们当成普通的gpio口,来控制boot0和RST
    但外部还需控制电路,可以用两个三极管开关来控制
    可以搜索STM32一键下载电路在这里插入图片描述
    现在没有一键下载电路,还有一个缓招就是在这里插入图片描述不过下面这个写flash要取消勾
    要不然下载会出现执行失败在这里插入图片描述这样是一次性的,人工写了代码跳转到主程序开始运行,复位一下又会不闪烁在这里插入图片描述在这里插入图片描述选项字节的好处
    1.不随程序改变而改变
    2.可以方便被上位机修改

I2C

I2C 总线(Inter IC BUS)是由飞利浦公司开发的一种通用数据总线
两根通信线:SCL(Serial Clock)和SDA(Serial Data)

特点:

  1. 同步、半双工
  2. 带数据应答
  3. 支持总线挂在多设备(一主多从、多主多从) 多主多从自主了解
  4. 使用同步时序,就可以极大地降低单片机对硬件电路的依赖,且对时间要求不严格
    异步时序即相反

使用I2C的外设第三个图:AT24C02,存储器模块 第四个图:DS3231,实时时钟模块

硬件电路
第一条是接线要求,
从机只能被动读取SCL 对于SDA,只有在主机允许的情况下主动传输

这里的设计是为了避免短路的情况
推挽上拉和下拉(因为直接通过开关管接到):


上图就是推挽电路,用mos作开关管

在这里插入图片描述
PMOS低电平导通,NMOS高电平导通

对于前一个推挽电路图,开漏输出就是去掉这根强上拉的开关管 :
1.输出低电平,是 mos管导通,杆子接地,强下拉;
2.输出高电平,是 mos管不导通,杆子浮空 (这里是NMOS管,输出指的只是导通时候的状态,原则还是NMOS的输入栅极VGS>0,即输入高电平导通)

这样所有的设备只能输出低电平而不能输出高电平
为避免引脚浮空,接了上拉电阻,是一个弱上拉(电阻上拉)
此时就可以完全避免电源短路的情况,保护电路安全

SCL虽然在一主多从模式下可以用推挽
但是仍然采用了开漏+上拉输出的模式,在多主机模式下会用到这个特征

另外这里会有“线与
利用这个特征可以实现多主机模式下的时钟同步和总线仲裁

I2C 时序

在这里插入图片描述
在总线空闲状态时,从机必须始终双手放开,不允许主动碰主线,如果允许的话就是多主机模型

在这里插入图片描述
从机一般在SCL上升沿读取数据,主机在SCL低电平期间放上数据,并且高位先行

在这里插入图片描述
主机不用的时候,要先释放SDA(代码中表现为主机主动写1,但实则执行的操作是释放SDA的控制权)
实线表示主机控制的电平,虚线表示从机控制的电平
低电平变换数据,高电平读取数据

在这里插入图片描述
在这里插入图片描述
在最开始主机会发送一个字节给所有从机,来确定地址,8位(7位从机地址+1位读写位)
即使相同芯片接在引脚上,也可以保证每个设备的地址不一样,七位地址一般高位由厂商确定,低位可以接AD0等等,根据高低电平来确定他们的地址(分为7/10位地址两种一般使用7位) RA是应答位

在看逻辑分析仪或者示波器查协议波形的时候别忘了I2C的线与过程
(特别是交换SDA控制权的时候)

在这里插入图片描述
注意当前地址指针
假如现在的读操作是上面时序图写操作的下一个操作
此时指向的地址就是0x1A,因为上一个写地址是0x19,指针会自增,如果读一次后还要读一次,此时指向的地址就是0x1B

在这里插入图片描述
指定地址读,也就是前面设置指定地址写,然后不写,马上设置读操作
图中的Sr:Start Repeat

在这里插入图片描述
也可以这样,再加停止,但也可以不加停止直接复合格式
并且在不想读之后,SA给1,代表非应答(NACK),即主机不再读取,此时才能重获SDA的控制权
想发送或读取多个字节的话,就重复最后读写的那一部分就可以了,包括数据和应答位,当然此时对于读操作来说,需要给应答,这样才能持续读取

MPU6050

MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景
3轴加速度计(Accelerometer)三轴的加速度
3轴陀螺仪传感器(Gyroscope)三轴的角速度

在这里插入图片描述
9轴就是多三轴磁感强度
10轴就是多一个气压强度
欧拉角:pitch、roll、yaw
加速度计本质上就是测力计
其具有静态稳定性,不具有动态稳定性

陀螺仪其具有动态稳定性,不具有静态稳定性

在这里插入图片描述
有模拟信号,自然就需要adc

2^16,也就是-32768~32767
满量程范围 相当于 Vref
g代表重力加速度 1g=9.8m/s^2
注意按照你的大概测量值来选择,这样测量的会更细腻,如你要测1g的,2g的分辨率就会比16g的分辨率高

I2C的从机地址
1注意如果7位变换为16位地址,即是0x68,而要读写I2C的就是(0x68<<1) |(读0写1)
就是0x68左移一位,再补充读写位,注意7变16是中间分开高位补0
2然后0x68左移一位后是0xD0,然后或上读写位就是0xD0和0xD1

在这里插入图片描述
左上角是LDO 可以具体看需不需要稳压,看自己有没有稳定的3.3V电源,因为MPU6050就是需要3.3V供电的

还有别的项目扩展,例如在海里开船,是需要指南针的,所以六轴不够用,还需要磁力计的导航,又例如飞机,还需要一个气压计反应高度信息,所以多出来XCL,XDA(就是用来接磁力计or气压计的)

MPU6050自身有DMP 数据融合和姿态解算,如果不需要这个功能的话,可以直接挂载在SCL和SDA上,因为I2C本来就是可以挂载多个设备的

AD0可以自己配置,图中只是给了固定的I2C从机地址最低位为0,要配置也可以上挂Vcc,强上拉配置位1

MPU6050 框图

在这里插入图片描述

每个轴的姿态角和加速度前是有自测可以使用的,可以使/失能,计算差值,若此自测响应在芯片手册给的范围内则通过
Charge pump是电荷泵,进行升压用 (boost)

DMP是姿态结算的硬件算法
FSYNC 帧同步

Serial Interface Bypass Mux 接口旁路选择器,

  1. 选择上面STM32是MPU6050和其挂载的外设的大哥
  2. 选择下面,层级:挂载外设<MPU6050<STM32

Product statement

Datasheet里的电气特性和绝对最大参数,超过前者可能无法正常工作,超过后者芯片可能损坏

在这里插入图片描述
无特别要求,一般使用内部晶振或内部陀螺仪的晶振

在这里插入图片描述
中断

在这里插入图片描述
运动检测等等
相当于检测是否有发生该动作(通过计数器达到一定值),达到即可以触发中断引脚电平跳变
其中运动检测具有高通滤波器

Register Map And Descriptions

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(标黄是常用寄存器)

使用陀螺仪的滤波器时,陀螺仪的时钟频率是不一样的!

在这里插入图片描述
二进制补码方式存储,读出高八位和低八位,高位左移八次 | (或)低位数据,最后存在int16_t里,就可以得到

在这里插入图片描述
在这里插入图片描述
陀螺仪的晶振更加精确

在这里插入图片描述
操作前要解除睡眠,否则操作其他寄存器无效

实操时发现的问题:
在这里插入图片描述
为啥ID号一直显示D1???
最后那个版本又是70.。。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐