stm32之TIM-基本定时器应用实例(详细)

发布者:和谐共融最新更新时间:2019-08-20 来源: eefocus关键字:stm32  TIM  基本定时器 手机看文章 扫描二维码
随时随地手机看文章

开发环境: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闪烁一次。


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

关键字:stm32  TIM  基本定时器 引用地址:stm32之TIM-基本定时器应用实例(详细)

上一篇:stm32之TIM-高级定时器应用实例一(详细)
下一篇:stm32之ADC应用实例(单通道、多通道、基于DMA)

推荐阅读最新更新时间:2024-11-04 13:12

STM32 定时器计数器 更新事件
向上计数模式 在向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始计数并且产生一个计数器溢出事件。 如果使用了重复计数器功能,在向上计数达到设置的重复计数次数(TIMx_RCR)时,产生更新事件(UEV);否则每次计数器溢出时才产生更新事件。 这样很容易误解 应该是否则每次计数器溢出时都产生更新事件,即不使用重复重复计数功能每次溢出都产生更新事件。 产生更新事件方式 1.设置了TIMx_CR1寄存器中的URS位(选择更新请求),在TIMx_EGR寄存器中(通过软件方式或者使用从模式控制器)设置UG位将产生一个更新事件UEV,但硬件不设置UIF标志(即不产生中断或DMA请求)
[单片机]
STM32的简单的SD卡读写
SD卡一般支持两种读写模式,SPI和SDIO模式,SD卡的引脚排序如下图所示。 SPI模式下有几个重要的操作命令,分别是: SD卡R1回应的格式如下 SPI模式下的典型初始化过程如下: 1、初始化硬件配置,SPI配置,IO配置等。 2、上电延时。( 74CLK) 3、复位卡。(CMD0) 4、激活卡,内部初始化并获取卡的类型。 5、查询OCR,获取供电情况。 6、是否使用CRC(CMD59)。 7、设置读写块数据长度(CMD16)。 8、读取CSD,获取存储卡的其他信息(CMD9) 9、发送8CLK后,禁止片选。 SPI模式下的典型读取数据的过程如下,这里采用CMD17来实现。 1、发送CMD17。 2、接收
[单片机]
<font color='red'>STM32</font>的简单的SD卡读写
STM32_MDK_bxCAN
今天整理下CAN方面的资料,首先使用的是stm32f103vet6,只有一个CAN(2.0A & 2.0B)。CAN本身是工作的数据链路层的总线,有很多优势就不再一一介绍了,随便买本书看看都有。 基础的CAN的知识就不赘述了,这些是必要的可以自己去买书了解,现在来看下STM32下对CAN的驱动,STM32本身包括了CAN的数据链路层,然后物理层就是CAN收发器用的是TJA1050,是非容错CAN。终端电阻用120欧姆。 说道CAN最主要的是CAN的初始化,他包括两个主要的部分,一个是基本属性的声明,另一部分就是过滤器的设置。见如下代码: /*******************************************
[单片机]
关于stm32 的 USB 转串口 virtual_Com_Port的例程的一些问题
当从虚拟串口到真实串口发数据时,没有错误,但发送一个稍微大一点的文件时(如1M),误码率很高。不知是为什么? 其中: int main(void) { #ifdef DEBUG debug(); #endif Set_System(); Set_USBClock(); USB_Interrupts_Config(); USB_Init(); while (1) { if (count_out != 0) { USB_To_USART_Send_Data(&buffer_out , count_out);//这句是发数据的函数,原型如下。 count_out = 0;
[单片机]
STM32开发笔记56: STM32F407VGT6的解释
单片机型号:STM32F407VGT6 本文档介绍STM32F407VGT6型号的具体解释,如下图所示。 具体解释:STM32,gerneral purpose,以太网接口,100引脚,1024K Flash空间,LQFP封装,-40到85摄氏度。
[单片机]
<font color='red'>STM32</font>开发笔记56: STM32F407VGT6的解释
基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)
USB设备能否工作,枚举步骤,用“乡村爱情”里的话说,“必须的!”,网上也有很多资料,圈圈就提供了一份详细的枚举过程,但对STM32是怎么响应的没有说明,一会详细道来,先上圈圈的提供的那个枚举图示,希望圈圈支持,如果不妥,请与我联系,谢谢。 我将此转换成了PDF文件,方便查看。 首先说明一个变量,定义在usb_core.c中: volatile DEVICE_INFO vsDeviceInfo; 看意思就知道他的作用了,DEVICE_INFO是个结构,定义在usb_type.h中: // ********************************************************************
[单片机]
stm32 TIM定时器[操作寄存器+库函数]
stm32配备了2个高级定时器TIM1和TIM8,4个通用定时器 TIM2,TIM3,TIM4和TIM5,还有两个基本定时器TIM6和TIM7。 高级定时器常用于电机控制,因为其加入了死区控制,紧急制动,定时器同步等高级特性。基本定时器可以为数模转化器提供准确的时间基准。 stm32的通用定时器由一个通过可编程预分频器驱动的16位自动装载计数器构成。通用定时器可以用于测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。 通用计时器的使用,需要先配置一个时基单元,就是设定一个基准时间,确定计数一次耗去的时间,可以设定在几个微妙到几个毫秒之间。 通用定时器的都有4个独立通道(TIMx_CH1~4),这
[单片机]
<font color='red'>stm32</font> <font color='red'>TIM</font><font color='red'>定时器</font>[操作寄存器+库函数]
STM32自学笔记 零死角玩转STM32
工程师经验手记例说STM32 将由浅入深,带领大家进入STM32的世界。本书总共分为3篇:第1篇为硬件篇,主要介绍实验平台;第2篇为软件篇,主要介绍STM32开发软件的使用以及一些下载调试的技巧,并详细地介绍了几个常用的系统文件(程序);第3篇为实战篇,通过38个实例(绝大部分是直接操作寄存器完成的)带领大家一步步深入STM32的学习。相较于第2版,本书在开发环境、源代码、教程说明等方面进行了更新和完善。 STM32自学笔记 《STM32自学笔记》以新颖的思路、简单的逻辑、简洁的语言来阐述作者初遇STM32以来的种种认识,书中多处内容都是由作者从STM32初学时的实践中总结而来。 本书主要介绍ARM Cortex—M3系列
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved