TIM2定时器中断与中断嵌套

发布者:变形金刚最新更新时间:2016-08-05 来源: eefocus关键字:TIM2  定时器中断  中断嵌套 手机看文章 扫描二维码
随时随地手机看文章
/************************************************************

Copyright (C), 2012-2022, yin.
FileName: main.c
Author: ycw Version :  1.0 Date: 2012.04.22
Description:           TIM2 EXIT0 NVIC  
Version:                 V1.0                 
Function List:         TIM2 EXIT0 NVIC
History:                      

#include

static __IO uint32_t TimingDelay;    //__IO为volatile的宏定义
int8_t LED_Flag = 1;       //LED灯翻转标志位
void GPIO_Config(void);
void EXIT_Config(void);
void TIM_Config(void);
void NVIC_Config(void);
void Delay(__IO uint32_t nTime);

main ()
{
/*在主函数main之前通过调用启动代码运行了SystemInit函数,而
这个函数位于system_stm32f4xx.c”。程序运行起始于启动文件的第
175行(LDR R0, =SystemInit)。sys时钟为HSE频率/PLL_M*PLL_N/PLL_P,
定义HSE为25M,则sys时钟频率为168M */

GPIO_Config();
EXIT_Config();
TIM_Config();
NVIC_Config();
/*SystemCoreClock / 1000时基为1ms*/
if (SysTick_Config(SystemCoreClock / 1000))
 { 
 /* Capture error */ 
 while (1);
 }
while (1)
    { /*产生一个软件中断
     EXTI_GenerateSWInterrupt(EXTI_Line0);
  Delay(1000); */
  if (LED_Flag != 1)
  {
    GPIO_SetBits(GPIOG, GPIO_Pin_6);      //setbits使能IO,当前下指输出(此时为灭)
  }       
  else
  {
    GPIO_ResetBits(GPIOG, GPIO_Pin_6);     //Resetbits屏蔽IO,当前下指不输出(此时为亮)
  }
    }
}

/*************************************************
Function:    void GPIO_Config(void)       
Description: GPIO配置函数              
Input: 无                              
Output:无                              
Return:无                              
*************************************************/ 
void GPIO_Config(void)
{
/*定义了一个GPIO_InitStructure的结构体,方便一下使用 */
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能GPIOG时钟(时钟结构参见“stm32图解.pdf”)*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOA, ENABLE);
/*仅设置结构体中的部分成员:这种情况下,用户应当首先调用函数PPP_SturcInit(..)
来初始化变量PPP_InitStructure,然后再修改其中需要修改的成员。这样可以保证其他
成员的值(多为缺省值)被正确填入。*/
GPIO_StructInit(&GPIO_InitStructure);
/* 初始化GPIOG的Pin_6为推挽输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;     //指定第六引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;    //模式为输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //频率为快速
GPIO_Init(GPIOG, &GPIO_InitStructure);      //调用IO初始化函数

/*配置GPIOA_Pin_0,作为外部中断*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;     //指定第六引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;    //模式为输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //频率为快速
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;    //网上说要上拉,稳定,我的没有上拉也可以
GPIO_Init(GPIOA, &GPIO_InitStructure);      //调用IO初始化函数
}

/*************************************************
Function:    void EXIT_Config(void);  
Description: 外部中断配置函数       
Input:       无
Output:      无                            
*************************************************/
void EXIT_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);       //使能外部中断复用时钟
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, GPIO_PinSource0);//选择GPIOA的Pin0为EXTILine0  
EXTI_ClearITPendingBit(EXTI_Line0);        //清外部线路0中断
EXTI_InitStructure.EXTI_Line = EXTI_Line0;      //线路0
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;    //触发模式为中断
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;   //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;      //开外部中断
EXTI_Init(&EXTI_InitStructure);
}

/*************************************************
Function:    void TIM_Config(void)  
Description: 定时器配置函数       
Input:       无
Output:      无                            
*************************************************/
void TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_DeInit(TIM2);
TIM_TimeBaseStructure.TIM_Period = 10000;
/*在system_stm32f4xx.c中设置的APB1 Prescaler = 4 ,可知
APB1时钟为168M/4*2,因为如果APB1分频不为1,则定时时钟*2 */
TIM_TimeBaseStructure.TIM_Prescaler = 8400;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2, ENABLE);
}

