STM32F1x系列——定时器中断

发布者:幸福家园最新更新时间:2019-09-24 来源: eefocus关键字:STM32F1x系列  定时器中断  计数器 手机看文章 扫描二维码
随时随地手机看文章

一 通用定时器的工作过程如下图:

 

二 计数器模式:


(1)向上计数模式:计数器从0计数到自动加载值,然后重新从0开始计数并且产生一个计数器溢出事件


(2)向下计数模式:计数器从自动装入的值开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出的事件


(3)中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1,并且产生一个计数器溢出事件,然后再从0开始计数


通用定时器常用寄存器和库函数:


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


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


(3)状态标志位获取和清除:


      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);


三  定时器中断实现步骤:


(1)使能定时器时钟:RCC_APB1PeriphClockCmd();


(2)初始化定时器,配置ARR,PSC:TIM_TimeBaseInit();


(3)开启定时器中断,配置NVIC:


      void TIM_ITConfig();

      NVIC_Init();


(4)使能定时器:TIM_Cmd();


(5)编写中断服务函数:TIMx_IRQHandler();


四 定时器的计算:Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk


五 下面是定时中断的代码:


(1)TIME.c



void TIM3_Int_Init(u16 arr,u16 psc)

{

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

NVIC_InitTypeDef NVIC_InitStructure;

 

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

//定时器TIM3初始化

TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值

TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 

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

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

 

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

 

//中断优先级NVIC设置

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; 

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

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

 

 

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

}

//定时器3中断服务程序

void TIM3_IRQHandler(void)   //TIM3中断

{

static u8 count=0;

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

{

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

LED1=!LED1;

}

}



(2)MAIN.c


int main(void)

{

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

         delay_init();

LED_Init();

TIM3_Int_Init(4999,7199) ;  //500ms 

while(1)

{

 

LED3 = !LED3 ;     //LED3每隔200ms亮

delay_ms(200) ;

 

}

 

}

程序仿真下载后:LED3每隔200ms闪烁,LED1每隔500ms闪烁

关键字:STM32F1x系列  定时器中断  计数器 引用地址:STM32F1x系列——定时器中断

上一篇:STM32F1x系列——外部中断
下一篇:STM32F1x系列——跑马灯实验-库函数

推荐阅读最新更新时间:2024-11-09 10:47

浅析三菱plc高速计数器和编码器应用
一、普通计数器 先来学习下普通计数器,那C0举例,看下图,当X0来上升沿时,C0会计数一次,当C0计数到1000时,就会停止计数,C0计数器开关会动作,在编程时,建议用RST指令使C0进行复位,否则C0计数超限后一直处于溢出状态。 二、高速计数器 高数计数和普通计数器区别在于: 1、高数计数可以识别频率较高的脉冲 2、高速计数器调用计数器即可,在程序里面不会体现出输入端X,比如下表,调用计数器C235之后,程序里面不会有X0输入端,只要在输入端接好线即可 如下表,是我们的单相的高速计数器 假如我把光电感应器接到,X0,那么C235,就是它的专用的计数器,X0每感应到的每一个信号都会用C235进行计数,我们用以下程序就能
[嵌入式]
浅析三菱plc高速<font color='red'>计数器</font>和编码器应用
【51单片机】定时/计数器
修改日志 时间 修改内容 023-03-13 初稿完成 TMOD不能位寻址 ,只能将整个寄存器一起配置。 TCON 能位寻址 。用来控制定时器的启动、停止,标识定时器的溢出和中断情况。 定时器/计数器模式控制寄存器(TMOD) GATE = 0 不受外部中断控制 GATE = 1 受外部中断控制(即使软件开启了,也要外部中断引脚置位才行) 方式0 13位定时器/计数器,TL0(TL1)只用低5位参与分频,TH0(TH1)整个8位全用。 方式1 16位定时器/计数器 方式2 8位自动重装载定时器,实际只用低8位定时/计数,当溢出时,高8位的值自动重装入低8位。 方式3 T0此时作为两个独立的8位定时器/计数器
[单片机]
【51单片机】定时/<font color='red'>计数器</font>
AT89S51单片机计数器的设计
1.实验任务 利用AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,用来指示当前计数的数据;用P1.4-P1.7作为预置数据的输入端,接四个拨动开关K1-K4,用P3.6/WR和P3.7/RD端口接两个轻触开关,用来作加计数和减计数开关。具体的电路原理图如下图所示 2.电路原理图 图4.12.1 3.系统板上硬件连线 (1).把“单片机系统”区域中的P1.0-P1.3端口用8芯排线连接到“八路发光二极管指示模块”区域中的L1-L4上;要求:P1.0对应着L1,P1.1对应着L2,P1.2对应着L3,P1.3对应着L4; (2).把“单片机系统”区域中的P3.0/RXD,P3.1/TXD,P3.2/IN
[单片机]
AT89S51单片机<font color='red'>计数器</font>的设计
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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