当前位置:首页 > 单片机 > 单片机
[导读]注:本文实践用到的芯片是cortex-m3系列的STM32F103VET6,文中涉及内容覆盖整个STM32F1系列M3单片机。本文适合学习STM32的初学者阅读。STM32定时器包含基本定时器、通用定时器和高级定时器,其中TIM6和TIM7是STM32当

注:本文实践用到的芯片是cortex-m3系列的STM32F103VET6,文中涉及内容覆盖整个STM32F1系列M3单片机。

本文适合学习STM32的初学者阅读。

STM32定时器包含基本定时器、通用定时器和高级定时器,其中TIM6和TIM7是STM32当中的基本定时器,作为初学者,先从最基本的学起最容易,下面我们用这个定时器实现毫秒延时函数来入门STM32定时器的应用。

学习单片机,就是学习使用它的寄存器。即便你用库函数,寄存器也是必须要学习的。

TIM6 TIM7的寄存器如下所示:

先略览一下寄存器,CR1和CR1是控制寄存器,SR是状态寄存器,ARR就是溢出值寄存器,CNT就是计数器的当前值,PSC是预分频寄存器。预分频寄存器?听的傻眼了吧,前面几个个寄存器听的还能理解,一听到预分频寄存器,好像不知道是干嘛用的。瑞生来给你解释一下吧,你可以给预分频寄存器里面写一个从0~65535的值,这个值+1,就是定时器运行的时钟。举个例子,比如单片机工作在主频72MHz,预分频寄存器写0,预分频系数就是0+1=1,定时器的时钟就是72MHz/1=72MHz;再举个例子,比如单片机还是工作在主频72MHz,预分频寄存器写71,预分频系数就是71+1=72,定时器的时钟就是72MHz/72=1MHz。知道定时器的时钟有什么用?相信很多初学者不清楚,定时器的时钟关乎定时器计数器CNT递增的时间间隔,根据频率和周期的公式f=1/T,定时器计数器递增的时间间隔就是1/定时器的时钟,例如当定时器时钟为1MHz时,定时器计数器递增的时间间隔就是1/1MHz=1微秒,这时,如果你把溢出值设置为1000,就是1000*1us=1ms溢出。

1.直接操作寄存器

下面,我们先用直接操作寄存器的方式,写一个毫秒延时函数:

voiddelay_ms(uint16_tms){TIM6->PSC=35999;TIM6->ARR=ms*2;TIM6->CR1|=(1<<3);TIM6->CR1|=0x1;while((TIM6->SR&0X1)==0);TIM6->SR=0;}

第一条语句,设置预分频系数为35999+1=36000,所以定时器的时钟为72000000/36000=2000Hz,那么定时时间间隔就是1/2000=0.0005秒,即0.5毫秒。

第二条语句,设置溢出值为ms乘以2,假如要延时1秒,函数的参数ms就是1000,溢出值就是1000*2=2000,2000*0.5毫秒=1000毫秒,即1秒。这时候,有人会说,为什么不干脆把预分频值PSC设置为71999,即预分频系数为72000,定时器的时钟就是72000000/72000=1000Hz,定时时间就是1毫秒,那么直接把函数的参数ms给了溢出值寄存器ARR就可以了,就不必乘以2了。想法是可以,但是你得知道,定时器都是16位的,所以PSC的值最大到65535,到不了71999。这下你明白了吧?

第三条语句,CR1寄存器bit3写1,由寄存器定义得知,这是把定时器设置为一旦发生溢出,就停止定时器,因为我们做的是延时函数,延时到了以后,就没有必要让定时器再不断递增了,所以要这样设置。

第四条语句,CR1寄存器bit0写1,打开定时器,定时器计数器开始从0递增。

第五条语句,检测状态寄存器SR中的bit0UIF是否置1,置1的时候,定时值就达到溢出值了,说明定时时间到了。

第六条语句,清除状态寄存器SR中刚才溢出造成的UIF位。

2.使用库函数

下面,我们看看怎么使用库函数实现毫秒延时函数:

voidTIM6_Delay_ms(uint16_tms){/*定义一个定时器基本定时初始化结构体变量*/TIM_TimeBaseInitTypeDefTIM_TimeBaseInitStruct;/*时钟预分频数为36000,在主频72M时,计数器每500us加1*/TIM_TimeBaseInitStruct.TIM_Prescaler=35999;/*自动重装载寄存器值*/TIM_TimeBaseInitStruct.TIM_Period=ms*2;/*把上面的值配置到寄存器*/TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStruct);/*设置定时时间到了以后停止定时器计数*/TIM_SelectOnePulseMode(TIM6,TIM_OPMode_Single);/*清除SR中的UIF标志*/TIM_ClearFlag(TIM6,TIM_IT_Update);/*打开定时器6*/TIM_Cmd(TIM6,ENABLE);/*检测定时时间是否到来*/while(TIM_GetFlagStatus(TIM6,TIM_IT_Update)==RESET);/*软件清除更新标志*/TIM_ClearFlag(TIM6,TIM_IT_Update);}

你可以细细观察一下上面的库函数,实际上,和直接操作寄存器是一样的。比如说,我们看打开定时器的库函数TIM_Cmd(TIM6,ENABLE),我们打开这个函数,如下所示:

voidTIM_Cmd(TIM_TypeDef*TIMx,FunctionalStateNewState){/*Checktheparameters*/assert_param(IS_TIM_ALL_PERIPH(TIMx));assert_param(IS_FUNCTIONAL_STATE(NewState));if(NewState!=DISABLE){/*EnabletheTIMCounter*/TIMx->CR1|=TIM_CR1_CEN;}else{/*DisabletheTIMCounter*/TIMx->CR1&=(uint16_t)(~((uint16_t)TIM_CR1_CEN));}}

把参数TIM6和ENABLE带进去,你会发现,实际上,就是我们直接操作寄存器的TIM6->CR1|=0X1。

其它的库函数,你可以自己打开研究一下。

另外,库函数和我们直接操作寄存器有个不同的地方,就是TIM_TimeBaseInit()这个函数中的最后一条语句,它给TIMx->EGR寄存器的bit0写了1,使得SR中的bit0UIF置1,所以在执行完TIM_TimeBaseInit()这个函数之后,我们后面用TIM_ClearFlag(TIM6, TIM_IT_Update);函数把UIF清0,要不然的话,你在后面会直接检测到UIF置1,但是,这个置1不是溢出产生的,而是刚才给EGR写1产生的,就达不到延时的效果了。

总结,在使用以上两个延时函数的时候,记得先允许TIM6外设,即给APB1ENR寄存器的bit4写1。或者直接用库函数RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6 , ENABLE)。从上面库函数和直接操作寄存器的延时函数,你可以看出,使用库函数,即使不用注释,也可以看出来你是在干嘛,而直接操作寄存器,就看不出来了。在实际使用中,没必要纠结库函数和直接操作寄存器的选择,我就喜欢一会用库函数,一会儿直接操作寄存器,你想咋地?不过,公司的老板肯定是希望使用库函数,因为如果你辞职了,接替你的人看到一堆操作寄存器的代码,让他情何以堪?


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