STM32——如何配置通用定时器中断

发布者:心愿达成最新更新时间:2020-08-31 来源: eefocus关键字:STM32  配置  通用定时器  中断 手机看文章 扫描二维码
随时随地手机看文章

STM32的定时器

STM32F103ZET6一共有8个定时器,其中分别为:


高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5);基本定时器(TIM6、TIM7)。

在这里插入图片描述
在这里插入图片描述

除非APB1的分频系数是1,否则通用定时器的时钟等于APB1时钟的2倍。


默认调用SystemInit函数情况下:

SYSCLK=72M

AHB时钟=72M

APB1时钟=36M

所以APB1的分频系数=AHB/APB1时钟=2

所以,通用定时器时钟CK_INT=2*36M=72M

 

定时器中断的一般步骤

实例要求:通过TIM3的中断来控制led1的亮灭

硬件:LED——GPIOB,GPIO_Pin_5


1、使能定时器时钟。调用函数:RCC_APB1PeriphClockCmd();

2、初始化定时器,配置ARR、PSC。调用函数:TIM_TimeBaseInit();

3、开启定时器中断,配置NVIC。调用函数:void TIM_ITConfig();NVIC_Init();

4、使能定时器。调用函数:TIM_Cmd();

5、编写中断服务函数。调用函数:TIMx_IRQHandler()。

定时时间的计算公式

决定CK_CNT的频率是由分频系数决定的,分频系数PSC决定了计数器计数一次的时间 t=1/CK_CNT

CK_CNT=CK_INT/(71+1)=1MHz

1/CK_CNT=1us

APB1的预分频系数决定是36MHzx1还是36MHzx2,这里的APB1预分频系数是2则是72MHz

(PSC+1)/72MHz=1us

Arr的重装周期是1~65535,参考寄存器手册,所以不需要减一,分频系数减一,周期不需要


//通用定时器3中断初始化

//这里时钟选择为APB1的2倍,而APB1为36M

//arr:自动重装值。

//psc:时钟预分频数

//这里使用的是定时器3!


void LED_Init(void)

{

     GPIO_InitTypeDef GPIO_InitStructure;

     

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟

   

     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置

     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz

     GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5

     GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高 此时状态为灭 低电平

 

void TIM3_Init(void)

{

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

//定时器TIM3初始化

TIM_TimeBaseStructure.TIM_Period = 1000; //自动重装载寄存器周期的值1/CK_CNT=1us,1000x1us=1ms

TIM_TimeBaseStructure.TIM_Prescaler =71; //设置用来作为TIMx时钟频率除数的预分频值CK_CNT=CK_INT/(71+1)=1MHz

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //TIM_CKD_DIV1是.h文件中已经定义好的,TIM_CKD_DIV1=0,也就是时钟分频因子为0

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

 

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

TIM_Cmd(TIM3, ENABLE);  //使能TIMx  

}


void NVIC_Init(void)

{

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级


  NVIC_InitTypeDef NVIC_InitStructure; //中断优先级NVIC设置

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断

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

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

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能

NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器

}


void TIM3_IRQHandler(void)    //TIM3中断

{

if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否

{

time++;

TIM_ClearITPendingBit(TIM3, TIM_IT_Update  ); //清除TIMx更新中断标志 

}

}

 

int main(void)

{

delay_init();     //延时函数初始化   

LED_Init();     //LED端口初始化

TIM3_Init(); //1ms的计时

  NVIC_Init(); //NVIC初始化

  while(1)

{

    if(time==500) //500x1ms=500ms

    {

    LED0=!LED0;

    delay_ms(200);

    time = 0;

    }    

}  

}  

 

库函数解析:

定时器参数初始化:


void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);


typedef struct

{

  uint16_t TIM_Prescaler;        

  uint16_t TIM_CounterMode;     

  uint16_t TIM_Period;        

  uint16_t TIM_ClockDivision;  

  uint8_t TIM_RepetitionCounter;

} TIM_TimeBaseInitTypeDef; 


IM_TimeBaseStructure.TIM_Period = 1000; 

TIM_TimeBaseStructure.TIM_Prescaler =71; 

TIM_TimeBaseStructure.TIM_ClockDivision =   TIM_CKD_DIV1;

TIM_TimeBaseStructure.TIM_CounterMode =   TIM_CounterMode_Up; 

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 

 

定时器使能函数: void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)


定时器中断使能函数:void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);


状态标志位获取和清除:


FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);

void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);


ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);

void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);


关键字:STM32  配置  通用定时器  中断 引用地址:STM32——如何配置通用定时器中断

上一篇:STM32——FlagStatus与ITStatus
下一篇:STM32——GPIO的CRL、CRH和CNF与MODE的关系

推荐阅读最新更新时间:2024-11-18 21:01

或售千元配置低端 Lumia 550渲染图再曝
    此前我们曾报道过微软可能除了Lumia 950系列还会为我们带来一款入门级Win10手机“Lumia 550”。近日网上又曝光了一张该机的渲染图,看来10月6日的微软发布会新机不少。 (图片引自gsmarena)     据传言,Lumia 550作为一款入门级机型当然配置不会太出色。正面5英寸屏幕;搭载一颗仅为1GHz的处理器;配有1GB RAM+8GB ROM的内存组合;有着1905mAh电池容量。   编辑点评:图中能看出Lumia 550外观设计与目前的Lumia 640相近,也被视为下一代的Lumia 640。根据目前Lumia 640的价格,由此可以 推测Lumia 550的售价可能也会在千元左右。虽
