通用定时器中断实验详解

发布者:oplndctkl出最新更新时间:2022-04-20 来源: eefocus关键字:定时器中断 手机看文章 扫描二维码
随时随地手机看文章

通用定时器中断实验

定时器中断时钟源解析

我们这个实验使用来自APB1总线的时钟(AHB时钟频率是72MHz),我们注意到AHB->APB1分频器->APB1中如果APB1预分频器的分频系数是1那么TIMXCLK的时钟频率为“TIMCLK=APB1=AHB”,如果APB1预分频器的分频系数为N(N不为1),那么TIMXCLK的时钟频率为“TIMCLK=2xAPB1=2xAHB/N”。


但是当我们调用ST公司提供的初始化时钟源库函数时,APB1分频器默认的分频系数是2,因此最终TIMXCLK=2xAPB1=2xAHB/2=AHB。

TIMXCLK时钟频率=CLK_INT时钟频率,然后通过触发控制器传递给CK_PSC进行第二次分频处理,最终CNT计数器接收到的时钟脉冲为“CLK_INT/(CK_PSC+1)”,(分频系数为何为CK_PSC+1我们稍后再论)


教你如何看逻辑信号图

向上计数模式(时钟分频因子=1)

首先,CK_INT为TIMER的初始时钟源,CNT_EN代表着TIMER使能,CK_CNT是计数器接受的脉冲频率(在CK_PSC寄存器中进行分频后的),计数寄存器的重装载值为36,“中断事件更新”与“计时器溢出”还有“更新中断标志置1”同步进行,但是我们看到如果我们不手动清除中断标志,那么系统会一直处于执行中断当中无论中断条件是否满足。


中央对齐计数模式(时钟分频因子=1,ARR=6)

中央对齐计数模式有些不同的是,分别在向上计数溢出与向下计数溢出时均触发中断,而且如果我们不在每次中断后清除中断标志位,那么无论是否满足中断条件中断行为都会一直存在。


相关寄存器简介

事件产生寄存器(TIMx_EGR)


更新事件中断是通用定时器执行的普通中断。


状态寄存器(TIMx_SR)

计数器(TIMx_CNT)

预分频器(TIMx_PSC)


自动重装载寄存器(TIMx_ARR)

该寄存器用于在计数器的计数值溢出后重新加载计数器的溢出值。


控制寄存器 1(TIMx_CR1)

该寄存器用于请求中断和配置计数器模式,一旦中断触发,所有寄存器都会更新。


用库函数配置带有中断的通用定时器

库函数介绍

image.png

TIM_ClearITPendingBit与TIM_ClearFlag函数的区别


TIM_ClearITPendingBit 清除的是一些中断标志位,TIM_ClearFlag清除的是定时器的状态标志,比如定时器捕获状态位定时器触发标志位。


定时器参数的选取

通用定时器参数主要有两个PSC预分频系数与ARR计数器重装载值。溢出时间指的是“从0x00到TOP的时间”。

设计要求

通过定时器中断配置,每500ms中断一次,然后中断服务函数中控制LED实现LED1状态取反(闪烁)。


TIMX程序设计流程

第一步:初始化TIMER3

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 使能APB1的外设时钟  

 


第二步:初始化定时器3(配置ARR的值与PSC的值)

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  

TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;  

TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Down;  

TIM_TimeBaseInitStructure.TIM_Period = 0x1C20;  // 5000

TIM_TimeBaseInitStructure.TIM_Prescaler = 0x1388;  // 7200

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure); // 初始化TIMER3  

 


第三步:初始化NVIC嵌入式中断向量

NVIC_InitTypeDef NVIC_InitStructure;  

  

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  

NVIC_Init(&NVIC_InitStructure); // 初始化NVIC嵌入式外部中断  

 


为什么我们先于NVIC初始化配置NVIC中断向量分组呢?


NVIC中断向量分组是用于约束全体中断向量的,如果我们单独把它放到某一个头文件里,就不能表示这个含义,而且如果我们在不同头文件里声明不同的中断向量分组,那么会乱套的。


