历史上的今天
返回首页

历史上的今天

今天是:2025年08月20日(星期三)

正在发生

2019年08月20日 | stm32之TIM-基本定时器应用实例(详细)

2019-08-20 来源:eefocus

开发环境:Window 7

开发工具:Keil uVision4

硬件:STM32F103VCT6

定时器最基本的功能就是定时处理事情。比如定时发送USART数据、定时采集AD数据、定时检测IO口电位、还可以通过IO口输出波形等。可以实现非常丰富的功能。


STM32系列的定时器分为基本定时器、通用定时器、高级控制定时器。后者包括前者的全部功能。所以先掌握基本定时器可以更好理解后面功能繁多的定时器。


通常地,STM32高级定时器TIM1、TIM8,通用定时器TIM2、TIM3、TIM4、TIM5,基本定时器TIM6、TIM7。


有用过STM32的话都知道,STM32所有的外设初始化都是使用标准库里的初始化结构体和初始化函数,下面先说一下IM_TimeBaseInitTypeDef structure 结构体成员的含义。


TIM_TimeBaseInitTypeDef 定义于文件“stm32f10x_tim.h”:


typedef struct 

u16 TIM_Period; 

u16 TIM_Prescaler; 

u8 TIM_ClockDivision; 

u16 TIM_CounterMode; 

u8 TIM_RepetitionCounter;

} TIM_TimeBaseInitTypeDef;

TIM_Period:定时器周期,当计数寄存器的值递增到等于该值时,将相关事件标志位置位。范围0~65535。

TIM_Prescaler:定时器预分频设置。时钟源经该预分频器才是定时器时钟。范围0~65535。

TIM_ClockDivision:时钟分频。基本定时器没有这个功能,无需设置。

TIM_CounterMode:定时器计数方式设置。基本定时器只能向上计数,无需设置。

TIM_RepetitionCounter :重复计数器,基本定时器没有这个功能,无需设置。

虽然定时器初始化结构体有5个成员,但是对于基本定时器只需设置其中两个就可以了。下面是一个定时0.5s翻转IO口电平的例子。


循环定时时间的计算:基本定时器只有内部时钟72MHz,定时器的实际时钟=内部时钟/(定时器预分频+1),那么TIM_Prescaler设置为7200-1,内部时钟源经过定时器预分频后即可得到10kHz(72MHz/((7200-1)+1))的频率。然后TIM_Period设置为5000-1,(这里因为计数是从0开始的,所以要减1),即可以得到定时为0.5s(5000*(1/10kHz))的定时器。代码如下:


创建一个TIME_base.h

#ifndef __TIMER_BASE_H

#define __TIMER_BASE_H

#include "stm32f10x.h"

    void TIME_NVIC_Configuration(void);

    void TIME_Configuration(void);

    void GPIO_Config(void);

#endif

创建一个TIME_base.c

#include "TIME_base.h"

void TIME_NVIC_Configuration(void)//如果系统会产生多种中断,那么就存在中断响应的优先级

{

    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);           //设置优先级分组

    NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;           //指定IRQ通道

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //指定先占优先级

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //从优先级

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;          //定义的IRQ是被使能还是失能

    NVIC_Init(&NVIC_InitStructure);  

}

 

void TIME_Configuration(void)//配置TIM6

{

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); 

    TIM_TimeBaseStructure.TIM_Period = 5000; //设置了在下一个更新事件装入活动的自动重装载寄存器周期的值 范围是0x0000-0xFFFF

    TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //设置了用来作为 TIMx 时钟频率除数的预分频值

    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); 

    TIM_ITConfig(TIM6,TIM_IT_Update|TIM_IT_Trigger,ENABLE);//使能或者失能 TIM 的中断,详见附录图1

    TIM_Cmd(TIM6, ENABLE);  

}

 

void GPIO_Config(void)//配置一个IO口:

