历史上的今天
返回首页

历史上的今天

今天是:2025年03月04日(星期二)

正在发生

2020年03月04日 | 【STM库应用】stm32 之 TIM (详解一 通用定时器)

2020-03-04 来源:eefocus

定时器,中断这两样东西是学习一个MCU必须掌握的,也是非常有用的!


STM32的TIM一般有高级定时器TIM1,(TIM8只有在互联性产品有),普通定时器TIM2,TIM3,TIM4,(TIM5,TIM6,TIM7有点设备中没有);今天就只介绍普通定时器,因为高级定时器我还不会!每一个普通定时器都有4路通道!

我们先看看这个逻辑图吧!我们今天先讨论讨论定时器的问题!我用红色笔标过的路线就是定时器的工作路线,时钟有内部时钟产生,到PSC哪里进行分频处理,然后CNT进行计数,上面还有一个自动重装载寄存器APP。

这个是分频器的工作原理,我们可以看,分频器设定之前分频系数为1[1],后面的[2][3][4]分频系数为2,分频系数改变后,计数周期也跟着改变了;同时预分频设置生效时,他还会产生一个中断信号,这个中断信号不要管他,一个系统时钟周期后会自动消失,跟I2C的差不多!

这个是计数过程,上面说过了,计数跟分频后的周期有关;当计数达到装载的数值之后,系统会产生一个三个信号,其中溢出信号和更新事件一个时钟周期后会自动消失,而这时候触发了更新中断标志位UIF,我们可以用这个UPDATE来做定时器的中断标志信号!


TIM_ITConfig(TIM2, TIM_IT_UPDATE, ENABLE);


另外还有4个中断,我们知道PWM的产生把,他就跟PWM的产生有着血缘关系!

如果我们在OC模式选择的时候,TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;选择了Timing那么我们就可以做定时器了。


有时候我们会发现当UPdate中断信号产生时,其他四个中断信号也产生,什么原因呢?因为我们在设置tim.TIM_Period = period;时,period时间太短,就错觉的以为他们是一群产生中断信号的!来我们分析下:


假设分频因子为71,即72分频,PCLK为72M,我们设置的周期为1000;那么我们产生定时器的Upddate信号频率为1000Hz,周期为1ms,假设我们这里设置的CCR1 = 100;CCR2 = 500;CCR3 = 600;CCR4 = 900;


那么update信号产生后0.1ms产生CCR1的中断信号,0.5ms后产生CCR2的中断信号,0.6ms后产生CCR3的中断信号,这些中断标志位是:


#define TIM_FLAG_Update                    ((uint16_t)0x0001)

#define TIM_FLAG_CC1                       ((uint16_t)0x0002)

#define TIM_FLAG_CC2                       ((uint16_t)0x0004)

#define TIM_FLAG_CC3                       ((uint16_t)0x0008)

#define TIM_FLAG_CC4                       ((uint16_t)0x0010)

#define TIM_FLAG_COM                       ((uint16_t)0x0020)

#define TIM_FLAG_Trigger                   ((uint16_t)0x0040)

#define TIM_FLAG_Break                     ((uint16_t)0x0080)

#define TIM_FLAG_CC1OF                     ((uint16_t)0x0200)

#define TIM_FLAG_CC2OF                     ((uint16_t)0x0400)

#define TIM_FLAG_CC3OF                     ((uint16_t)0x0800)

#define TIM_FLAG_CC4OF                     ((uint16_t)0x1000)


[OF为溢出]后面做研究!


对于这些CCR1在定时方面的应用我还没有想出什么好的点子,但是他确实存在,如果想验证的话,我们可以把周期设置长一点,比如设置为1s,然后通过设置CCR的值,来看看效果,呵呵,不过这是不容易实现的,因为CCRx 最大为0xffff = 65535跟72M比比,还能说什么?好吧,谁有什么好办法,可以跟我说下!


void tim_init(u32 period,u32 psc)

{

TIM_TimeBaseInitTypeDef tim;

TIM_OCInitTypeDef  TIM_OCInitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

tim.TIM_Period = period;

  tim.TIM_Prescaler = psc;

  tim.TIM_ClockDivision = 0;

  tim.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, &tim);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OCInitStructure.TIM_Pulse = 1*period/4;

  TIM_OC2Init(TIM2, &TIM_OCInitStructure);

TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);