/*************************************************
Function:    void NVIC_Config(void)  
Description: 嵌套中断断配置函数       
Input:       无
Output:      无                            
*************************************************/
void NVIC_Config(void)
{
/*配置外部中断线路0中断嵌套*/
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);        //嵌套分组为组0,均为响应优先级
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;       //中断通道为通道0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢断优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //响应优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //开中断
NVIC_Init(&NVIC_InitStructure);

/*配置定时器TIM1中断嵌套*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
/*抢断优先级为1,之所以设置为1,后面我做了一个中断的打断实验,
即在定时器中断服务程序里设置了一个死循环,而在外部中断0服务
程序里则进行了LED的翻转,实验表明高抢断优先级的中断可以打断
低抢断优先级的中断,即嵌套,但响应优先级不会打断,只会排队*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

/*************************************************
Function:    void Delay(__IO uint32_t nTime)  
Description: 精确延时函数,时基根据前面设定,当前
             为1ms       
Input: 需要延时的时间,单位ms                      
Output:无                            
*************************************************/
void Delay(__IO uint32_t nTime)

  TimingDelay = nTime;
  while (TimingDelay != 0);
}

/*************************************************
Function:    void TimingDelay_Decrement(void)  
Description: SysTick中断服务函数,加在_it.h中的
             void SysTick_Handler(void)函数内        
Input: 无                      
Output:无                            
*************************************************/
void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  { 
    TimingDelay--;
  }
}

关键字:TIM2  定时器中断  中断嵌套 引用地址:TIM2定时器中断与中断嵌套

上一篇:TIM通用定时器:PWM输入捕获模式
下一篇:Cortex-M3的中断优先级的分组方式

推荐阅读最新更新时间:2024-03-16 15:03

