STM32F103_LL库+寄存器学习笔记22 - 基础定时器TIM实现1ms周期回调

导言


如上所示,STM32F103有两个基本定时器TIM6与TIM7,所谓「基本定时器」,即功能最简单的定时器。

项目地址:

github:

gitee(国内):

一、LL库


1.1、CubeMX

如上所示,STM32F103 的定时器时钟频率均为 72 MHz。


1.2、tim.c

CubeMX 根据上述配置,自动生成了相应初始化代码。

1.3、main.c

1.4、stm32f1xx_it.c

1.5、编译、调试


如上所示,串口疯狂打印"Hello,World\n"。

二、寄存器方式


2.1、myTIM6Drive.c


如上所示,基于寄存器的实现代码简洁明了。

2.2、编译、调试


由此可见,两种实现方式在功能和效果上完全一致。

三、梳理寄存器


3.1、RCC_APB1ENR时钟使能寄存器

c 复制代码
RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; // 使能 TIM6 时钟

3.2、TIMx_PSC预分配寄存器

c 复制代码
TIM6->PSC = 71;      /* PSC 寄存器:计数时钟 = PCLK1/(PSC+1) */

3.3、TIMx_ARR自动重载寄存器

c 复制代码
TIM6->ARR = 999;     /* ARR 寄存器:计数到 ARR 后产生更新事件 */

3.4、TIMx_CR1控制寄存器1

c 复制代码
TIM6->CR1 |= TIM_CR1_ARPE; /* 3. 使能 ARR 预装载 */

TIM6->CR1 |= TIM_CR1_CEN;  /* 4. 启动定时器 */

3.5、TIMx_SR状态寄存器

c 复制代码
TIM6->SR &= ~TIM_SR_UIF; /* 1. 清除更新中断标志 */

在中断回调函数中,遇到 UIF 更新中断时,需要及时将其标志位清零。
TIM_SR_UIF 定义为 0x0001(即 bit-0)。所以,~TIM_SR_UIF 等于 0xFFFE。把 UIF 位对应的位置为 0,其它位为 1。最终,SR &= 0xFFFE 就是"给 UIF 写 0,给其它位写 1"------符合"写 0 清"语义。

3.6、TIMx_DIER中断使能寄存器

如上所示,将 DIER 寄存器的 UIE 位置 1,可使能 TIMx 的更新中断(计数溢出)。

c 复制代码
TIM6->DIER |= TIM_DIER_UIE; // 使能更新中断
相关推荐
ZZHow102417 分钟前
Ascend C算子开发(高级)笔记
c++·人工智能·笔记·深度学习·华为云
Brilliantwxx35 分钟前
【STM32】 通用定时器:输入捕获与输出比较详解 测脉宽、测频率
stm32·单片机·嵌入式硬件·mcu
PC2005-cloud1 小时前
Mysql学习笔记:InnoDB Cluster 集群从零搭建实战,基于 Docker 实现高可用读写分离架构
笔记·学习·mysql
小陈phd1 小时前
深入理解agent学习笔记(七)——动态提示词与Skills
笔记·学习
我命由我123451 小时前
田野笔记极简理解
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
意法半导体STM321 小时前
【官方原创】LAT1703 STM32C5 LL Cordic例程
stm32·单片机·嵌入式硬件·stm32c5·ll cordic
一木 之林1 小时前
微信小程序开发全攻略·文章版|00 总览:74集学习路径与知识地图
人工智能·学习·计算机视觉·微信小程序·小程序
小陈phd2 小时前
深入理解agent学习笔记(六)——提示工程-优化系统提示词
笔记·学习
霖霖7142 小时前
【ESP32笔记】RGB灯WS2812实验
笔记·单片机·mcu·物联网
Aurora_eye2 小时前
Git 笔记
笔记·git