[手机便携]
STM32F4 TIMER定时器配置(一)
定时器溢出时间计算: Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk ARR:自动重装载寄存器,用于装载计数器 PSC:PSC预分频器(分频范围1~65535) Tclk:外设时钟周期 定时器配置步骤 1定时器时钟使能 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); 2.初始化定时器 1.定义定时器结构体 TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; 2.设置自动重装载值 TIM_TimeBaseStructure.TIM_Period = 自动重载值; 3.设置预分频系数 TIM_TimeBaseS
[单片机]
中断和串口剖析
以前对STC89C52单片机的串口中断始终没有深入的了解 今天没什么事,就好好的琢磨了一下,前提是单片机开启了串口中断 1、先说串口接收数据中断吧:当单片机串口接收到数据后,产生中断,单片机跳到中断程序中,可以选择接收数据或者进行其他的操作,此时的串口数据可以作为控制信号,也可以仅仅是一个触发动作,具体的操作根据中断函数实现具体的功能。在中断函数最后,需要将串口接收标志位RI清0。 2、发送中断:当单片机向串口发送数据后,单片机产生串口发送中断,同理,所发送的数据仅仅是出发中断,中断函数的具体功能和所发的数据没有必然的关系,串口发送的作用是触发中断。同样,不要忘了在最后将 TI 清0. 总的来讲,在STC89C52中,串口
[单片机]
DP83822I工业以太网PHY自协商功能与其Strap电阻配置
在工厂自动化应用中,由于现场设备节点数量与日俱增,同时对于自动化设备加工精度与实时性要求越来越高,传统的串行工业总线已经无法满足生产线同步性与大规模数据传输的要求。以太网逐渐成为主流,基于以太网全球主流OEM开发确定性网络工业以太网协议包括Profinet, Ethercat, Powerlink等。这些协议都需要以太网作为传输介质,以太网PHY主要负责。目前工业以太网总线速率以10/100M速率为主,下一代工业总线技术将会基于TSN(时间敏感网络)与速率1000M及以上的以太网协议。 在进行以太网口功能调试过程中,最常见的问题是两个端口之前无法正确建立物理层链接。所以本文档的内容基于TI以太网PHY产品DP83822,介绍以
[嵌入式]
DP83822I工业以太网PHY自协商功能与其Strap电阻<font color='red'>配置</font>
STM32 F103 时钟树详解
刚入STM32 用了也有一段时间了,先做了中断,CAN,SPI。都是跟着网上的例子直接粘贴外设的初始化代码,看的大概能懂,但是时钟一直迷迷糊糊,不清不楚。 STM32为了实现低功耗,而设计的功能完善构成复杂的时钟系统,称之时钟树。使外设功能的时钟可自配置。因为STM32外设众多,而不同的项目用到的外设参差不齐,所以可控的时钟可以实现降低产品功耗。 所有的外设在使用之前都必须设置时钟信号,才可以正常工作。以STM32F103C8T6时钟树为例,如下图所示: 图7和图8道理一样的,大家觉得那个容易理解就看那个图 图8 STM32的四个时钟源 外部时钟 1 高速外部时钟(HSE):外部时钟源,晶振频率可取范围
[单片机]
<font color='red'>STM32</font> F103 时钟树详解
一文详解80C51单片机的中断系统
中断系统是计算机或者单片机的主要功能部件。 有了中断系统,便可以使微处理器具备对外部的异步事件进行处理的能力。 当微处理器的CPU正在执行程序的过程中,如果外部硬件或者内部组件有紧急的请求(如通信,断点,发生重大故障等),中断系统就可以将当前的程序暂停,优先处理这些中断请求。 这种处理方式,对整个系统的稳定性,健壮性至关重要,同时也能大大提高处理器的效率,使得系统的应用更加灵活多变。 中断的概念 中断是指单片机在执行程序的过程中,当出现异常情况或特殊请求时,单片机停止当前程序的运行,转向对这些异常情况或特殊请求进行处理,当处理结束后再返回原程序的间断处,继续执行原程序,这一现象称为中断。 中断是单片机实时处理内部或外部事件的一
[单片机]
一文详解80C51单片机的<font color='red'>中断</font>系统
51单片机STC89C52定时器中断法扫描数码管及秒表的实现
定时器中断法扫描数码管及秒表的实现 程序源码 /*-----------------------包含头文件区域-------------------------*/ #include reg52.h //单片机头文件 /*-----------------------数据类型定义区域-----------------------*/ typedef unsigned char u8; //定义类型unsigned char别名为u8 typedef unsigned int u16; //定义类型unsigned int别名为u16 /*-----------------------用户自定义数据区域----
[单片机]
51单片机STC89C52<font color='red'>定时器</font><font color='red'>中断</font>法扫描数码管及秒表的实现
STM32 cannot enter debug mode错误
调试STM32时,MDK环境,有的代码下进去后,突然以后再Debug的时候,就会出现:Cannot enter Debug Mode ,显示错误Error:Flash Download failed-Target DLL has been cancalled. 可以尝试着用ISP方式,将片上的FLASH全部擦掉就OK了。 使用先设置跳线boot0 = 1,boot1=0。然后连上串口线,波特率默认即可,读STM32的器件信息,再擦除。。。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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