TIM_OCInitStructure.TIM_Pulse = 2*period/4;

  TIM_OC3Init(TIM2, &TIM_OCInitStructure);

TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);

TIM_OCInitStructure.TIM_Pulse = 3*period/4;

  TIM_OC4Init(TIM2, &TIM_OCInitStructure);

TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);

TIM_ITConfig(TIM2, TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4, ENABLE);

TIM_Cmd(TIM2,ENABLE);

 

  /* Enable the TIM2 global Interrupt */

  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

 

  NVIC_Init(&NVIC_InitStructure);

}


void TIM2_IRQHandler(void)

{

static u32 cc2 = 0,cc3 = 0,cc4 = 0,cc5 = 0;

static u8 flag2 = 0,flag3 = 0,flag4 = 0,flag5 = 0;

u32 capture;

if(TIM_GetFlagStatus(TIM2,TIM_FLAG_CC2) == SET)

{

cc2 ++;

if(cc2 > 1000)

{

flag2 = ~flag2;

if(flag2) led_on(4);

else led_off(4);

cc2 = 0;

}

TIM_ClearFlag(TIM2,TIM_FLAG_CC2);

capture = TIM_GetCapture2(TIM2);

    TIM_SetCompare2(TIM2, capture + 255);

}

if(TIM_GetFlagStatus(TIM2,TIM_FLAG_CC3) == SET)

{

cc3 ++;

if(cc3 > 1000)

{

flag3 = ~flag3;

if(flag3) led_on(5);

else led_off(5);

cc3 = 0;

}

TIM_ClearFlag(TIM2,TIM_FLAG_CC3);

capture = TIM_GetCapture3(TIM2);

    TIM_SetCompare3(TIM2, capture + 500);

}

if(TIM_GetFlagStatus(TIM2,TIM_FLAG_CC4) == SET)

{

cc4 ++;

if(cc4 > 1000)

{

flag4 = ~flag4;

if(flag4) led_on(6);

else led_off(6);

cc4 = 0;

}

TIM_ClearFlag(TIM2,TIM_FLAG_CC4);

capture = TIM_GetCapture4(TIM2);

    TIM_SetCompare4(TIM2, capture + 725);

}

if(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update) == SET)

{

cc5 ++;

if(cc5 > 1000)

{

flag5 = ~flag5;

if(flag5) led_on(7);

else led_off(7);

cc5 = 0;

}

TIM_ClearFlag(TIM2,TIM_FLAG_Update);

}

}

推荐阅读

史海拾趣

Accuride公司的发展小趣事

Accuride公司在市场拓展方面也取得了显著成果。其产品不仅供应给北美地区的商用车制造商,还远销至其他国家。同时,Accuride与多家知名汽车品牌建立了紧密的合作关系,如Freightliner、Peterbilt、International、Great Dane和Mack等,为其提供高品质的零部件。这些合作伙伴关系的建立,不仅提升了Accuride的市场地位,也为其带来了稳定的订单和收入来源。

Changzhou Galaxy Century Microelectronics Co.,Ltd公司的发展小趣事

在发展过程中,银河微电积极寻求与行业内外的合作伙伴建立战略合作关系。通过与晶通半导体(深圳)有限公司等企业的合作,银河微电在技术研发、市场拓展等方面取得了显著成效。这些战略合作不仅提升了公司的综合实力,还为公司的未来发展奠定了坚实的基础。

博众电气(BOZHONG ELECTRIC)公司的发展小趣事

随着市场需求的不断增长,博众电气意识到传统的生产方式已经无法满足客户的需求。为了提高生产效率和产品质量,公司决定引进自动化生产线。

在自动化生产线的建设过程中,博众电气投入了大量的人力和物力资源。公司引进了先进的自动化组装设备和检测设备,实现了产线90%以上的自动化生产。这不仅大大提高了生产效率,还降低了人力成本,使得博众电气在市场竞争中更具优势。

Cornell Dubilier公司的发展小趣事

在1936年至1962年期间,Cornell Dubilier公司在汉密尔顿工业园运营,专门制造电子零件和组件。然而,在这一时期,公司在生产过程中使用了含有多氯联苯(PCB)和其他有害物质的材料,并将其直接倾倒在现场土壤中。这一行为导致了严重的环境污染问题,使得该场地在后续被众多商业企业占据后,仍面临着环境保护的挑战。

