stm32
一.新建工程
1.新建工程

2.添加文件
按照视频要求添加 启动文件,库函数,及存放 main 函数的文件
3.添加路径


二.GPIO输入(具体电路看手册):
基本结构:

每个 GPIO都有 16 位引脚,且寄存器负责存储,驱动器负责 使能, 输入 1 为高电平 , 0 为低电平
位结构:

保护二极管作用:
当输入电压大于 3.3 V 电流从 VDD流出
当输入电压小于 0V 电流从 Vss 到 I/O 引脚流出
防止电路受损
位设置与位清除的作用:
单独控制某一端口而使其他端口不变,需要用哪个端口则在 位设置 输入1 ,清除某个端口则在清除寄存器写 1
输出控制:
推挽:高低电平都有驱动能力
开漏:只有低电平有驱动能力
关闭:高低电平都无驱动能力,此时由外部电路决定
当输出数据寄存器为 1 上开 下关 高电平
当输出数据寄存器为 0 上关下开 低电平
硬件电路:

1.左端 低电平 亮
2 左端 高电平 亮
3 左端 低电平 通电路
4 左端 高电平 通电路
面包板:

中间负责插 LED灯 ,芯片,两端控制电源

上一个为高电平,下一个为低电平,最后一个为端口写入
GPIO输入:
按键:

传感器:

1 为分压
2 为电容,稳定电路,可去掉
另外,AO为 输出电压, VCC 为上拉, GND 为下拉,且电阻越小,拉力越大
硬件电路:

上面两个电路为 按下按键为 高电平 松手为低电平
下面两个电路为 按下按键为 低电平 松手为高电平
左边两幅图 只能分别接为上拉 和 下拉模式
右边两张图 可以为悬空 或 上下拉模式
C语言关键字:

快捷键:crtrl art 空格: 显示提醒内容
函数:

1. 读取输入寄存器某一位
2.读取输入寄存器的所有
3.读取输出寄存器的某一位
4.读取输出寄存器的所有
OLED 调试工具:
调试方式:

硬件电路:

OLED 驱动函数:

显示十进制数时,如果 要显示位数比实际位数大 则显示数前补0,如果要显示数比实际数小,则去掉高位,如 12345 会去掉 1
EXTI外部中断:
中断系统:

NVIC基本结构:

NVIC:用于统一分配中断优先级和管理中断,确定优先级
最后由 CPU 进行中断
NVIC优先级分组:

数越小 ,优先级越高,如 0 为最高优先级
抢占优先级:决定嵌套中断的先后顺序,可以在确定了中断后再次插队更优先的
响应优先级:后来居上
EXIT 简介:

上升沿:由低到高发生中断
下降沿:由高到低发生中断
双边沿:由低到高和由高到低都可发生中断
软件触发:代码触发
事件响应:中断发生后不会传到CPU,会传到其他外设
中断响应:中断发生后传到CPU

EXIT 结构:

AFIO :只能选择1个中断引脚
EXIT 框架图:

1.

2.

3.

4.

可以由多个输入,但只能由一个输出
1.与门: 只有一个 1 就是1
2.或门:只要有 1 个 0 ,那就是 0
3.非门: 输入1 输出 0, 输入 0 输出 1
4.选择控制器: 从 一堆数据中 选择 1 个
旋转编码器硬件电路:



上为正转,A先下降,下图为逆转
两侧触点波形相差 90度,编码盘(1图形右侧)正向旋转 B 端滞后 90度 ,逆向旋转相反
不按下默认被上拉为 高电平,按下则被下拉为低电平
AFIO函数:
(在 GPIO 中)
![]()
// 锁定引脚信息
![]()
// 清除 AFIO 配置
![]()
// 选择中断引脚
EXIT函数:

1.为初始化
2. 为软件中断
3.为查看主程序标志位是否 置1
4.为主程序清除标志位
5.为查看中断中标志位是否置1,及清除
NVIC 函数:
(misc.h 中)

第一个 为中断分组
第二个为 初始化
后两个不常用
中断函数:(在启动文件中)
TIM定时中断:
定时器类型:

内部时钟 频率都为 72MHZ
定时框图:
基本:

1.会储存计数次数,当总次数到达预定的次数就会发生中断
2.为更新中断,其后接 NVIC
3.为事件,为更新事件,其不会产生中断,但会引起其他电子元件工作
4.DAC 为硬件自动化,其不受 程序控制,由 U 传到 TRGO
实际分频系数 = 预分频器的值 + 1
即 当 预分频器为 1 时 ,实际分频之后的频率等于 总频率 / 3
通用:

支持向上计数,向下计数和中央对齐
中央对齐:向上和向下都会产生中断
定时中断基本结构:

预分频器时序:
(具体符号含义去看定时框图)

改变预分频系数 得等到下一周期频率才会改变
计数器时序:
通过 ARPE 来判断是否预装入,即是否有缓存区




内部RC 振荡器 为 8MHZ,外部晶振为8MHZ ,但经上面会 ×9 变为72HZ
函数:
// 配置时基单元
![]()
// 定时器使能
![]()
// 中断输出控制
![]()
// 配置时钟

