文章目录
- 1
- 1.1
- 1.2
- 1.3
- 1.4
- 1.5
- 2
- 2.1
- 2.2 基本定时器 框图
- 2.3
- 2.4
- 2.4.1
- 2.4.2
- 2.4.3
- 2.4.4
- 2.4.5
- 2.4.6
- 2.5 定时器 溢出时间计算方法
- 2.6 定时器 中断 实验配置步骤
- 2.7
- 2.7.1
- 2.7.2 和4
- 2.7.3
- 2.7.5
- 2.7.6
- 3
- 3.1
- 3.2
- 3.2.1 时钟源
- 3.2.2
- 3.2.4
- 3.2.6
- 3.3
- 3.4
- 3.4.1
- 3.4.2
- 3.4.3
- 3.4.4
- 3.4.5
- 3.4.5.1
- 3.4.5.2
- 3.4.5.3
- 3.4.5.4
- 4
- 4.1
- 4.2
- 4.3
- 4.3.1
- 4.3.2
- 4.3.3
- 4.3.4
- 4.4
- 4.5
- 4.5.1
- 4.5.2
- 4.5.3
- 4.5.4
- 4.5.5
- 4.5.6
- 4.5.7
- 实验个数 1 4 4
1
- 定时器定时原理 是 硬件定时
1.1
- 51 里面 利用 机械周期 nop 为1
- 那个称为 延时因子 F103 主频72MHZ 这个因子 这就72
- 不精准 函数调用 压栈出栈 耗时 STM32 ARM架构 有流水线 (一条指令 需要多个指令 一条指令执行 分成多个步骤?)
- 死等 比如延时 1s (cpu 1s内 啥也干不了了)
1.2
- 时基 这里可以理解为 时钟源
- TIM CLK 是 计数器 工作的时钟频率
- 时间到了 产生一个事件??? 或者使能它产生一个中断
1.3
- 实时时钟是 RTC
1.4
- 预分频系数 这得是整数的
- 溢出 时间到了 会产生 DMA请求
- 这里F1 是 只有高级定时器 才有互补输出(H7的不是)
1.5
- 这时基(用途) 说的是 定时功能
- 这说输入输出 难道是1.4 捕获就是输入 互补就是比较?
2
2.1
- 分频 1的时候 对应 2分频 0-> 1
- 基本定时器溢出时 可触发DAC 产生一次 数模转换
2.2 基本定时器 框图
-
时钟源来自 RCC? ????(RCC不是 复位和时钟控制吗)
-
基本定时器 时钟源 只能来自 内部时钟
-
CNT计数器上有个 + 表示递增
-
溢出条件没看懂???
-
影子 图上后面 有阴影 称为该寄存器 的影子寄存器
-
写到ARR不起作用 要转移到 ARR影子寄存器才起作用
-
影子寄存器 上面的寄存器 起到 缓冲作用
-
这U 是更新的意思
-
默认下 计数器溢出 事件会产生 可设置不产生 中断和DMA请求 和这个相反
-
更新事件产生的第二种 方法
- 更新事件的 作用 以及ARPE 位 决定ARR 是否具有缓冲
- 控制计数器 复位 使能 计数
- TRGO 触发输出 信号 (计数器 溢出时 会产生这个信号)
这再介绍一下 定时器 时钟源
- 这并不是 挂载在哪个总线上 频率就是那个(倍频器)
- 这是 时钟树 在 参考手册里
-
看了一下实例里 分频系数是多少
-
所以 定时器 1~8 都是72M的
2.3
- 递增又叫 向上
- PSC是1 这是 二分频 (前面说过+1)
- 更新中断 标志位 硬件 置1 如果配置了 会产生中断(中断服务函数里 会把标志位清0)
- 这个自动重载 感觉有点不一样
2.4
2.4.1
- 这介绍了 缓冲 可以具有的作用 减小误差(改值情况下 要用?)
- 两种场景 一种 亮1s 灭 2s 另一种 亮1s 灭1s
- 第一种必须用缓冲 不用的话 你改ARR 的值会有误差
- 第二种 不用改ARR的值
- 这个寄存器的作用
2.4.2
- 这个前面 框图说过 这两默认都不开
- 这用不到 DMA请求
2.4.3
2.4.4
- rw 可读可写 计数器运行时 也可写数据
2.4.5
- 这体现 +1了
- 感觉这个预分频 应该和时钟那讲的无关 (随意设的)
2.4.6
2.5 定时器 溢出时间计算方法
- 这有两 定时器时钟频率 计数器的时钟频率才是真的
不懂ARR为啥是+1不是+2- 他解释加1 好像是 如果ARR=0不能直接溢出吧 所以要前面有一个周期 (前面模式 那实列那 开始cnt变化时 前面确实有一个)
- 懂了 0到1 是1次
2.6 定时器 中断 实验配置步骤
- 这给了一种方法 像这种给好了的HAL库函数 还是配置的 肯定看形参 的结构体成员 有啥
- 感觉和串口 步骤差不多 都是 MSP 回调 和 中断回调
- 为啥这有两使能中断(应该是总分)
- HAL中断处理 公用函数 通过SR来判断 发生哪个中断
下面通过实例 来理解这几个函数
- 这是HAL库 外设初始化函数 参数的句柄 就前两用到了 后面的不用
- 这存放着 外设寄存器基地址的宏 (存放着寄存器 信息)
- 预分频系数 就是操作PSC寄存器
- 用不到 第二个 计数模式 只有 递增 时钟分频因子(通用 高级 有) 第5个(高级有)
- 最后那个成员 相当于 CR1 里的位7
-
程序里 就是1左移 7个位
-
下面那结构体 只用了 三个成员
配置步骤三的函数
- 使能定时器 中断 具体哪个看参数 (这是更新中断)
- 基本定时器 只用到 这个更新中断
- 第二个功能是 使能计数器 CR1寄存器 位0
- 实例中也是 操作位0 1左移0位
2.7
- 产生更新中断 有两种方式 定时器 溢出 和 软件 置ug位 产生软件更新事件 从而产生 更新中断
- 一般带 PSC的值 算ARR
- 这PSC为了 和72 能约
- 单位 是 s HZ
以跑马灯实验为工程模板
- 新建文件 添加btim.c 分组
- 要HAL库函数 添加对应文件进文组(这应该也体现 extern作用 不用添加头文件)
2.7.1
- 这找不到这个结构体 (写btim.h 就能找到 HAL库的了 我是看到+号下面 就一个btim.h 没其他的知道的) 正点的sys.h 有东西 这种类型的东西 都不用extern一下吗 直接就用了 明明没在一个文件里
- 第二 这参数用的是指针 传过去 变量的地址
- 这handle 是句柄
- init结构体 里 最后一个 因为 这 arr的值不用变 所以不管
- 完成这个函数 所需的结构体了
2.7.2 和4
- 找时钟使能 就去这 或者ex
- 搜索 TIM 找到对应函数 再2改成 6 全局
- 再设置NVIC 参数 中断号 找就行
2.7.3
2.7.5
- 去 启动文件里面 找 中断服务函数的名
2.7.6
-
加led.c 头文件
-
声明 那个自己创的函数
main.c
- 这delay 500 没影响 是中断
- 正点的 PB5 某些引脚 引出来了
- 频率1HZ 就是两个0.5s 占空比 50%
3
- 3.3 里还会有个 通用定时器 中断实验
3.1
- 多了 ADC
- 不仅更新事件 会产生中断 /DMA请求
- 可以级连
- 数据手册可以看对应芯片 有几个定时器 (看来是芯片自带的 不是原子加的)
3.2
- 定时器 核心 计数器或者时基单元
- 包含基本定时器 所有功能
- TRGO 触发输出信号
3.2.1 时钟源
- 四类 时钟源来源
- 内部触发输入时钟
- IO口复用 为定时器ETR引脚 外部时钟模式二
- 外部时钟模式1 来自通道一和通道二
教一下去哪找 ETR 和通道1 2
- 数据手册 直接搜 CH ETR
- 或者原理图 搜
3.2.2
- 触发输出信号 多出来 到 其他定时器 和ADC
- 级联:定时器触发输出信号 接到下一个定时器 触发输入信号
3.2.4
- XOR 异或门 霍尔传感器电路(电机) 用的 一般用不到 可忽略
- 因为输入捕获 所以外部来 IO复用为通道
-
会有毛刺部分 高频 滤波去掉
-
这两信号看你 的配置 可配置TI1 到IC1 和IC2(一般 这用通道1 就映射到 输入捕获通道1)
-
可以把右边 理解为 输入捕获通道1 和 2 (ic input capture)
-
预分频器 这里 沿 会产生捕获事件 把CNT的值 转移到 捕获/比较1 寄存器
-
可用于测量 脉冲时间
- CC1是捕获中断 可开启
3.2.6
- 程序员 往比较寄存器 写入比较值
- 这有影子寄存器 更新事件发生 才会写下去 可以硬件 也可以软件更新
- 当cnt== 影子寄存器的值 会改变输出参考信号
- OC1REF 输出参考信号 默认高电平有效?
- 比较事件 / 可开启比较中断
- 输出控制有8种输出模式 如:pwm输出模式
- 输出信号 受到 模式 输出参考信号 和下面那个影响 下面那个信号会把输出参考信号强制清0
- 左右的通道是 分时复用
3.3
- TI1F_ED 双边沿检测 两都计数
计数器时钟源 寄存器设置方法
1.
- ECE 也= 0
- 就是从这
- 这就能看出来 SMS 就是把TRGI 连到后面
- ECE=1 就是上面那个 相同功效时钟源都来自 ETR引脚
- TS 位 应该是 连起来 这两
详细介绍 外部时钟模式1
- 知道哪个位 在那一步
- 不一定 是稳定高电平 掺杂毛刺信号
- 看清谁和谁之间的 分频
- CK_INT 是定时器 时钟源频率
- 这取倒数 时间和频率的关系
- TRGI那 看的是上升沿 (CC2P那只起反向作用?)
详细介绍 外部时钟模式2
- ECE 置 1 或另一种方法
- 这边缘检测器 怎么都是反向的
- 这图写对应哪个寄存器了
讲一下级联
- SMS TS能看懂
- 主模式有点纳闷 前面都是从模式(选择啥的)
- 没有基本定时器
解读 通用定时器 中断实验
- 中断服务函数 和基本的那个实验不同 没用HAL库公共中断处理 而是自己写的 判断标志位(是不是用了 就不用自己写判断标志位了)- ???
- 再清除标志位
3.4
感觉这个输出就是 一部分CCRx 下一部分比较后的信号输出
pwm就是 高低电平 矩形
3.4.1
主电路的
- 比较结果 会到 输出控制里
- 正在写CCR1的时候 值不会被转移下去
输出部分的
- 输出参考信号 由左边三个信号控制
- OC1后面就是通道1了
看一下 寄存器的具体配置
- 8种输出模式
- ETRF 来自这
3.4.2
- x 的值 1~4
- IO那其实是上面OCx
- 周期 ARR控制(计数器频率不变的话 (时钟频率 分频系数)) 占空比CCRx控制
3.4.3
- CCMR1寄存器是管 通道1 和 2的
- 向上计数 递增模式
- REF那个是参考电平
- 这个逻辑电平 应该是 最后通道的 (他说的不是)
3.4.4
- HAL库外设初始化 初始化结构体
- 宏难道是__开头的?
- 基础定时器 那函数对应的BASE
实例里看一下这些函数
-
弹幕说到时钟在哪配置了?
-
config 那个函数
-
这个代码里 init里为啥没NVIC(没中断)
-
config函数里面形参有 这个定时器输出比较初始化结构体
-
第4个 高级定时器 18 才有
-
第5个 用的少
-
后面是互补输出 也是高级的
-
PWM实验 就看前三个
start函数 输出使能 和 计数器使能
这个挺重要
COMARE 函数
-
就是往CCRx 里面写值
-
在main函数里
-
操作 捕获/比较寄存器
使能通道预装载
- 这个是可选的 实例中没用到( 是0的意思吗)
3.4.5
先看一下IO口
- 原理图上有LED 但是没写出来定时器(可能因为 重映射??)
- 用一下 重映射功能
实战 以跑马灯为例
- BSP下新建TIMER文件夹 新建文件 gtim.c
- 写一下基本的
- 这个好像只在这出现过
3.4.5.1
-
这是g 开头 基本那个是b开头
-
ch好像是通道 y是几
-
TIM3 是因为 LED0 能重映射为 TIM3的
-
模式那个搜一下 ref(一般就在一个文件里 和出现ref的)
-
找不到那个函数 记得添加分组 以跑马灯为模板的话
-
这跳转不了 但编译不报错
- 加上前面每次添加了文件后 直接在左边这里添加分组都没有 (所以 复制其他的 这里指向的是之前的)
3.4.5.2
- 这直接把led.c 里的部分代码拿过来了
- 改了名字 推挽复用(是指的复用吗 包括重映射功能 之前好像用过单纯复用的???) 加时钟开启
- 好像知道为啥定时器不用配置时钟了 时钟树 里面不都整好了
- 打开重映射的时钟
- HAL库这么整上面的寄存器
3.4.5.3
- 通道这个打几个就会出提示
3.4.5.4
- 再写一下main 和 声明
- 2 KHZ 50%占空比
- 应该灯看不出来是 时间太快了 视觉残留
实现呼吸灯效果 🐂
- 波形的占空比 一直在变
- dir是方向
- 没了for 用while 这种变数的 感觉
- 比较值变化过程
- 每10ms 往CCR2里写入
- ARR是500 当CCR2为0时 都是 1 当CCR2为300时 >300 时为 1 占空比40%
- 占空比 40~100
通用定时器 先到这
4
4.1
- 断路输入 刹车信号输入
- 下面是比 前面通用多的
4.2
- 时钟源部分 和通用定时器一样
- 这是不一样的部分 刹车输入引脚 互补输出通道
- 通用时 溢出就产生 U(更新事件) 和UI(更新中断)
- 寄存器设置 值 溢出一次 值-1 直到0 才产生U 和 (UI)
- 通道4 没有互补通道
- DTG寄存器 设置死区时间
- BI(刹车中断?)来到输出控制
4.3
4.3.1
- 边沿对齐模式(向上 向下)
- 中心对齐的 CNT = ARR - 1 CNT = 1
- 再同步就是 再往影子寄存器里发一次 重置值 RCR寄存器 这里有效位是框图里的REP 上面起缓冲作用(影子寄存器)
4.3.2
- 指定个数 就是用重复计数器
- 输出的开关
4.3.3
- 6 的主输出 高级定时器才有
- 定时器输出比较 初始化结构体 用前三个
4.3.4
- 看一下TIM8_CH1在哪
- 看LED1在哪
- 杜邦线 连起来 排针引出来了
- 溢出时间 是 0.5s
- 这解释了 为啥这个倒数就是 PWM的周期 (溢出一次 正好对应一次PWM)
实战(以跑马灯为例)
- 新建 TIMER (atim.c)
- PWM
- 使能输出
- 使能主输出 MOE位
- 使能计数器 CR1寄存器 位0
下面开始指定个数
- 所以uint8
- 最大255 RCR 溢出266次 产生U 以及 UI
-
这软件更新 为了把 RCR的值 写影子寄存器里 -
这更新应该是为了 进入中断
-
启动计数器 因为中断后里 我们设置关闭计数器
-
软件更新 第二个参数是 事件源
中断服务函数
-
说明为啥-1
-
这里的更新 应该只改变RCR的值 而不会再进中断(类似同优先级中断 不打断?)
-
下一句 打开计数器可以 注释一下试试
-
~这个是取反(也不知道这怎么靠上了 视频里也是中间的)
为啥不用disable 关闭 计数器
- 因为它要先判断 通道和互补通道关了没 才会关计数器
-
这个1左移0位 是找到该位 下面它的介绍 0的时候关闭
-
这里不管 通道 所以用寄存器 方法操作
main 函数
- 包含头文件
- 然后再把key文件加进来
-
忘记 在atim.h 声明了
-
改一下 PE5
-
led_init 里配置的也是输出 这两都输出 会冲突
-
这再 开 时钟 感觉没必要
-
自己试一下 他用示波器看了
summary : 中断就是为了 指定个数
RCR是必要的 这种方法里
两次 软件更新意义要知道(验证一下 把第二次后面 启动计数器关了)
- 输出比较先不看 (少看了)(里面是翻转模式 不是pwm1 2)
4.4
4.5
4.5.1
- x=1~3
- 死区时间 oc 和 ocN 都是无效电平(这图里 是 低电平 有效???)
- 左右两个死区时间 相等
4.5.2
-
同侧 不能同时导通 短路 OC 和OCN 不能同时 有效电平(这里可能是低 (控制))
-
不是因为mos管 反转 需要时间? 延迟??(切换时?来的电平 有延迟 所以等?)(应该就是说的mos管 )
-
如果不加 死区控制 可能有一瞬间 短路
4.5.3
- 输出比较模式 包括 PWM1
- 电机可以复用为ETR引脚(来自IO的复用)
- CC1P 是极性选择
- MOE 是 主输出模式??(输出通道 互补 总开关)
4.5.4
- Ft 是定时器时钟源 F1 72M
- 左边是 右边的式子
- BDTR刹车死区寄存器
- 1s= 10^-3 ns
4.5.5
-
输出由这些位控制
-
硬件会强制使 不同时高电平
-
MOE 主输出模式 0(空闲模式) 1(运行模式)
-
OSSI 空闲模式下 关闭状态用的???
-
第二个 看上面表75
-
BIF 刹车中断标志位
看上面的表75
- 运行模式时 OSSI没用
- OSSR 是运行模式关闭状态 空闲模式下为X
-
和4.5.3 这里正好对上了
-
CCxE 是输出使能位
-
会把输出使能位 置1
-
输出参考信号 那个受 CNT 和 CCR影响 (以及ETR引脚)
- 与定时器断开 是指输出参考信号咋变 和输出无关
- OCx=CCxp 输出信号等于极性
- 使能 输出使能 位 置0(上面出现)(关闭输出)
- MOE=0 刹车
- 感觉就是这个 使能 输出使能 这个位 变了
4.5.6
-
PWM这个和BASE那个一样 都是 初始化定时器基础参数
-
BDTR是 刹车和死区 寄存器
-
该结构体被前面第三个 函数用
-
后面两 是 刹车后的 (互补)输出通道 状态设置
介绍一下上面结构体 对应的 寄存器
- CCxp CCxNP 极性选择
- 刹车后 状态选择
- 该结构体 第四个函数用
对应寄存器
- 参考手册 BDTR
- 锁定 这个一般用不到
4.5.7
- DTG 8位
- 输出空闲状态 是 指 刹车后的
- 比以前 多了底下两个
- 死区时间5.56us(微秒)
- 此处是 高电平导通 设置高为 有效电平
开始咯
- 以跑马灯为模板
- BSP 下新建TIMER atim.c atim.h
- 添加 TIMER分组 和 HAL库 tim的驱动
- 对应HAL 库 里 这个
- NVIC 这没用
- GPIO 所以先看一下 用哪些IO 口
- 这是重映射方式 使用
- 也是 重映射
- 重映射 的寄存器
- 3 左移 六位 对应上
- __ 开头 应该就是宏
- 设置有效电平 前面H桥 那得是 高电平(就算设置成低 逻辑反一下 应该也行 )
- 空闲 状态这都给0 肯定不转
- 用到的结构体
- 死区时间一会在这设置
- main函数
- 700是 因为要70% (应该也可能 300?)
- 死区时间
- 也 可以用数字看
- /2 死区时间 和之前算的 差不多 5.5 5.6
- 接入刹车信号后(PA15 接右边3.3V)
- 全设置成有效 就成无效电平了
- 一高一低可以