STM32入门教程-2022持续更新中

1.工程文件的创建
(1)启动文件


2.GPIO简介





3.GPIO输入
(1)c语言中变量类型在32中


typedef一般用以给变量定义


常规使用查看是VS2013的STM32文件夹

4.外部中断
(1)执行流程




9-15,15-20会同时触发一个中断函数,需要通过标志位判断具体触发哪个

1 重置默认状态
2 配置成参数状态
3 赋默认值给调用的结构体参数
4 软件触发外部中断
5-9标志位相关
5.定时器中断

向上计数:从0开始,向上自增到重装值,清零并申请中断;
向下计数:从重装值开始,向下自减到0,回到重装值并申请断;
中央对齐模式:从0开始到重装值,申请中断;再自减到0,申请中断;
①基本定时器(仅支持向上计数)

1.预分频器写1——2分频 出=入/2 = 36M
2——3分频 /3 =
实际分频系数 = 预分频器 + 1
2.更新事件&更新中断
更新事件不会触发中断
3.中断流程:
基准时钟》预分频器》计数器计数自增并自动重装寄存器比较,值相等时产生更新中断(NVIC)&更新事件》CPU响应
4.主从触发模式

实际使用时要用DAC输出一段波形,每隔一段时间触发一次DAC让其输出下一个电压点,使用定时器中断可能会导致主程序中断频繁,影响其他中断的运行
使用主模式可以将定时器的更新事件映射到触发输出(TRGO)的位置,TRGO直接接到DAC的触发转换引脚,定时器更新则不用再中断
②通用计时器(向上+向下+中央对齐)

采用内部时钟(72MHz)
如果要采用外部时钟,首选ETR引脚外部时钟模式2的输入
③高级定时器

④具体结构




外部晶振8MHz,经过PLL锁相环倍频9倍变为72MHz,并设置为系统时钟
⑤定时器中断库函数
6.TIM输出比较
①PWM原理

1.PWM输出频率较快从而实现“连续的变化”,故只能用于惯性系统;
2.占空比决定PWM等效出来的模拟电压的大小,占空比越大,等效的模拟电压就越趋近高电平;
E.G.高电平5V,低电平0V,50%占空比等效为2.5V,10%等效为0.5V
3.分辨率——占空比变化的细密程度,越高分辨率&分辨率,对硬件电路的要求越高;
②具体操作
通用计时器

CC1P写1,原相输出;CC1P写0,反相输出

PWM模式2为1的取反

蓝线CNT,黄线ARR,红线CCR,
CNT不断自增,到达设定的ARR值后清零,
采用PWM模式1为例,CNT<CCR时,高电平,CNT>=CRR,低电平
改变CCR的值即可调整占空比
具体计算

外设介绍

舵机一般自带驱动电路
输入一个PWM波形,输出轴固定在某一个角度
PWM为信号线,并不需要大功率

两路推挽电路控制电机

③代码编写
7.PWM输入比较

①频率测量

1.测频法在f较低时,误差会很大;测周法在f高时,误差大;两种方法都会在最后时刻出现正负1误差
2.测频法自带均值滤波,体现的是该段时间内的均值,数据更新慢,较平缓;测周法数据更新快,会受噪声影响比较大;
3.令两式中N相等中界频率用以区分两方法的使用条件,低于该频率用测周,高于用测频



②代码部分
8.编码器接口
①原理


②代码
GPIO输入模式选择:外部模块空闲默认输出高电平,选择上拉输入;外部模块低电平则反之;不确定外部模块的默认状态/外部信号输出功率小,一般选择浮空输入
9.ADC
①原理


逐次逼近:二分法确定电压,几位需要确定几次,对于二进制来说,二分法即每位的位权
1.规则通道最多可以读取16位数据,但是规则通道数据寄存器只能存1个数据,在读取后应当使用DMA快速转移数据,否则前面的数据可能会被覆盖;注入组通道寄存器可以同时存4个数据;
2.ADCCLK最大输出频率为14MHz,ADC预分频器只能选择6分频(12M)或8分频(9M);
3.

