完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
三种定时器
定时器的时基 计数器寄存器(TIMx_CNT)、预分频器寄存器(TIMx_PSC)、自动转载寄存器(TIMx_ARR)。可通过配置这三个寄存器可配置计数周期。 参考stm32中文手册 1.CNT_EN在TIMx_CR1寄存器 的最低位当高电平时将定时器使能。 2.预分频寄存器(TIMx_PSC)。该寄存器用设置对时钟进行分频,然后提供给计数器,作为计数器的时钟。 这里的 CK_INT时钟是从 APB1 倍频的来的,除非 APB1 的时钟分频数设置为 1,否则通用定时器 TIMx 的时钟是 APB1 时钟的 2 倍。 3.状态寄存器(TIMx_SR)。该寄存器用来标记当前与定时器相关的各种事件/中断是否发生。置1时代表发生 4.自动重装载寄存器(TIMx_ARR),该寄存器在物理上实际对应着 2 个寄存器。一个是程序员可以直接操作的,另外一个是程序员看不到的,这个看不到的寄存器在《STM32参考手册》里面被叫做影子寄存器。事实上真正起作用的是影子寄存器。根据 TIMx_CR1 寄存器中 APRE 位的设置:APRE=0 时,预装载寄存器的内容可以随时传送到影子寄存器,此时 2者是连通的;而 APRE=1 时,在每一次更新事件(UEV)时,才把预装在寄存器的内容传送到影子寄存器。 5.计算公式 时钟频率公式:CK_CNT = fCK_PSC/(PSC[15:0]+1) (在默认情况下fCK_PSC为72MHz,AHB时钟=72M,APB1时钟=3M,所以APB1的分频系数=AHB/APB1=2,所以,通用定时器时钟CK_INT=36M2=72M) 时间公式:T = (PSC[15:0]+1)( ARR[15:0]+1)/ fCK_PSC 例如,ARR[15:0]值为 5,则定时时长为6 * (1/CK_CNT) 通用定时器功能特点描述 STM3 的通用TIMx (TIM2、TIM3、TIM4和TIM5)定 时器功能特点包括:位于低速的APB1总线上(APB1) 16位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx CNT)。16位可编程(可以实时修改)预分频器(TIMx_ PSC),计数器时钟频率的分频系数为1~65535之间的任意数值。 4个独立通道(TIMx CH1~4),这些通道可以用来作为: ①输入捕获 ②输出比较 ③PWM生成(边缘或中间对齐模式) ④单脉冲模式输出 以下事件发生时产生中断 ①更新事件:计数器向上溢出向下溢出,计数器初始化(通过软件或者内部/外部触发) ②触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ③输入捕获 ④输出比较 STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。 使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32的每个通用定时器都是完全独立的,没有互相共享的任何资源。 计数器模式 通用定时器可以向上计数、向下计数、向上向下双向计数模式。 ①向上计数模式:计数器从0计数到自动加载值(TIMx _ARR),然后重新从0开始计数并且产生一个计数器溢出事件。 ②向下计数模式:计数器从自动装入的值(TIMx ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生个计数器向下溢出事件。 ③中央对齐模式(向上/向下计数) :计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生个计数器溢出事件:然后再从0开始重新计数。 代码配置 1.使能定时器时钟 RCC_APB1PeriphClockCmd() 2.初始化定时器配置,arr,psc TIM_TimeBaseInitStrue.TIM_Period TIM_TimeBaseInitStrue.TIM_Prescaler TIM_TimeBaseInitStrue.TIM_CounterMode TIM_TimeBaseInitStrue.TIM_ClockDivision 3.开启定时器中断,配置NVIC TIM_ITConfig() NVIC_InitStructure.NVIC_IRQChannel NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority NVIC_InitStructure.NVIC_IRQChannelSubPriority NVIC_InitStructure.NVIC_IRQChannelCmd 4.使能定时器 TIM_Cmd() 5.编写中断服务函数 void TIM3_Int_Iint(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器时钟 TIM_TimeBaseInitStrue.TIM_Period=arr;//自动装载值 TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //预分频系数 TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;//向上计数 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);//初始化 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//开启定时器中断 更新中断当计数溢出时进入中断,更新指的是更新计数器的值,中断是指更新数值的时候会进入中断 NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置NVIC中断分组2,其中2位抢占优先级,2位响应优先级 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//响应优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能 NVIC_Init(&NVIC_InitStructure);//初始化NVIC TIM_Cmd(TIM3,ENABLE);//使能定时器 } void TIM3_IRQHandler(void)//服务函数 { if (TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)//判断是否中断 { LED1_Toggle;//控制led反转 LED2_Toggle; TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除中断 } } 注意: 1.通用定时器在APB1里面,高级定时器在APB2里面 2.根据时间公式,当我们设置一个100ms时,例如应设置arr=999,psc=7199;因为72M/(7199+1)=10KHz为0.1ms,时间=(999+1)*0.1=100ms;arr和psc都是16位 应设置在1~65535; 3.可在服务函数里编写自己想要的功能 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 03:20 , Processed in 0.798661 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号