Enova Technology Corp公司的发展小趣事

自2000年4月成立以来,Enova Technology Corporation(伊诺瓦科技)就以其卓越的技术创新能力在电子行业中崭露头角。公司总部位于台湾新竹科学工业园区,这里汇聚了众多高科技企业和研发机构,为伊诺瓦科技提供了丰富的技术资源和人才支持。

伊诺瓦科技专注于硬件加解密解决方案的研发与应用,其产品在军事单位、政府机关、财务金融机构等领域得到了广泛应用。其中,公司的X-WallSE产品凭借其独特的携带式电子钥匙(Security Key)技术,实现了硬盘的一对一加密,为用户提供了前所未有的数据安全保护。这一创新技术的推出,不仅提升了公司的市场竞争力,也为整个电子行业树立了新的技术标杆。

随着技术的不断发展,伊诺瓦科技不断推出更加先进的产品和解决方案。例如,公司的SecureNAS系列产品在网络硬盘服务器加解密应用方面提供了全新的解决方案,为用户提供了更加便捷、高效的数据安全保护。这些产品的推出,不仅进一步巩固了公司在电子行业的领先地位,也为公司的未来发展奠定了坚实的基础。

Churod Electronics Co Ltd公司的发展小趣事

为了保证产品质量和客户满意度,中汇瑞德一直将质量管理体系的建设放在重要位置。公司引入了国际先进的质量管理理念和方法,建立了完善的质量管理体系,并通过了多项国际认证。同时,公司还加强了对供应商的管理和评估,确保原材料的质量符合公司要求。这些措施有效地提高了产品的质量稳定性和可靠性,赢得了客户的信任和认可。

问答坊 | AI 解惑

手机使用中常遇的问题及解决办法~很实用哦~~

随着人们生活水平的提高和对通讯工具的需要,大部分人都选择用手机做自己最常用的沟通工具,工具多了自然问题也就多了,下面给大家介绍几种使用手机的过程中经常遇到的问题及解决办法。 1.如果手机万一被水淋湿,我们该采取何种保护措施? 在日常 ...…

查看全部问答>

基于ATmega16单片机的抢答器

基于ATmega16单片机的抢答器 …

查看全部问答>

vxworks下.a文件怎么转换成.o文件

makefile中首先用ccarm -c将一堆.cc文件编译出了一堆.o中间文件 然后又调用ararm将它们做成了一个.a文件 问题是,如何将这个.a文件转换成可以下载到板子上的.o文件呢?…

查看全部问答>

EVC下如何加载JPEG图片文件?

EVC下如何加载JPEG图片文件,并且控制图片定位,大小? 有没有相关的库?…

查看全部问答>

关于SCSI Miniport Driver的问题

这两天看了一些关于SCSI Miniport Driver方面的代码和资料,但是还是有一些不明白的地方, 比如当我写了一个Miniport Driver的时候,那Port Driver是如果来知道这个驱动的存在的吗? 另一个我在看破别人的程序的时候看不出Miniport Driver与特定的设 ...…

查看全部问答>

请问大家嵌入式开发和智能技术的关系

请问大家嵌入式开发和智能技术的关系?我对人工智能技术很感兴趣,目前是做web方面的程序开发,虽然只要做得好,哪里都可以拿高薪,但我更爱好智能技术,因此想转去做嵌入式开发,觉得那样似乎离智能更近一些。本人爱好研究算法和各种智能技术,觉 ...…

查看全部问答>

有关编写嵌入式类似驱动的程序

要为三星的44BoX的板子的usb和串口写不加载os时类似驱动的程序,(相当于提供一些底层硬件的接口)请问应该看哪方面的资料,以前驱动也没写过,能给一个大致的框架。底层的我只懂一点arm汇编,不知道够不够?好像大部分程序用C,嵌一点汇编就可以了 ...…

查看全部问答>

Using the infinite-gain, MFB filter topology in fully differential

本帖最后由 dontium 于 2015-1-23 13:38 编辑  Using the infinite-gain, MFB filter topology in fully differential active filters …

查看全部问答>

ADI DSP BF518开发板交换一块TI原装9B96开发板,开包的也行。

ADI DSP BF518开发板交换一块TI原装9B96开发板,开包的也行。 有意的请联系qq:307799870 板子上带有usb烧写接口。没有仿真器忙调即可。…

查看全部问答>