STM32定时器中断实验

1.STM32 通用定时器简介

STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)
构成。STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波
形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形
周期可以在几个微秒到几个毫秒间调整。STM32 的每个通用定时器都是完全独立的,没有互相
共享的任何资源。
STM3 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能包括:
1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。
2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~
65535 之间的任意数值。
3)4 个独立通道(TIMx_CH1~4),这些通道可以用来作为:
A.输入捕获
B.输出比较
C.PWM 生成(边缘或中间对齐模式)
D.单脉冲模式输出
4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外
一个定时器)的同步电路。
5)如下事件发生时产生中断/DMA:
A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
C.输入捕获
D.输出比较
E.支持针对定位的增量(正交)编码器和霍尔传感器电路
F.触发输入作为外部时钟或者按周期的电流管理

2.该实验用到的几个寄存器

1)寄存器 1(TIMx_CR1)(16位)

在本实验中,我们只用到了 TIMx_CR1 的最低位,也就是计数器使能位,该位必须置 1,
才能让定时器开始计数。

2)DMA/中断使能寄存器(TIMx_DIER)(16位)

 这里我们同样仅关心它的第 0 位,该位是更新中断允许位,本章用到的是定时器的更新中
断,所以该位要设置为 1,来允许由于更新事件所产生的中断

3)预分频寄存器(TIMx_PSC)(16位)

该寄存器用设置对时钟进行分频,然后提供给计数器,作为计数器的时钟。

这里,定时器的时钟来源有 4 个:
1/内部时钟(CK_INT)
2/外部时钟模式 1:外部输入脚(TIx)
3/外部时钟模式 2:外部触发输入(ETR)
4/内部触发输入(ITRx):使用 A 定时器作为 B 定时器的预分频器(A 为 B 提供时钟)。

这些时钟,具体选择哪个可以通过 TIMx_SMCR 寄存器的相关位来设置。这里的 CK_INT
时钟是从 APB1 倍频的来的,STM32 中除非 APB1 的时钟分频数设置为 1,否则通用定时器 TIMx
的时钟是 APB1 时钟的 2 倍,当 APB1 的时钟不分频的时候,通用定时器 TIMx 的时钟就等于
APB1 的时钟。这里还要注意的就是高级定时器的时钟不是来自 APB1,而是来自 APB2 的。


这里顺带介绍一下 TIMx_CNT 寄存器,该寄存器是定时器的计数器,该寄存器存储了当前
定时器的计数值。

4)自动重装载寄存器(TIMx_ARR)

该寄存器在物理上实际对应着 2 个寄存器。
一个是程序员可以直接操作的,另外一个是程序员看不到的,这个看不到的寄存器在《STM32
参考手册》里面被叫做影子寄存器。事实上真正起作用的是影子寄存器。根据 TIMx_CR1 寄存
器中 APRE 位的设置:APRE=0 时,预装载寄存器的内容可以随时传送到影子寄存器,此时 2
者是连通的;而 APRE=1 时,在每一次更新事件(UEV)时,才把预装在寄存器的内容传送到
影子寄存器。

5)状态寄存器(TIMx_SR)

该寄存器用来标记当前与定时器相关的各种事件/中断是否发生。

3.硬件设计

本实验用到的硬件资源有:
1) 指示灯 DS0 和 DS1
2) 定时器 TIM3
本实验将使用定时器产生中断,然后在中断服务函数里面翻转 DS1 上的电平,来指示定时器中断的产生。

4.软件设计

time.h代码如下

time.c代码如下

 该函数的 2 个参数(arr,psc)用来设置 TIM3 的溢出时间。

溢出时间计算公式如下:
                                        Tout= ((arr+1)*(psc+1))/Tclk;

例如:溢出时间为500ms,则arr=4999,psc=7199

其中:
Tclk:TIM3 的输入时钟频率(单位为 Mhz)。
Tout:TIM3 溢出时间(单位为 us)。

main.c代码如下

这里的代码和之前大同小异,此段代码对 TIM3 进行初始化之后,进入死循环等待
TIM3 溢出中断,当 TIM3_CNT 的值等于 TIM3_ARR 的值的时候,就会产生 TIM3 的更新中断,
然后在中断里面取反 LED1,TIM3_CNT 再从 0 开始计数。

5.下载验证

在完成软件设计之后,我们将编译好的文件下载到 MiniSTM32 开发板上,观看其运行结果
是否与我们编写的一致。如果没有错误,我们将看 DS0 不停闪烁(每 400ms 闪烁一次),而 DS1
也是不停的闪烁,但是闪烁时间较 DS0 慢(1s 一次)。

 

 

 

 

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值