// 配置极性,分频器,滤波器
![]()
// 运行控制
![]()
// 改预分频器的值
![]()
// 更改计数器模式
![]()
// 自动计时器有无预装
![]()
TIM输出比较:

CNT 会和 CCR 比较,当 CNT 大于/ 小于 CCR 时 置1 ,等于 CRR 时 置 0
且基本计时器无输出比较,只有高级和通用计时器有输出比较
PWM简介:

占空比为高电平时间占总周期的比例,其乘高低电压之差为等效电压
不需要中断,仅比价端口两端电压
输出比较通道及输出比较模式:


PWM基本结构:

还要有 PWM 的输出口,具体看引脚接线图
红线为 CCR ,当计数器在CCR 以下为高电平,以上为低电平,到ARR清零

舵机:

硬件电路:

直流电机硬件电路:
当电极正接,电机正转,当电机反接,电机反转

1. 给 低功率时 VM 就会汲取电流到 两个电机上,驱动
STBY :当 接 CND 时,为待机模式,当接逻辑电平时为非待机模式
电机电源为电机的额定电压,逻辑电平为 stm32板的电压,为3V ,51单片机为5 V
函数:
// 初始化输出比较单元

// 给结构体赋初始值,方便后面修改,防止由于结构体初始化不完全导致高级定时器不可用
![]()
// 引脚重映射,可以将引脚冲突的定时器的引脚改变,同时可以用来解除调试端口

// 改变CCR 的值

// 用来更改 psc 的值

TIM输入捕获:
输入捕获简介:

频率测量:

测周法: 第二次测计数N 时,需要把 CNT 清零,此时才是两个上升沿的时间间隔
输入捕获通道:

CC1S : 对数据选择器进行选择
ICPS: 配置其上方的分频器
CC1E: 控制使能或失能
从模式:完成CNT 的清零
主从触发模式:

主模式:接收定时器内部的信号,启动其他外设
从模式:接收自己或其他外设的信号,启动自身定时器的运行
输入捕获基本结构:

TIFP1 设置为上升沿触发,启动CCR1捕获和CNT清零
PWMI 基本结构:


滤波器:降低噪声
边沿检测:来一个边沿就开启一次
TIFP1 设置为上升沿触发,启动CCR1捕获和CNT清零,CCR2 为高电平计数值
函数:
// 写入PSC

// 给输入捕获计时器一个初始值
![]()
// 从模式触发源选择
![]()
// 主模式输出触发源

// 选择从模式

// 读出CCR

// 设置另一个通道,其结果与另一个通道相反,如一个通道为直连,上升沿触发,则另一个通道为交叉,下降沿触发

TIM编码器接口:
简介:


编码器接口基本结构:

旋转编码器相当于外部时钟,故不需要设置时钟和计数方式
工作模式:

函数:
// 配置编码器接口

ADC 模拟转换器:
简介:

逐次逼近型ADC:


ADCCLK 分频后最大频率为14MHZ
通道选择开关会传入数据,DAC也会传入数据,两者进行比较,直到 DAC = 通道选择开关会传入数据。
规则组:可以选中16个通道
注入组:可以选择4个通道
START:开启数据转换转换
CLOCK:ADC逐次比较
DMA: 防止数据被覆盖
转换电路:

数据对齐:

左对齐:数据会扩大16倍
转换时间:

采样时间:在信号传入过程中打开,记录传入波形,防止因波形持续传入导致不知道传入波形为什么
硬件电路:

ADC基本结构:

1.GPIO 后为 设置 ADCCLK ,选择 规则组或注入组 的通道和模式
2.用结构体初始化ADC
3.校准
转换模式:

单次转换: 需要每次都有手动开启触发,设置EOC
非模式转换: 只有序列1有效
连续转换: 一次转换完后不会截止,会连续进行,所以不用手动设置
扫描模式: 可以设置那几个序列有效
函数:
// 给序列填写通道
![]()
// 设置ADCCLK, 其在 rcc.h里
// 校准函数

// 软件触发
![]()
DMA:
存储器:

ROM : 只读存储器
DMA基本结构:

仲裁器:确保总线的优先级
Flash :为只读
地址是否自增: 起始首地址是否改变
数据宽度:一次转运数据的大小
传输计数器:传输次数,自减
自动重装器:决定当计数器减到0,是否恢复原计数次,再重新传输
硬件触发需要看通道,软件触发不需要,选任意一个通道都可以
自动重装和软件触发不能同时使用
给传输寄存器赋值,需要使 cmd 失能
DMA 请求:

数据传输宽度:
小转大:高位补零
大转小:高位舍弃

串口协议:
通信接口

串口参数及时序:

无校验为8位,有校验为9位
USART 外设:
USART结构:

发送数据寄存器转移时 置 TXE 标志位, 实际写入DR
接收移位寄存器转移数据时置 RXNE 标志位,实际读取DR
最后开启 cmd 开关
引脚选复用模式,因为要用外设引脚
TX发送,RX接收,数据传输为16进制数
将 printf 转置到串口显示
方法1和2

在文件开头要加上 <stdio.h>
方法3
![]()

数据包:

载荷和包头包尾重复时选择固定包长



I方C通信:
硬件电路

时序基本单元

发送:

当主机发送0时,SDA下降,当主机发送1时,SDA上升
接收:

应答机制:

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)