{

    /*定义一个GPIO_InitTypeDef类型的结构体*/

     GPIO_InitTypeDef GPIO_InitStructure;

    /*开启GPIOB的外设时钟*/

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    /*选择要控制的GPIOB引脚*/    

     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

    /*设置引脚模式为通用推挽输出*/

     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

    /*设置引脚速率为50MHz */   

     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

    /*调用库函数,初始化GPIOB*/

     GPIO_Init(GPIOB, &GPIO_InitStructure);

    /*PB.0 输出高*/

     GPIO_SetBits(GPIOB,GPIO_Pin_0);   

}

附录图1:


在stm32f10x_it.c添加定时器触发的中断处理函数:

void TIM6_IRQHandler(void)   

{

    if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)  //获取中断状态

    {

        TIM_ClearITPendingBit(TIM6, TIM_IT_Update  );  //清除中断标志

        //在这里做中断需要处理的事情,尽可能精简,避免过长时间停留在中断里面

        GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction)(1-(GPIO_ReadOutputDataBit(GPIOB,  GPIO_Pin_0))));

    }

 

}

创建一个main.c

#include "TIME_base.h"

int main(void)

{   

    /* IO端口配置 */ 

    GPIO_Config();

    /* TIM6 定时配置 */

    TIME_NVIC_Configuration();

    TIME_Configuration();

    while(1){

    }

}

将上面的TIM6全部换成TIM7也是可以的。


然后就可以把编译好的程序下载到开发板了,可以在PB.0引脚处接一个led,那么led就会每0.5s闪烁一次。


水平有限,仅供参考,错误以及不足之处还望多多指教。

推荐阅读

史海拾趣

雅特力(Artery)公司的发展小趣事

在发展过程中,雅特力积极寻求与其他企业的战略合作,以实现共赢发展。通过与上下游企业建立紧密的合作关系,雅特力不仅确保了供应链的稳定性和高效性,还获得了更多的技术支持和市场资源。同时,雅特力还注重与同行业企业的交流与合作,共同推动电子行业的进步与发展。这些战略合作不仅增强了雅特力的综合实力和市场竞争力,也为整个电子行业的繁荣做出了积极贡献。

综上所述,雅特力公司通过技术创新、全球市场布局、企业社会责任、人才培养和战略合作等多个方面的努力,实现了从初创企业到行业领军者的华丽转身。这些故事不仅展现了雅特力的发展历程和成就,也揭示了其在电子行业中的重要地位和影响力。

Headland Technology Product Group公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的基石。HBControls深知这一点,因此始终将品质管理放在首位。公司建立了完善的质量管理体系,从原材料采购、生产加工到成品检验,每一个环节都严格把关。此外,HBControls还定期对员工进行质量意识培训,确保每一位员工都能将品质理念融入到日常工作中。正是凭借卓越的产品质量和优质的服务,HBControls赢得了众多客户的信赖和好评。

Amphenol Thermometrics公司的发展小趣事

随着全球经济的一体化,HBControls开始实施全球化战略,以拓展更广阔的市场空间。公司首先在欧洲设立了分支机构,随后又在美国、亚洲等地建立了销售网络。通过参加国际展会、与当地企业建立合作关系等方式,HBControls的产品逐渐走向全球。同时,公司还积极引进国际先进的管理理念和技术,不断提升自身的综合竞争力。全球化战略的实施为HBControls带来了更多的市场机遇和发展空间。

Dean Technology公司的发展小趣事

近年来,随着电子行业的快速发展和市场竞争的加剧,Dean Technology公司也面临着前所未有的挑战。为了应对这些挑战,公司积极调整战略方向,加强内部管理和团队建设。同时,他们还密切关注行业趋势和市场需求的变化,及时调整产品结构和市场策略。这些努力使得Dean Technology在应对行业变革和挑战时更加从容和自信。

请注意,以上故事是基于对Dean Technology公司一般情况的了解而编写的,可能不完全符合公司的实际发展历程。如需更详细的信息,请查阅相关资料或联系公司官方渠道。