第四步:配置TIMX的中断

TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 配置TIMER3的具体中断行为  

 


为什么NVIC的TIM中断通道已经开启,我们还配置TIMX的中断干啥?


我们一开始所使能的是TIMX中断通道,TIMX中断的模式很复杂,有多种中断模式,因此我们先使能TIMX的总中断通道,在进一步配置TIMX中断的属性,例如不同的中断条件:向上计数溢出,向下计数溢出……。


第五步:使能TIMX外设

TIM_Cmd(TIM3, ENABLE); // 使能TIMER3外设  

 


第六步:编写相应的中断服务函数

void TIM3_IRQHandler() // 应该在相应的中断文件内编写中断服务函数  

{  

    if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET) // 由于定时器有多个中断模式,因此我们一定要检查相应的中断标志位  

    {  

        LED0 = !LED0;  

    }  

    TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 由于定时器有多个中断模式,因此我们一定要清除相应的中断标志位   

}  

 


代码示例

Main.c

#include "led.h"  

#include "timer.h"  

#include "stm32f10x.h"  

#include "delay.h"  

  

int main()  

{  

    delay_init(); // 只有初始化系统systick时钟,我们才能调用delay系列函数  

    LED_InitConfig(); // LED初始化  

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // NVIC中断向量分组应该先于NVIC初始化  

    TIMER_InitConfig(0x1C20, 0x1388); // 初始化TIMER3,其中PR=7200,ARR=5000  

      

    while(1)  

    {  

        LED1 = !LED1;  

        delay_ms(250);  

    }  

}  

 


Led.c

#include "led.h"  

#include "stm32f10x.h"  

  

void LED_InitConfig()  

{  

    GPIO_InitTypeDef GPIO_InitStructure;  

      

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); // 使能LED0,LED1的时钟  

      

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;  

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

    GPIO_Init(GPIOB, &GPIO_InitStructure); // 配置LED0的GPIO输出属性  

      

    GPIO_ResetBits(GPIOB, GPIO_Pin_5); // 初始化PB5为低电平  

      

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;  

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

    GPIO_Init(GPIOE, &GPIO_InitStructure); // 配置LED1的GPIO输出属性  

      

    GPIO_ResetBits(GPIOE, GPIO_Pin_5); // 初始化PE5为低电平  

}  

 


Led.h

#ifndef _LED_H  

#define _LED_H  

  

#include "sys.h"  

  

void LED_InitConfig();  

  

#define LED0 PBout(5)  

#define LED1 PEout(5)  

  

#endif  

 


Timer.h

#ifndef _TIMER_H  

#define _TIMER_H  

  

#include "sys.h"  

  

void TIMER_InitConfig(u16 ARR, u16 PR);  

  

#endif  

 

Timer.c

 

运行结果

链接:https://blog.csdn.net/weixin_45590473/article/details/108048325


关键字:定时器中断 引用地址:通用定时器中断实验详解

上一篇:浅谈中断挂起与中断标志的区别
下一篇:PWM输出实验详细示例

推荐阅读最新更新时间:2024-11-12 23:54