4.ADC1和ADC2可以配合使用为双ADC模式;
5.
还有一种在连续模式下的间断模式,在转换几位后需要再次触发才能继续转换
6.其他知识点


左对齐数据会比原数据大16倍;当右对齐数过高时,可以选左对齐后取高几位,舍弃后面的几位,但降低精度

AD转换需要时间,在这段时间需要保持住信号,故存在采样开关&采样保持电路(电容存储电压)
(本节代码未看)
10.通信协议
①

全双工:双方同时相互通信;半双工:不同时;单工:数据单向传递;
时钟:同步需要靠时钟信号通知采样时间,可以降低对硬件电路的依赖,可以暂停;异步通信:没有时钟线的需要双方约定一个采样频率,并且加帧头帧尾进行采样位置的对齐;节省时钟线
异步时序缺点:十分依赖硬件电路,必须要有USART硬件电路支持;
单端信号使用时需要共地;差分一般不需要;



二进制调试时码元=1比特;故波特率=比特率
校验方式:奇校验&偶校验、CRC校验;
TX引脚输出定时翻转的高低电平,RX读取
11.USART
①基本介绍


1.数据帧;2.起始位侦测;3.数据采样;4.波特率发生器;5.转串口模块分析;6.


取某十进制数A的x位:(A / 10^x) % 10;
输出中文两种方式: 1.keil5和串口助手都选择UTF-8,且加上特定指令
2.keil5选择GB2312,串口助手选择GBK
②数据包发送

使用添加标志位的分割载荷,避免负载和包头/包尾重复的问题:
1.限制载荷数据范围;
2.使用固定长度数据包,判断包头包尾用于对齐;
3.增加包头包尾数据量;

文本数据包解析较慢;
③数据包接收


12.I2C通信
①基础知识

设计背景:
1.全双工>半双工;
2.应答机制,每接收到一个数据给予反馈
3.单片机只和指定模块通信,其他模块不产生干扰;
4.异步时序不能同时暂停,容易出现问题;发送方暂停发送,接收方不能暂停;
同步的协议,要加入时钟线指导对方的读写,防止出现问题

1.一主多从
主机权力:对SCL线的完全控制;空闲状态下可以主动发起对SDA的控制,从机发送数据&从机应答时主机才会转交SDA控制权给从机;
从机:SCL时钟线在任何时候都只能进行被动的读取,不允许主动发起对SDA数据线的控制,主机发送读取从机的命令或从机应答时才能短暂地获取SDA控制权;
2.输入输出模式
对于SCL:主机绝对控制SCL,主机可配置成推挽输出,从机配置成浮空输入/上拉输入;主机发送,所有从机接收;
对于SDA:半双工协议,主机发送时要输出,接收时输入;
时序未配置好可能同时出现主机、从机同时输出,一个输出高电平,一个低电平会出现电源短路;
故I2C禁止所有设备输出强上拉的高电平,采用外置弱上拉电阻+开漏输出的电路结构;
推挽输出:直接接到正负极 >>> 强上拉&强下拉
开漏输出:去除上管,输出低电平时下管导通 >>> 强下拉
高电平无上管 >>> 浮空 >>> 所有设备只能输出低电平,不能输出高电平
SCL&SDA各外置一个上拉电阻,通过电阻拉至高电平
好处:1.完全杜绝电源短路;2.避免引脚模式频繁切换;3.存在线与现象,所有设备都输出1总线才为1;
3.时序基本单元
I2C时序基本单元的组成:1.起始&终止条件;2.发送&接收一个字节;3.发送应答&接收应答

类似于串口中的起始位&结束位


释放SDA == 切换成输入模式

4.完整时序
分为7位&10位从机设备地址 >>> 相当于名字,出厂会配置,一般最后几位可以改变,板子上的Ax引脚接不同电平情况即可确定从机设备地址
①指定地址写

发送的第一个字节为7位设备地址+读/写位(0写1读) 》》》 从机应答位 》》》 第二个字节按照设备定义发送 》》》 从机应答位 》》》 第三个字节…… 》》》 终止条件
②当前地址读

缺少指定寄存器的时序,需要调用当前地址指针
③指定地址读

主机不想读,最后一个字节后要给予非应答