Baumer Electric Ag公司的发展小趣事

1966年,Baumer Electric Ag完成了从个体企业向股份公司的转型。同年,公司推出了测量开关和控制开关,这一创新产品为公司的成功发展奠定了坚实基础。股份制改革为公司带来了更多的资金和资源支持,加速了产品研发和市场推广的进程。

Dau Semiconductor Inc公司的发展小趣事

在成立初期,Dau Semiconductor Inc公司面临着诸多技术挑战。其中,如何实现芯片的低功耗设计是困扰公司发展的一个难题。为了解决这个问题,公司投入大量研发资源,不断探索新的技术和材料。经过数年的努力,公司终于成功突破了技术瓶颈,研发出了一款具有超低功耗的半导体芯片。这款芯片的推出,不仅为公司赢得了市场认可,也为公司在行业中树立了技术领先的形象。

问答坊 | AI 解惑

求助

我是一个新手,请教一下Quartus.II.v6.0怎么安装?…

查看全部问答>

散热风扇的电路原理图

来源:ouravr qilin3 花了80块左右,从一个产品中抄出来的电路。效果很好。贴上来大家一起讨论下原理。 这个电路正常使用完全没问题,随着温度的升高,风扇转速越快,加在风扇上的电压越大,风扇满速时压降只有0.1-0.2V左右。 难以置信的小。 ...…

查看全部问答>

有了板卡的基地址 做个程序怎样初始化主板?

各位帮帮忙  我用的是pc104的板卡   确切型号为pc680   上面还用了1块pm518的控制卡,想做个控制方面的软件 但是发现程学设计时不会初始化主板 哪位能给出点主意 最好能给点程序  在这里先谢谢了…

查看全部问答>

诸如dm9000网卡芯片,怎么设置寄存器可以收到自己发送的数据包?

曾今也看过网络编程,发现只要往127.0.0.1发送,就能够本机收到,或者直接发数据包给自己的IP地址,也是能够接收。我自己做了一块网卡,然后自己也开发了简单的TCP/IP协议栈,数据包的收发已经做完了,两台网络上的机器对法都能收到。二现在我想给 ...…

查看全部问答>

‘*’和‘#’有对应的虚拟键码么?

在做输入法,windows CE5.0环境下,4X5键盘输入,请教‘*’和‘#’有对应的虚拟键码么?因为输入法要按‘*’来切换输入法。…

查看全部问答>

wince 驱动开发教程!!!

谁有这方面的教程,,网上好像太少了,就一个幻灯片教程,在n多个网站上传,没其它的了吗?…

查看全部问答>

stm8问题

请教一下  我在使用stm8s103k3芯片的时候定义了一个数组后提示:   #error clnk Debug adiogram.lkf:1 segment .bss size overflow (1)  我看了一下内存我才用300字节 ...…

查看全部问答>

大家一起来研究最新的6854驱动库吧!

最近上luminary的官方网站才发现更新了最新的驱动库!驱动库里面的资源相当之丰富!但是还是有一些东西不知道是做什么用的!感慨TI的技术支持太强大了!我觉得驱动库里面的例程都是非常有价值的例程值得好好去研究!   除此之外,驱动库 ...…

查看全部问答>

全国大学生电子竞赛 NEC单片机UPD78F1166 用户指南

本帖最后由 paulhyde 于 2014-9-15 09:13 编辑 很多人说找不到瑞萨(原NEC)的用户指南,共966页,5.40MB 包含以下单片机78K0R/KG316-bit Single-Chip MicrocontrollersμPD78F1162, 78F1162A, 78F1162A(A)μPD78F1163, 78F1163A, 78F1163A(A)μP ...…

查看全部问答>

提问+ 滤波器用途

本帖最后由 dontium 于 2015-1-23 11:43 编辑 有源滤波器和无源滤波器相比有什么优点呢?两者分别用在什么地方?有什么限制吗(比如说某个电路可能用有源的滤波会好点)? …

查看全部问答>