完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
定时器中断是我们单片机中比较常用的一个功能了,相信大家也都不陌生。在32单片机中,定时器分为基本定时器(TIM6,TIM7)、通用定时器(TIM2-5,TIM9-14)、高级定时器(TIM1,TIM8)。
在以上三种定时器中,基本定时器最为简单,类似于51的定时器,递增计数;通用定时器在基本定时器上多出了“输入捕获”与“输出比较”两类功能;而高级定时器则在通用定时器的基础上又增添了“可编程死区互补输出”、“重复计数”、“刹车(断路)功能”,主要应用于工业上的电机控制。 下面我们主要介绍通用定时器及其配置: 通用定时器可以测量输入信号的脉冲宽度(输入捕获)和生成输出波形(输出比较和PWM)。其主要包括自动重载计数器16/32位(CNT)和可编程预分频器(PSC),时间分辨率可在几us至几ms。 (1)16/32位自动重载计时器 对于自动重载计数器来说,只有TIM2与TIM5为32位,其他均为16位,可以进行递增、递减、中心对齐等方式进行计数(TIM9-14只支持递增计数) 对于递增与递减,这里不再赘述。我们主要来说一下中心对齐计数:所谓中心对齐计数即为从0开始递增至自动重载值-1,产生上溢事件,再由自动重载值递减至1,产生下溢事件,由此往复循环。 (2)四个独立通道(TIMx_CH1-4,其中TIM9-14只有两个独立通道) 独立通道主要用于输入捕获与PWM (3)发生如下事件时产生中断/DMA(TIM9-14不支持DMA功能) A.刷新事件,即产生上溢或下溢 B.触发事件 C.输入捕获 D.输出比较 对于定时器的时钟问题,可以参考中文参考手册,时钟CK_INT=APB1×2 (高级定时器的时钟在APB2总线上)。 配置步骤 1.使能时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //使能TIM4时钟 2.初始化参数(预分频、计数模式、重载值、时钟分频、重复计数(高级选用)) 其中per与psc为外部输入参数,分别表示自动重载值与预分频。 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //定义结构体变量 TIM_TimeBaseInitStructure.TIM_Period=per; //设置自动重装值,该值由外部输入 TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //设置定时器预分频 TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //设置时钟分频(这里为1分频) TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//设置计数模式(向上计数) TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure); 3.设置定时器中断类型,并使能 TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //使能中断 TIM_ClearITPendingBit(TIM4,TIM_IT_Update); //事先清除中断标志位 4.设置定时器中断优先级,使能中断通道 NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel=TIM4_IRQn; //设置中断优先级及使能 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2; NVIC_InitStruct.NVIC_IRQChannelSubPriority=3; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStruct); 5.开启定时器 TIM_Cmd(TIM4,ENABLE);//开启定时器 6.编写服务函数 在这里,我们只实现led的闪烁 void TIM4_IRQHandler(void)//中断服务程序 { if(TIM_GetITStatus(TIM4,TIM_IT_Update)) { led2=!led2; } TIM_ClearITPendingBit(TIM4,TIM_IT_Update); } 函数名可以查阅启动文件。 主函数为: #include “stm32f4xx.h” #include “led.h” #include “bit_operation.h” #include “Systick.h” #include “time.h” int main() { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); SysTick_Init(168); //系统时钟为168M RCC_HSE_Config(8,336,2,7); LED_Init(); TIM4_Init(5000-1,8400-1);//单次定时500ms while(1) { delay_nms(100); led1=!led1; } } 对于TIM4_Init中的参数进行如下解释: per=5000-1 psc=8400-1 psc:由于本例中APB1时钟为42M,所以TIM4时钟为其二倍频即84M,需进行8400分频来获得10K的频率。作为分频,psc在分母上,为了防止其为0,系统会进行自动+1,因此psc=8400-1即表示进行了8400分频。 per:由于时钟经过8400分频后变为了10K,所以单次计数为0.1ms,共计数5000次即可完成定时500ms。由于是由0开始计数,所以重载值为5000-1=4999时完成5000次计数。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试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 07:04 , Processed in 1.989374 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号