下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、STM32学习笔记(4):通用定时器基本定时功能1.STM32 的 Timer 简介STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定 时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的8个定时器。定时器计数器 分辨率计数器类型预分频系数产生DMA请求捕获/比 较通道互补 输出TIM1TIM816位向上,向下, 向上/向下1-65536 之间 的任意数可以4有TIM2TIM3TIM4TIM516位向上,向下,/ 向上向下1-65536 之间 的任意数可以4没有TIM6
2、TIM716位向上1-65536 之间 的任意数可以0没有其中TIM1和TIM8是能够产生3对PWM互补输出的高级定时器,常用于三相电机的驱动,时钟由APB2的输出产生。TIM2-TIM5是普通定时器,TIM6和TIM7 是基本定时器,其时钟由APB1输出产生。由于STM32的TIMER功能太复杂了,所以只能一点一点的学习。因此今天就从最简单的开始学习起,也就是TIM2 -TIM5 普通定时器的定时功能。2.普通定时器TIM2-TIM52.1时钟来源计数器时钟可以由下列时钟源提供:内部时钟(CK_INT)(TIx):外部输入脚1外部时钟模式.外部时钟模式2:外部触发输入(ETR)内部触发输入(
3、ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。由于今天的学习是最基本的定时功能,所以采用内部时钟。TIM2-TIM5的时钟不是直接来自于APB1,而是来自于输入为APB1的一个倍频器。这个倍频器的作用是:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其他数值时(即预分频系数为2、 4、8或16),这个倍频器起作用,定时器的时钟频率等于 APB1的频率的2倍。APB1的分频在STM32_SYSTICK的学习笔记中有详细描述。通过倍频器给定 时器时钟的好
4、处是:APB1不但要给TIM2-TIM5提供时钟,还要为其他的外设提供时钟;设置这个倍频器可以保证在其他外设使用较低时钟频率时,TIM2 -TIM5仍然可以得到较高的时钟频率。2.2计数器模式TIM2 -TIM5可以由向上计数、向下计数、向上向下双向计数。向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。在向下模式中,计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。而中央对齐模式(向上/向下计数)是计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事
5、件,然后向下计数到 1并且产生一个计数器溢出事件;然后再从0开始重新计数。2.3编程步骤1. 配置系统时钟;2. 配置 NVIC ;3. 配置 GPIO;4. 配置 TIMER ;其中,前3项在前面的笔记中已经给出,在此就不再赘述了。第 4项配置TIMER有如下配置:(1) 设置为默认缺省值;Timer函数将TIM_DeInit()禾U用(2) TIMnternalClockConfig()选择TIMx来设置内部时钟源;(3) TIM_Perscaler来设置预分频系数;(4) TIM_ClockDivision来设置时钟分割;(5) TIM_CounterMode来设置计数器模式;(6) T
6、IM_Period来设置自动装入的值(7) TIM_ARRPerloadConfig()来设置是否使用预装载缓冲器(8) TIM_ITConfig()来开启 TIMx 的中断其中(3)-(6)步骤中的参数由TIM_TimerBaseInitTypeDef结构体给出。步骤(3)中的预分频系数用来确定 TIMx所使用的时钟频率,具体计算方法为:CK_INT/(TIM_Perscaler+1)。CK_INT是内部时钟源的频率,是根据 2.1中所描述的APB1的倍频器送出的时钟,TIM_Perscaler是用户设定的预分频系数,其值 范围是从0 - 65535步骤(4)中的时钟分割定义的是在定时器时钟
7、频率(CK_INT)与数字滤波器(ETR,TIx)使用的采样频率之间的分频比例。TIM_ClockDivision的参数如下表:TIM_ClockDivision描述二进制值OxOOTIM_CKD_DIV1 tDTS = Tck_tim0x01 TIM_CKD_DIV2tDTS = 2 *Tck_tim0x10TIM_CKD_DIV4 tDTS = 4 * Tck_tim数字滤波器(ETR,TIx)是为了将ETR进来的分频后的信号滤波,保证通过信号频率不超过某个限定。步骤(7)中需要禁止使用预装载缓冲器。当预装载缓冲器被禁止时,写入自动装入的值(TIMx_ARR)的数值会直接传送到对应的影子寄
8、存器;如果使能预加载寄存器,则写入ARR的数值会在更新事件时,才会从预加载寄存器传送到对应的影子寄存器。ARM中,有的逻辑寄存器在物理上对应 2个寄存器,一个是程序员可以写入或读出的寄存器,称为 preload register预装载寄存器),另一个是程序员看不见的、 但在操作中真正起作用的寄存器,称为 shadow register影子寄存器);设计preload register® shadow registe啲好处是,所有真正需要起作用的寄存器(shadow register)可以在同一个时间(发生更新事件时)被更新为所对应shadow和preload register或者,s
9、hadow register如果没有这样可以保证多个通道的操作能够准确地同步。的内容,preload registe啲.register是直通的,即软件更新preload register时,同时更新了 shadow registe,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时 序不能同步,如果再加上其它因素(例如中断),多个通道的时序关系有可能是不可预知的。3程序源代码本例实现的是通过TIM2的定时功能,使得LED灯按照1s的时间间隔来闪烁#in clude stm32f10x_lib.hvoid RCC_cfg();void TIMER_cfg();void NV
10、IC_cfg();void GPIO_cfg();int mai n()RCC_cfg();NVIC_cfg();GPIO_cfg();TIMER_cfg();/开启定时器 2TIM_Cmd(TIM2,ENABLE);while(1);void RCC_cfg()/定义错误状态变量ErrorStatus HSEStartUpStatus;/将 RCC 寄存器重新设置为默认值RCC_DeInit();/打开外部高速时钟晶振 RCC_HSEConfig(RCC_HSE_ON); /等待外部高速时钟晶振工作HSEStartUpStatus = RCC_WaitForHSEStartUp();if(H
11、SEStartUpStatus = SUCCESS)/ 设置 AHB 时钟 (HCLK) 为系统时钟 RCC_HCLKConfig(RCC_SYSCLK_Div1);/ 设置高速 AHB 时钟 (APB2) 为 HCLK 时钟 RCC_PCLK2Config(RCC_HCLK_Div1);分频 2 的 HCLK 为 (APB1) 时钟 AHB 设置低速 /RCC_PCLK1Config(RCC_HCLK_Div2);/ 设置 FLASH 代码延时 FLASH_SetLatency(FLASH_Latency_2);/使能预取指缓存 FLASH_PrefetchBufferCmd(FLASH_P
12、refetchBuffer_Enable);/设置PLL时钟,为HSE的9倍频 8MHz * 9 = 72MHzRCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/使能 PLLRCC_PLLCmd(ENABLE);/等待 PLL 准备就绪while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET);/设置 PLL 为系统时钟源RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/判断 PLL 是否是系统时钟 while(RCC_GetSYSCLKSource() != 0
13、x08);/允许 TIM2 的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);允许GPIO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); void TIMER_cfg()TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;/重新将 Timer 设置为缺省值TIM_DeInit(TIM2);/采用内部时钟给 TIM2 提供时钟源TIM_InternalClockConfig(TIM2);/预分频系数为 36000-1,这样计数器时钟为
14、72MHz/36000 = 2kHzTIM_TimeBaseStructure.TIM_Prescaler = 36000- 1;/设置时钟分割TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; /设置计数器模式为向上计数模式TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;/设置计数溢出大小,每计 2000 个数就产生一个更新事件TIM_TimeBaseStructure.TIM_Period = 2000 - 1;中 TIM2 将配置应用到 /TIM_TimeBa
15、seInit(TIM2,&TIM_TimeBaseStructure);/清除溢出中断标志TIM_ClearFlag(TIM2, TIM_FLAG_Update);/禁止 ARR 预装载缓冲器TIM_ARRPreloadConfig(TIM2, DISABLE);/开启 TIM2 的中断TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);void NVIC_cfg()NVIC_InitTypeDef NVIC_InitStructure;/选择中断分组 1NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/选择 T
16、IM2 的中断通道NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;/抢占式中断优先级设置为 0NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;0 响应式中断优先级设置为 /NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;/使能中断NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);void GPIO_cfg()
17、GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;/选择引脚 5GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /输/ 出频率最大 50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /带上拉电阻输出 GPIO_Init(GPIOB,&GPIO_InitStructure);在 stm32f10x_it.c 中,我们找到函数 TIM2_IRQHandler() ,并向其中添加代码void TIM2_IRQHandler(void)u8 ReadValue;检测是否发生溢出更新事件 /if(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 泳池安全协议书
- 泌尿外科肾结石治疗方案探讨
- 更年期综合征的综合治疗与护理方案
- 特殊教育发音训练
- 妇科肿瘤手术后康复训练方案培训
- 眼科护理查房流程
- 2026华侨城集团春季校园招聘备考题库及1套参考答案详解
- 重症医学科(ICU)意识障碍护理规范
- 2026北京大学房地产管理部招聘1名劳动合同制人员备考题库附答案详解(综合卷)
- 2026安徽安庆市皖宜项目咨询管理有限公司招聘派遣人员3人备考题库带答案详解(黄金题型)
- 纺织行业的纺织品生产技术培训资料
- 医院整形科室管理制度
- 高考生物解题技巧1-题干信息的分析技巧
- 涉氨制冷企业安全管理培训
- 3、4号锅炉引风机更换叶轮施工方案
- 大众标准目录(中文)
- 如何进行网络招聘和电话邀约讲义课件
- 连续性血液净化设备技术要求
- 行政法与行政诉讼法培训教案
- 译林版六年级下册英语单元课文填空
- 小学科学粤教粤科版六年级下册《第5课设计与制作:鸡蛋包装盒》课件
评论
0/150
提交评论