首页 STM32-基本定时器TIM6-TIM7基本定时功能

STM32-基本定时器TIM6-TIM7基本定时功能

举报
开通vip

STM32-基本定时器TIM6-TIM7基本定时功能1. STM32的Timer简介 STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的8个定时器。 定时器 计数器分辨率 计数器类型 预分频系数 产生DMA请求 捕获/比较通道 互补输出 TIM1 TIM8 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 有 TIM2 TIM3 ...

STM32-基本定时器TIM6-TIM7基本定时功能
1. STM32的Timer简介 STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的8个定时器。 定时器 计数器分辨率 计数器类型 预分频系数 产生DMA请求 捕获/比较通道 互补输出 TIM1 TIM8 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 有 TIM2 TIM3 TIM4 TIM5 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 没有 TIM6 TIM7 16位 向上 1-65536之间的任意数 可以 0 没有               其中TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生。TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。由于STM32的TIMER功能太复杂了,所以只能一点一点的学习。因此今天就从最简单的开始学习起,也就是TIM2-TIM5普通定时器的定时功能。 2基本定时器TIM6-TIM7 2.1 时钟基本特征 基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。 它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC) 提供时钟。实际上,它 们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。 这2个定时器是互相独立的,不共享任何资源。 2.2 TIM6-7主要特征 TIM6和TIM7定时器的主要功能包括: ● 16位自动重装载累加计数器 ● 16位可编程( 可实时修改)预分频器,用于对输入的时钟按系数为1~65536 之间的任意数值 分频 ● 触发DAC的同步电路 ● 在更新事件(计数器溢出)时产生中断/DMA 请求 图144 基本定时器框图 2.3 计数器模式 TIM6-TIM7可以由向上计数。向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。 2.4 TIM6-TIM7基本定时器的寄存器 1.TIM6和TIM7控制寄存器1(TIMx_CR1) ARPE :自动重装载预装载使能 (Auto-reload preload enable) 0:TIMx_ARR 寄存器没有缓冲 1:TIMx_ARR 寄存器具有缓 冲 URS:更新请求源 (Update request source) 该位由软件设置和清除,以选择UEV事件的请求源。 0:如果使能了中断或DMA,以下任一事件可以产生一个更新中断或DMA请求: - 计数器上溢或下溢 - 设置UG位 - 通过从模式控制器产生的更新 1:如果使能了中断或DMA,只有计数器上溢或下溢可以产生更新中断或DMA请求。 UDIS:禁止更新 (Update disable) 该位由软件设置和清除,以使能或禁止UEV事件的产生。 0:UEV使能。更新事件(UEV) 可以由下列事件产生: - 计数器上溢或下溢 - 设置UG位 - 通过从模式控制器产生的更新 产生更新事件后,带缓冲的寄存器被加载为预加载数值。 1 :禁止UEV。不产生更新事件(UEV) ,影子寄存器保持它的内容(ARR 、PSC)。但是如果设置 了UG位或从模式控制器产生了一个硬件复位,则计数器和预分频器将被重新初始化。 CEN:计数器使能 (Counter enable) 0:关闭计数器 1:使能计数器 2.TIM6和TIM7控制寄存器2(TIMx_CR2) 3. TIM6和TIM7 DMA/中断使能寄存器(TIMx_DIER) UDE:更新DMA请求使能 0:禁止更新DMA请求 1:使能更新DMA请求 UIE:更新中断使能 0:禁止更新中断 1:使能更新中断 4 . TIM6和TIM7状态寄存器(TIMx_SR) UIF:更新中断标志 (Update interrupt flag) 硬件在更新中断时设置该位,它由软件清除。 0:没有产生更新。 1:产生了更新中断。下述情况下由硬件设置该位: – 计数器产生上溢或下溢并且TIMx_CR1 中的UDIS=0; – 如果TIMx_CR1 中的URS=0并且UDIS=0,当使用TIMx_EGR 寄存器的UG位重新初始化计数器CNT时。 5. TIM6和TIM7事件产生寄存器(TIMx_EGR) UG:产生更新事件 (Update generation) 该位由软件设置,由硬件自动清除。 0:无作用 1 :重新初始化定时器的计数器并产生对寄存器的更新。注意:预分频器也被清除( 但预分频系数不变)。 6. TIM6和TIM7计数器(TIMx_CNT) CNT[15:0]:计数器数值 (Counter value) 7 .TIM6和TIM7预分频器(TIMx_PSC) PSC[15:0] :预分频器数值 (Prescaler value) 计数器的时钟频率CK_CNT 等于f CK_PSC/(PSC[15:0]+1) 。 在每一次更新事件时,PSC的数值被传送到实际的预分频寄存器中。 8 .TIM6和TIM7自动重装载寄存器(TIMx_ARR) ARR[15:0] :自动重装载数值 (Prescaler value) ARR的数值将传送到实际的自动重装载寄存器中。 如果自动重装载数值为0,则计数器停止。 2.5 编程步骤 1. 配置优先级; 2. 使能时钟 3. 配置GPIO; 4. 配置TIME; 5.使能计数器; 6.开中断; 7.清除标志位; 具体配置如下: (1) NVIC_Configuration(void);配置优先级 (2) void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)使能时钟 (3) void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);配置GPIO (4) TIM_Configuration (void);配置TIM6/TIM7 (5) TIM_Cmd(TIM7, ENABLE);使能定时器 (6) TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);使能中断 (7) TIM_ClearFlag(TIM7, TIM_FLAG_Update);清除标志位 步骤(4)中的预分频系数用来确定TIMx所使用的时钟频率,具体计算方法为:CK_INT/(TIM_Perscaler+1)。CK_INT是内部时钟源的频率,是根据2.1中所描述的APB1的倍频器送出的时钟,TIM_Perscaler是用户设定的预分频系数,其值范围是从0 – 65535。 步骤(4)中的时钟分割定义的是在定时器时钟频率(CK_INT)与数字滤波器(ETR,TIx)使用的采样频率之间的分频比例。TIM_ClockDivision的参数如下表: TIM_ClockDivision 描述 二进制值 TIM_CKD_DIV1 tDTS = Tck_tim 0x00 TIM_CKD_DIV2 tDTS = 2 * Tck_tim 0x01 TIM_CKD_DIV4 tDTS = 4 * Tck_tim 0x10       步骤(4)中需要禁止使用预装载缓冲器。当预装载缓冲器被禁止时,写入自动装入的值(TIMx_ARR)的数值会直接传送到对应的影子寄存器;如果使能预加载寄存器,则写入ARR的数值会在更新事件时,才会从预加载寄存器传送到对应的影子寄存器。 ARM中,有的逻辑寄存器在物理上对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器);设计preload register和shadow register的好处是,所有真正需要起作用的寄存器(shadow register)可以在同一个时间(发生更新事件时)被更新为所对应的preload register的内容,这样可以保证多个通道的操作能够准确地同步。如果没有shadow register,或者preload register和shadow register是直通的,即软件更新preload register时,同时更新了shadow register,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上其它因素(例如中断),多个通道的时序关系有可能是不可预知的。 3. 程序源代码 本例实现的是通过TIM7的定时功能,使得LED灯按照1s的时间间隔来闪烁 原理图: /* * 文件名: main.c * 内容简述: * 从0开始创建一个工程,通过按键1触发中断1实现灯1的闪亮 * 再通过按键2触发中断抢占 中断1实现小灯2的闪亮 * * 2个LED指示灯,对应的GPIO为 : PC3 PC1 * 输出为0点亮LED * 输出为1关闭LED * 2个按键 对应 PB7 PA11 */ #include "stm32f10x.h" /* 延时函数 */ void Delay(__IO uint32_t nCount) { //__IO 就是volatile,加上这个后可以避免延时函数被编译器优化掉 for(;nCount != 0; nCount--); } /* GPIO配置函数 */ void GPIO_Configuration(void) { /*定义2个结构体变量 */ GPIO_InitTypeDef GPIO_InitStructure; /*开启GPIOB,GPIOC ,复用口时钟的 时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE); /*给GPIO_InitStructure.GPIO_Pin GPIO_InitStructure.GPIO_Mode GPIO_InitStructure.GPIO_Speed付初始值*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // 将连接LED3的GPIO设置为推挽输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为10MHZ的速度 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //初始化GPIOC GPIO_Init(GPIOC, &GPIO_InitStructure); } /********配置优先级*****************/ void NVIC_Configuration(void) { //定义一个结构体 NVIC_InitTypeDef NVIC_InitStructure; //设置优先级组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0) ; //设置 TIM7线 NVIC_InitStructure.NVIC_IRQChannel =TIM7_IRQn; //使能优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //配置抢断优先级 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0; //配置响应优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; NVIC_Init(&NVIC_InitStructure); //设置存入寄存器 NVIC_SetVectorTable (NVIC_VectTab_FLASH ,0x0); } //*****定时器初始化********* void TIM_Configuration (void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // TIM_Cmd(TIM7, DISABLE); //预分频系数为36000-1,这样计数器时钟为72MHz/36000 = 2kHz TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1; //设置时钟分割 TIM_CKD_DIV1=0x0000,不分割 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置计数器模式为向上计数模式 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up ; //设置计数溢出大小,每计2000个数就产生一个更新事件 TIM_TimeBaseStructure.TIM_Period = 2000 - 1; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //将配置应用到TIM7中 TIM_TimeBaseInit(TIM7,&TIM_TimeBaseStructure); TIM_UpdateRequestConfig( TIM7, TIM_UpdateSource_Regular); //使能计数器 TIM_Cmd(TIM7, ENABLE); //使能中断 TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE); //清除标志位 // TIM_ClearFlag(TIM7, TIM_FLAG_Update); } //***************************** //主函数 int main(void) { /* 这个函数是ST库中的函数,函数实体在 Libraries\CMSIS\Core\CM3\system_stm32f10x.c 配置内部Flash接口,初始化PLL,配置系统时钟的频率 系统时钟缺省配置为72MHz */ GPIO_Configuration (); NVIC_Configuration (); TIM_Configuration (); while(1) { } }
本文档为【STM32-基本定时器TIM6-TIM7基本定时功能】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_995397
暂无简介~
格式:doc
大小:38KB
软件:Word
页数:0
分类:互联网
上传时间:2019-07-22
浏览量:41