单片机的定时器中断寄存器
中断是为使单片机具有对外部或内部随机发生的事件进行处理而设置的。51单片机有5种中断源,即有5种对应的情况发生时会使单片机去处理中断程序(中断函数)。 此篇主要整理定时器中断笔记。采用定时器中断会涉及中断寄存器,定时器/计数器相关寄存器(TCON,TMOD),中断函数等知识点。 其中,中断寄存器,定时器/计数器相关寄存器本身或者相关位用来做初始化,中断函数的内容主要是体现发生中断后所需要的操作(在中断函数内写代码)。 1.中断允许寄存器IE 图1.中断寄存器IE 中断寄存器用来设定各个中断源的打开和关闭,IE在特殊功能寄存器中,字节地址为A8H,位地址(由低位到高位)分别是A8H~AFH,该寄存器运行位寻址
[单片机]
单片机的<font color='red'>定时器</font><font color='red'>中断</font>寄存器
PIC16F877A例程--定时器中断
#include pic.h //调用头文件 //#include pic1687x.h __CONFIG(0x3F32); //芯片配置字 #define uchar unsigned char #define uint unsigned int void initPORTA(void); void initTMR2(void); void interrupt TMR2INT(void); uint TMR2_COUTER; uint couter; void main (void) { TRISA=0X00; PORTA=0XFF; //定
[单片机]
STM32学习之通用定时器中断
STM32定时器学习 高级寄存器TIM1和TIM8 通用寄存器TIM2,TIM3,TIM4,TIM5 基本寄存器TIM6,TIM7 通用寄存器是由 时钟、时基单元、输入、输出组成。 计数器时钟可以由下列时钟源提供: 内部时钟(CK_INT) 外部时钟模式1:外部输入脚(TIx) 外部时钟模式2:外部触发输入(ETR) 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。 TIM2-7的内部时钟来自于低速APB1总线,如果APB1分频系数为1,则定时器时钟等于APB1的时钟,若不是,则定时器时钟为APB1
[单片机]
嵌入式学习笔记10——51单片机之中断定时器中断
1. CPU时序的有关知识 (1)振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)。 (2)状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。 (3)机器周期:1个机器周期含6个状态周期,12个振荡周期(使用计时器时,每隔一个机器周期计时器加1)。 (4)指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。 2. 学习定时器前须明白: (1)51单片机有2组定时器/计数器(52单片机有三组),可定时或计数。 (2)定时器/计数器和单片机的CPU是相互独立的,定时器/计数器工作的过程是自动完成的,不需要CPU的参与。 (3)51单片机中的定时器/计
[单片机]
嵌入式学习笔记10——51单片机之<font color='red'>中断</font><font color='red'>定时器</font><font color='red'>中断</font>
用C51单片机的外部中断设计1s定时器
51单片机给我们提供了2个计时器中断,分别是计时器0和计时器1,他们对应的优先级分别是1和3,开启计时器并允许其中断后,计时器会从给定的初始值开始,每个指令周期加1,直到加到65535,再加一时计时器溢出,计时器此时会进入中断,并执行中断服务函数。 虽然书上讲的很清楚了,但实际使用还是有些许差别,我自己是这样理解的 65536-50000的由来 假设我使用的单片机的晶振为12MHZ,其机器周期是1us,即每1us产生一次计数 如果设计一个1s的定时器,理论上是需要1*10^6个机器周期,但定时器T0只能对机器周期能进行最大65536次计数,很明显已经超过了,并不能直接采用T0的默认值 转下思维模式,取个65535之内的整数值,
[单片机]
用C51单片机的外部<font color='red'>中断</font>设计1s<font color='red'>定时器</font>
s3c2440裸机-异常中断(五. irq之定时器中断
之前讲过 s3c2440时钟体系 ,看了时钟体系再来看定时器中断会更好的结合运用所学知识点。 S3c2440共有2种定时器: 1.Watchdog看门狗定时器 2.PWM脉冲可调制定时器 下面详细介绍2种定时器的原理,来了解定时器是如何产生定时器中断的。 1. Watchdog看门狗定时器 1)Watchdog看门狗定时器原理 Watchdog定时器的原理很简单,寄存器很少,框图如下: 1.定时器,定时器那肯定是需要用到时钟的,从框图中可以看到Watchdog定时器采用的时钟源是PCLK,从 s3c2440时钟体系 中也可以体现出来,接的是APB总线。 2.然后到达一个8bit的分频器,可以通过配置WTCON 来设置分频器的预
[单片机]
s3c2440裸机-异常<font color='red'>中断</font>(五. irq之<font color='red'>定时器</font><font color='red'>中断</font>)
STM32复习笔记(七)定时器&定时器中断
一、STM32定时器: STM32F10x系列总共最多有8个定时器: 二、三种STM32定时器区别: 三、通用定时器功能特点描述: STM32 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能特点包括: 位于低速的APB1总线上(APB1) 16 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)。 16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数 为 1~65535 之间的任意数值。 4 个独立通道(TIMx_CH1~4),这些通道可以用来作为: ① 输入捕获 ② 输出比较 ③ PWM 生成(边缘或中间对
[单片机]
STM32复习笔记(七)<font color='red'>定时器</font>&<font color='red'>定时器</font><font color='red'>中断</font>
STM32定时器中断
STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。 TIM1和TIM8是能够产生3对PWM互补输出的高级定时器,常用于三相电机的驱动,时钟由APB2的输出产生;TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。 通用TIMx定时器特性包括: ●16位向上,向下,向上/向下自动装载计数器 ● 16位可编程预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值 ●4个独立通道:(定时器通道是什么意思?在PWM一节中有提到...)
[单片机]
STM32<font color='red'>定时器</font><font color='red'>中断</font>

推荐帖子

那个大神知道酷派8079手机主板电路的核心芯片怎么找?
那个大神知道酷派8079手机主板电路的核心芯片怎么找?那个大神知道酷派8079手机主板电路的核心芯片怎么找?手机的核心芯片指四核处理器芯片还是内存芯片?处理器芯片
heber312 移动便携
DCDC 芯片
找一个输入DC12V左右输出5V1A芯片和5V输入3.3V输出500MA的芯片有推存的吗谢谢DCDC芯片LM2576,REG1117太多了。LM2576,LM2596,都可以实现楼主要求。5V1A输出的可以考虑MP2259,可以最高16V输入楼主TDK一大堆模块有没有要考虑 模块太贵了 有没有SOP8封装的芯片介绍 MP2259是SOT23-6MP2309是SOP-8封装,也可1A也可以0.5A输出
刘小天 LED专区
AVR系列单片机C语言编程与应用实例
讲述AVR单片机C语言的书AVR系列单片机C语言编程与应用实例好东西,谢谢分享!xiexieenjoy,谢谢看看,看看,看看。先收下,在此谢过!
ptwang Microchip MCU
【转】简析开关电源EMI的产生原因及五大抑制策略
开关电源是一种应用功率半导体器件并综合电力变换技术、电子电磁技术、自动控制技术等的电力电子产品。因其具有功耗小、效率高、体积小、重量轻、工作稳定、安全可靠以及稳压范围宽等优点,而被广泛应用于计算机、通信、电子仪器、工业自动控制、国防及家用电器等领域。但是开关电源瞬态响应较差、易产生电磁干扰(EMD,且EMI信号占有很宽的频率范围,并具有一定的幅度。这些EMI信号经过传导和辐射方式污染电磁环境,对通信设备和电子仪器造成干扰,因而在一定程度上限制了开关电源的使用。 
okhxyyo 电源技术
寒假有人去培训FPGA吗,求组团
本人打算去培训下,培训费用比较高,想找同道中人一起去,二人可打95折,三人可打9折,可以省一点银子寒假有人去培训FPGA吗,求组团打算去朋友可以留下QQ联系,一起去报名培训的时间有限效果不明显chenzhufly发表于2013-12-2914:58培训的时间有限效果不明显 主要是为了找工作,需要的较为核心东西自己一时半会儿搞不定chenzhufly发表于2013-12-2914:58培训的时间有限效果不明显 主要是为了找工作,需要
blueworld FPGA/CPLD
芯片中参考电压如何在电源欠压时保持稳定
如图,如题芯片内部常见的掉电检测(BOD)或者欠压检测(UVLO)功能都有一个参考电源Vref进行参与但是该Vref都是正常上电时生成那么在输入欠压或者输入抖动时,该Vref还如何保持稳定(正常供电时,生成的带隙基准电压Vref的原理我明白)芯片中参考电压如何在电源欠压时保持稳定Vref一般比电源电压要低,所以可以由电源电压经线性稳压器得到。由于Vref的负载电流很小,所以把这个线性稳压器集成到芯片内很容易。有了这个线性稳压器,电源电压欠压时Vref不会
shaorc 模拟电子
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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