AVR单片机教程——定时器中断
本文隶属于AVR单片机教程系列。 中断,是单片机的精华。 中断基础 当一个事件发生时,CPU会停止当前执行的代码,转而处理这个事件,这就是一个中断。触发中断的事件成为中断源,处理事件的函数称为中断服务程序(ISR)。 中断在单片机开发中有着举足轻重的地位——没有中断,很多功能就无法实现。比如,在程序干别的事时接受UART总线上的输入,而uart_scan_char等函数只会接收调用该函数后的输入,先前的则会被忽略。利用中断,我们可以在每次接受到一个字节输入时把数据存放到缓冲区中,程序可以从缓冲区中读取已经接收的数据。 AVR单片机支持多种中断,包括外部引脚中断、定时器中断、总线中断等。每一个中断被触发时,通过中断向
[单片机]
ARM中断嵌套寄存器NVIC使用说明
在ARM9系列中,针对某种具体的芯片如stm23f103zet6,可以将其看做contex-M3和外设的集成。针对于某种具体的功能(计数器、spi等)要同时对该功能下内核的状态和外设的状态进行设定。在ARM9中,中断与内核紧密联系,要实现某一外设的中断功能就必须对内部控制系统(NVIC)进行设定。 转自:秦工的博客 http://www.arm32.com/post/304.html 1)NVIC是CortexM3内核的标准组件,其实很简单。与其类似的还有MPU,SYSTick,调试/Trace等模块(如果芯片集成了)。NVIC即是Nested Vectored Interrupt Controller,即是中断嵌套向量控制器
[单片机]
【ARM裸板】定时器中断示例与分析
1.定时器结构分析 1.每来一个CLK,TCNTn减1 2.当TCNTn == TCMPn时,(可以把对应的PWM引脚翻转) TCNTn与TCMPn的值来自寄存器TCNPBn与TCMTBn 3.TCNTn继续减1,当TCNTn == 0时,可以产生中断(PWM引脚再次翻转) 4.TCNTn == 0时,可自动加载初值 2.初始化 1.设置时钟源 2.设置初值 3.加载初值,启动Timer 4.设置为自动加载 5.中断相关 需要设置:1.Prescaler,2.MUX(Divider),3.TCMPB0(不是PWM测试,因此该不需要设置),4.TCNTB0,5.TCON0 2.1 设置时钟源 由上公式: 设
[单片机]
【ARM裸板】<font color='red'>定时器</font><font color='red'>中断</font>示例与分析
PIC单片机中断嵌套
#INCLUDE P16F877.inc W_TEMP EQU 20H ; 实际上20H、A0H、120H和1A0H STATUS_TEMP EQU 21H ;在体0中建立保护单元 PCLATH_TEMP EQU 22H ;在体0中建立保护单元 ORG 000H GOTO A1 ORG 04H;中断入口地址 GOTO ZD01 A1 BSF STATUS,RP0 BCF STATUS,RP1;体1 MOVLW 00H;1:2TMRO比例 MOVWF OPTION_REG;分频1/2 MOVLW 0H MOVWF TRISA;设置A口为输出口 MOVL
[单片机]
C51编程14-中断篇(定时器中断1)
在MCS-51的中断系统中,除了有外部中断以外,还有定时器/计数器中断、串行中断,本章节将会说明定时器/计数器中断,以及它的四种方式 MCS-51单片机中,内部有两个16位的可以选择的定时器/计数器,称为定时器0(T0)或者定时器1(T1),它们用来做定时器或者计数器。 定时器/计数器工作原理: 作为定时器使用时,输入的时钟脉冲是由晶体振荡器的输出12分频后得到的,所以定时器是对机器周期的计数器,每一个机器周期+1,因此它的定时频率为晶振频率的1/12;当设置了定时器工作方式并启动定时器后,定时器就会按照被设定的工作方式独立工作,不再占用CPU时间。当计数器计满时溢出时向CPU请求中断。 作为计数器工作使用时,计数器
[单片机]
C51编程14-<font color='red'>中断</font>篇(<font color='red'>定时器</font><font color='red'>中断</font>1)
STM32F7普通定时器的使用(定时+中断+PWM)
基本计时功能 最简单的,定时器嘛,基本的定时器就是定时功能,简单来说就是TIMx- CNT会跟随着输入时钟的脉冲而计数。 初始化定时器的参数,大家都好理解,因为TIM2的输入时钟是108Mhz,这里进行10800分频,输入频率为10K,重装载值设置为20K,每2秒溢出一次。 在HAL_TIM_Base_Init的执行过程中,会先调用HAL_TIM_Base_MspInit再进行其他参数的配置,即先开时钟。 TIM_HandleTypeDef TIM2_Handler; static void MX_TIM2_Init(void) { TIM2_Handler.Instance = TIM2; TIM2_Hand
[单片机]
STM32F7普通<font color='red'>定时器</font>的使用(定时+<font color='red'>中断</font>+PWM)
51单片机定时器中断基础
一、中断概念 中断是为使单片机具有对外部或者内部随机发生的事件实时处理而设置的。 把自己想象成单片机的CPU,你正在洗衣服,但是突然快递小哥给你打电话让你去拿快递,于是你停下洗衣服去拿快递了。快递小哥的电话就是中断信号,告诉你有其他的事情需要先去做,然后你去拿快递就相当于中断之后要去处理的事情。 51单片机有五个中断源 INT0——外部中断0 INT1——外部中断1 T0——定时器/计数器0中断 T1——定时器/计数器1中断 TI/RI——串行口中断 二、使用中断的过程(下面以定时器0、工作方式1为例) 定时器0选择工作方式1 D7 D6 D5 D4 D3 D2 D1 D0 GATE C/T M1 M0 G
[单片机]
AVR单片机学习(六)中断定时器
中断的概念 M16的外部中断 定时器的概念 M16的定时器 中断方式使用定时器 中断概念 一、在程序运行期间,发生非预期的紧急事件 1、通常是为了避免查询方式的程序设计(它低效因为一直查询,死循环一直不停查询) 2、用的最多的是外部中断与定时器中断(主要产生一些精确地延时,省去了CPU延时CPU延时就不能干其他事情了所以可以提高CPU效率) 3、外部中断:按键程序 4、定时器中断:定时与循环扫描应用场合 二、中断服务程序 1、中断发生时,主程序暂停,跳转到中断服务程序,称为 相应中断 2、执行完毕后返回主程序继续运行 一、M16具有3个外部中断 1、M16具有3个外部中断 2、INT0、INT1:
[单片机]
AVR单片机学习(六)<font color='red'>中断</font>与<font color='red'>定时器</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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