实验七:定时器中断实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微控制器

综合设计与实训实验名称:实验七定时器中断实验

实验七:定时器中断实验

1 实训任务

(1) 设置定时器时钟,自动重装载值,分频系数和计数方式;

(2) 设置定时器中断优先级;

(3) 通过编写延时函数实现定时器中断。

1.1 实验说明

STM32的通用定时器是由一个通过可编程预分频器(PSC)驱动的16位自动装载计数器(CNT)构成。STM32的通用定时器的用途:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。使用定时器预分频器和RCC时钟控制器预分频器,可以使脉冲长度和波形周期在几个微秒到几个毫秒间调整。

STM32F10x的通用TIMx(TIM2、TIM3、TIM4和TIM5)定时器功能包括:

(1)6位向上、向下、向上/向下自动装载计数器(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.触发输入作为外部时钟或者按周期的电流管理

定时器的时钟来源有4个:

(1)内部时钟(CK_INT)

(2) 外部时钟模式1:外部输入脚(TIx)

(3)外部时钟模式2:外部触发输入(ETR)

(4) 内部触发输入(ITRx):使用A定时器作为B定时器的预分频器(A为B 提供时钟)。

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

本实验使用定时器3产生溢出中断,在中断服务函数里面翻转LED上的电平,来指示定时器中断的产生。定时器相关的库函数主要集中在固件库文件stm32f10x_tim.h和stm32f10x_tim.c文件中。

1.2 实验步骤

(1) 在实训平台上将PE4和PE5分别连接LED灯;

(2) 复制上一个实验工程修改名称并保存为定时器中断实验;

(3) 新建timer.c和timer.h文件,添加至工程中;

(4) 编写timer.h文件,声明定时器3初始化函数;

(5) 编写timer.c文件,编写定时器3初始化函数,设置分频系数、计数方式、自动重装载计数周期值和时钟分频因子;

(6) 编写main函数,程序编译正确;

2 程序设计

(1) 新建文件夹并命名为定时器中断实验,复制粘贴之前的实验文件,将工程文件改名为TIMER.uvprojx,同时添加timer.c和timer.h文件至工程中。

(2) 编写timer.h文件。

图8.2 timer.h文件

(3) 编写timer.c文件。

a. 让TIM3时钟使能

TIM3挂载在APB1下,通过APB1总线下的使能函数来使能。

图8.3 时钟使能

b. 初始化定时器参数, 设置自动重装值,分频系数,计数方式

库函数中定时器的初始化参数是通过初始化函数TIM_TimeBaseInit实现的,V oid TIM_TimeBaseInit(TIM_TypeDef*TIMx,

TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct

第一个参数是确定哪一个定时器,第二个参数是定时器初始化参数结构体指针

结构体类型为TIM_TimeBaseInitTypeDef,这个结构体的定义为:

图8.4 结构体定义

这个结构体一共有5个成员变量,对于通用定时器只有前面4个参数有用,

最后一个参数TIM_RepetitionCounter在高级定时器才会用到。

c. 设置TIM3_DIER允许更新中断

寄存器的相应位使能更新中断,在库函数里面定时器中断使能是通过TIM_ITConfig函数来实现的:

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_tTIM_IT, FunctionalState NewState);

第一个参数是选择定时器,取值为TIM1~TIM17。

第二个参数非常关键,是用来指明使能的定时器中断的类型,定时器中断的类型有很多种,包括更新中断TIM_IT_Update,触发中断TIM_IT_Trigger,以及输入捕获中断等等。

第三个参数是设定失能还是使能。

最终函数为TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );

d.TIM3中断优先级设置

在定时器中断使能之后,因为要产生中断,必不可少的要设置NVIC相关寄存器,设置中断优先级。

图8.5 中断优先级设置

e.使能TIM3

配置完后要开启定时器,通过TIM3_CR1的CEN位来设置。在固件库里面使能定时器的函数是通过TIM_Cmd函数来实现的:

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

此时定时器3初始化函数为:

相关文档
最新文档