嵌入式开发与应用实验三——定时器实现一秒闪烁一次

一、实验目的

1. 掌握使用 STM32 的通用定时器 TIM6/7实现 1s 定时的方法;

2. 掌握 STM32 的定时器的原理及基本功能;

3. 掌握定时器的基本配置功能。

二、实验内容

  编程实现,利用定时器TIM6/7定时1秒,每隔1秒控制PBO端口 LED灯闪烁一次,同时TFT上显示次数。

三、实验器材(设备、元器件)

(一)装有Keil uVision5软件的计算机一台

(二)STM32f103VET6的开发板一块

四、实验步骤

1. 定时/计数器的工作原理

  使用精准的时基,通过硬件的方式,实现定时功能定时器核心就是计数器定时/计数器实质上是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU发出中断请求(中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。

2. TIM(Timer)定时器

(1)定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断;

(2)16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时;

(3)不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能;

(4)根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型:

(5)基本定时器框图

3. 定时器基本配置

  设置自动重装载寄存器ARR的值为10000,设置时钟预分频器为72,则驱动计数器的时钟CK_CNT=CK_INT/(71+1)=1MHz,则计数器计数一次的时间为1/CK_CNT=1s。当计数器计数到ARR的值为10000时,产生一次中断,则一次中断时间为1/CK_CNT×ARR=1s。

(1)开启定时器时钟,即内部时钟;

  使用SystenInit函数初始化的时候,各时钟频率如下:SYSCLK = 72M   AHB时钟 = 72M   APB1时钟=36M,所以APB1的分频系数=AHB/APB1=2,由此可得CK_INT的时钟频率为2*36M = 72M

  定时器时钟TIMxCLK,即内部时钟CK_INT,经APBL预分频器后分猕提供。如果APB1预分频系数等于1,则频率不变,否则频率乘以2。库函数中 APB1预分频的系数是2,即PCLK1=36 MHz,所以定时器时钟中TIMxCLK=36x2=72 MHz。
(2)TIM_Period:自动重装载寄存器周期的值(计数值);

  定时器周期,即设定自动重载寄存器的值,在事件生成时更新到影子寄存器,可设置范围为0-65535。自动重载寄存器ARR是一个16位的寄存器,装着计数器能计数的最大数值。当计数到这个值时,如果使能了中断的话,定时器就产生溢出中断。


(3)TIM_Prescaler:定时器预预分频数器设置为72;

  定时器时钟经过PSC预分频器之后,即CK_CNT,用来驱动计数器计数。PSC是一个16 位的预分频器,可以通过定时器时钟 TIMxCLK对1~65536的任何一个数进行分频。具体计算方式为:CK_CNT=TIMxCLK/(PSC+1)。

(4)TIM_CounterMode:定时器计数方式,可分为向上计数向下计数以及中心对齐模式,基本定时器只能向上计数,且没有配置计数模式的寄存器,默认向上。

这里我们将计算模式设置为向上计算模式,也就将DIR位设为0。

(5)TIM_ClockDivision:时钟分频,设置定时器时钟CK_INT频率与数字滤波器采样时钟频率分频比,基本定时器没有此功能,不用设置;
(6)初始化定时器;初始代定时器房动定时器无限循环;
(7)清除计数器中断标志位;
(8)开启计数器CN中断;

  该寄存器是用来计数的,不需要进配置,在将定时器打开以后便自动开始计数,直到与ARR寄存器中的值相匹配产生溢出事件。

4. 使能定时器更新中断,开启定时器计数,配置定时器中断优先级

CEN:使能计数器

0:禁止计数器;   1:使能计数器。

注:在软件设置了CEN之后,外部时钟、门控模式和编码器模式才能工作,触发器可以自动地通过硬件设置CEN位。

在单脉冲模式下,当发生更新事件时,CEN被自动清除。

(1)同时使能CEN位,让CK_CNT时钟开始工作,驱动计数器CNT计数。

(2)设置中断分组为0,抢占优先级为0,响应优先级为3,基本定时器中断优先级配置如下:


5.编写中断服务函数

  定时器中断一次的时间是1s,定义一个全局变量Cnt,每当进一次中断的时候,由Cnt来记录进入中断次数。如果想实现一个1s的定时,只需要判断Cnt是否等于1000即可(1000个1ms就是1s);然后主函数把Cnt清除,重新计数,一次循环往复。在中断服务程序中一定要把相应的中断标志位清除掉,它不会硬件自动清除。

五、实验数据及结果分析

通过以上实验得出以下数据

1. 主函数部分如下:

2. 定时器的配置如下:

3. Tim.h部分:

4. GPIO的配置如下:

5. led.h部分:

6. 定时器中断服务程序如下:

7. 程序编译结果如下:

8. 软件仿真波形图如下:

9. 硬件仿真结果如下:实现的是PB5LED灯的1s亮灭

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值