文章目录
前言
在前面我们已经用基本定时器的中断实现了LED灯的翻转,在了解了通用定时器之后,这次我们配置通用定时器3的中断来实现LED翻转。
寄存器以及配置介绍
控制寄存器 1(TIMx_CR1)
这里只列出了我们实验用到的几个位。
位 7(APRE)用于控制自动重载寄存器是否进行缓冲。
CMS[1:0]位,用于设置边沿对齐模式还是中心对齐模式,本实验我们使用边沿对齐(向上计数/向下计数)模式,所以设置为 00 即可。
DIR 位,用于控制定时器的计数方向,我们使用递增计数模式,所以设置 DIR 位为 0。
CEN 位,用于使能计数器的工作,必须要设置该位为 1,计数器才会开始计数。
从模式控制寄存器(TIMx_SMCR)
该寄存器的 SMS[2:0]位,用于从模式选择,其实就是选择计数器输入时钟的来源。而这里,我们使用的是内部时钟,所以我们设置设置 SMS[2:0]=000,禁止从模式。
DMA/中断使能寄存器(TIMx_DIER)
该寄存器用于使能/失能触发 DMA 请求、捕获/比较中断以及更新中断。本实验只用到更新中断,所以把位 0(UIE)置 1 即可。
状态寄存器(TIMx_SR)
这个寄存器里都是一些中断标志位。在中断实验中,定时器中断到来后,位 0(UIF)会由硬件置 1,因此我们需要在中断服务函数里面把该位清零。
计数寄存器(TIMx_CNT)
TIM2/TIM3/TIM4/TIM5 的计数寄存器都是 16 位有效的,计数值范围 0~65535。以直接写该寄存器设置计数的初始值,也可以读取该寄存器获取计数器值。
预分频寄存器(TIMx_PSC)
定时器的预分频寄存器都是 16 位的,即写入该寄存器的数值范围是 0 到 65535,表示 1 到65536 分频。比如我们要 7200 分频,就往该寄存器写入 7199。
自动重载寄存器(TIMx_ARR)
自动重载寄存器是低 16 位有效。该寄存器可以由 APRE 位设置是否进行缓冲。计数器的值会和自动重装寄存器影子寄存器进行比较,当两者相等,定时器就会溢出,从而发生更新事件,如果打开了更新中断,还会发生更新中断。
配置
首先我们要知道我们是使用的内部时钟,所以在图中我们走①这条路,这里我们设置为上升沿触发。在②时,因为我们是用的内部时钟,所以从模式寄存器的SM[2:0]设置为000,我们只用到了更新中断所以将DMA/中断使能寄存器(TIMx_DIER)的位 0(UIE)置 1 即可。在触发中断后,我们需要在中断服务函数里对中断标志位UIF软件清零。计数寄存器、预分频计数器、自动重装载寄存器按需设置即可
硬件设计
实现功能
LED0 用来指示程序正在运行, 200ms 翻转一次。 LED1 在定时器中断中翻转, 500ms 进入中断一次。
硬件资源
- 本实验基于正点原子的战舰V4开发板
1) LED 灯
LED0 – PB5
LED1 – PE5
2)定时器 3
程序设计
在基本定时器的中断实现LED翻转时,已经涉及到了很多内容。通用定时器和基本定时器的不同点在于通用定时器可以是递增计数模式/减计数模式/中心对齐模式。
因为内容相似度高,所以请参考基本定时器以及利用定时器中断翻转LED灯