PIC32MZ tutorial -- Timer Interrupt

发布者:DataExplorer最新更新时间:2017-01-20 来源: eefocus关键字:PIC32MZ  tutorial  Timer  Interrupt 手机看文章 扫描二维码
随时随地手机看文章

  An interrupt is an internal or external event that requires quick attention from the controller. The PIC32MZ architecture provides a rich interrupt system that can manage up to 190 sources of interrupts. Each interrupt source can have a unique piece of code, called the Interrupt Service Routine (ISR) directly associated via a pointer, also called a "vector", to provide the required response action.


  At the moment, I use Timer1 interrupt as a example to show how to enable interrupt and how to write interrupt service routine for PIC32MZ. The implementation has three parts. The first is the Timer1 interfaces. The second is interrupts interfaces. And the third is the Timer1 interrupt service routine.


  The Timer1 interfaces include TMR1_Open() and TMR1_Write(). In the TMR1_Open(), will enable Timer1 and Timer1 interrupt. configure Timer1 to overflow and interrupt per millisecond. set Timer1 interrupt priority level and subpriority level. Below code show me how to do that.



/**

 

Function: TMR1_Open


 

Summary: Initialization of Timer


 

Description: TMR1 on; 0.08 microsecond every tick, overflow and interrupt per ms


 

Remarks: Pre-scale 1:8; PB 100MHz; PR1 0x30D3

 */

// TODO Insert function definitions (right here) to leverage live documentation

void TMR1_Open(void)

{

    T1CON = 0x8010;

    PR1 = 0x30D3;

    IPC1SET = 0x5;

    IEC0SET = 0x10;

    IFS0CLR = 0x10;

}

// Comment a function definition and leverage automatic documentation 

/**

 

Function: TMR1_Write


 

Summary: Write TMR1


 

Description: Write a value to TMR1


 

Remarks: the value is range of 0~65535

 */

// TODO Insert function definitions (right here) to leverage live documentation

void TMR1_Write(unsigned int value)

{

    TMR1 = value & 0xFFFF;

}


  The interrupts interfaces include EnableINT(), DisableINT() and SelectMultiVector(). When we want to use any interrupt source, call EnableINT() to enable interrupt module first. PIC32 have two interrupt vector modes, the singlevector mode and multivector mode. SelectMultiVector() will help to set interrputs for multivector mode. I do that like below.



/** 

  @Function

    EnableINT


  @Summary

    Enable interrupts


  @Remarks

    This function need to be called first before using any interrupt source

 */

void EnableINT(void) 

{

    asm volatile("ei");

}


/** 

  @Function

    DisableINT


  @Summary

    Disable interrupts


  @Remarks

    

 */

void DisableINT(void) 

{

    asm volatile("di");

}


/** 

  @Function

    SelectMultiVector


  @Summary

    Set system to use multivector mode for interrupts


  @Remarks

    

 */

void SelectMultiVector(void) 

{

    unsigned long MVEC_MASK = 0x1000;

    INTCONSET = MVEC_MASK;

}


  At the end, I show the main function and the Timer1 interrupt service routine. There are styles of interrupt service routine, the interrupt attribute style, like 


      __attribute__((interrupt([IPLn[SRS|SOFT|AUTO]]))),  


and the interrupt pragma style, like


       # pragma interrupt function-name IPLn[AUTO|SOFT|SRS] [vector

       [@]vector-number [, vector-number-list]]

       # pragma interrupt function-name single [vector [@] 0


  It strongly recommend the first style. So there they are.



#include

#include "TMR.h"

#include "Interrupt.h"

#include "ConfigurationBits.h"


//#define LED_IOCTL()    TRISHbits.TRISH0 = 0

//#define LED_SETON()    LATHbits.LATH0 = 1

//#define LED_SETOFF()   LATHbits.LATH0 = 0

//#define LED_OPEN()     ANSELHbits.ANSH0 = 0


//#define LED_IOCTL()    TRISH &= 0xFFFFFFFE

//#define LED_SETON()    LATH |=  0x00000001

//#define LED_SETOFF()   LATH &= 0xFFFFFFFE

//#define LED_OPEN()     ANSELH &= 0xFFFFFFFE


#define LED_IOCTL()       TRISHCLR = (1<<0)

#define LED_SETON()       LATHSET = (1<<0)

#define LED_SETOFF()      LATHCLR = (1<<0)

#define LED_ONOFF()       LATHINV = (1<<0)

#define LED_OPEN()        ANSELH &= 0xFFFFFFFE


volatile unsigned int COUNTER;


void __attribute__((vector(_TIMER_1_VECTOR), interrupt(ipl1AUTO), nomips16)) TMR1_ISR(void)

{

    if (COUNTER++ >= 300)

    {

        COUNTER = 0;

        LED_ONOFF();

    }

    TMR1_Write(0);

    IFS0CLR = 0x10; // Clear flag

 }


void main(void) 

{

    LED_OPEN();

    LED_IOCTL();

    TMR1_Open();

    TMR1_Write(0);

    SelectMultiVector();

    EnableINT();

    COUNTER = 0;

    while (1)

    {

        ; // do nothing

    }

}


  This application run well on PIC32MZ EC starter kit. I see the LED blink perfectly as expectation.


关键字:PIC32MZ  tutorial  Timer  Interrupt 引用地址:PIC32MZ tutorial -- Timer Interrupt

上一篇:PIC32MZ tutorial -- Key Debounce
下一篇:PIC32MZ tutorial -- Blinky LED

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

c51 interrupt 中断号写法
单片机interrupt 中断号写法 定义函数的时候按正常的方法定义,然后在小括号的后面大括号的前面写上interrupt X using Y就行了,X是你要用的中断号,Y是中断时用的寄存器组,通常用1组就行了,看下面的例子: void timer_isr(void) interrupt 1 using 1 {} 中断函数不能设置参数和返回值,都置为void吧。 using ** 不要写,写了易出错,不写绝对不出错. interrupt**是中断源.具体编号如下: 中断源 interrupt(中断号) INT0 0 T0 1 INT1 2 T1 3 UART
[单片机]
stm8s开发(五) TIMER的使用:定时!
  STM8S提供三种类型的TIM 定时器:高级控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的架构。此共同的架构使得采用各个定时器来设计应用变得非常容易与方便(相同的寄存器映射,相同的基本功能)。      使用定时可以确定一个时间片,方便控制发送速率,采样速率,等等一些对时间要求比较高的任务,而这些操作可以放入定时器中断里面执行。这次的例子,定时1s,让LED灯翻转一次,达到2s闪烁一次的效果。由于定时操作简单,我们使用基本定时器: TIMER 4   void Init_Timer4(void)   {   //128分频 256计数,在1
[单片机]
stm8s开发(五) <font color='red'>TIMER</font>的使用:定时!
关于MSP430 Timer_A的问题
我用的是CCR1 连续计数模式 这个CCR1每次要在定时器赋值 我今天发现了个奇怪现象,就是我把定时器中断里面的CCR1 += 10000;给屏蔽掉,LED灯也是很均匀亮灭。 强哥解答:CCR1是循环计数的 你把语句屏蔽掉后 程序运行状态是 CCR1从0计到10000触发第一次中断,然后清零,往后是每隔65535发生一次中断,这么一直继续下去。(仅第一是计10000产生中断)。
[单片机]
关于MSP430 <font color='red'>Timer</font>_A的问题
ATMEGA16单片机Timer1的OC1A脚输出占空比可调的PWM信号
采用快速PWM方式,通过按键设置OCR1A的值,从而改变占空比; 当数值超出界限时,以了LED和LCD的方式报警; 输出经过滤波可以得到直流信号,改变占空比,输出不一样。 仿真原理图如下 单片机源程序如下: #define MAIN_C #include includes.h /***************************/ /*PWM*/ /*晶振为4MHz*/ /*利用Timer1的OC1A脚输出占空比可调的信号*/ /*通过按键控制OCR1A的值*/ /***************************/ #define PwmOut PD5 //A通道的PWM输出 #define
[单片机]
ATMEGA16单片机<font color='red'>Timer</font>1的OC1A脚输出占空比可调的PWM信号
PIC单片机TIMER1应用注意的问题
1、当对TMR1H和TMR1L初始化时,预分频器将会自动清零。 2、在寄存器对TMR1H和TMR1L进行写操作时,将使预分频器清零。当TMR1处于运行状态时,对TMR1H或TMR1L值进行的写操作,可能会写入不希望的值。 3、TMR1工作于异步计数方式时,不能做为CCP模块的输入捕捉或输出捕捉的基准时间。 4、在上电复位(POR)或其它复位时,TMR1H和TMR1L保持原有数值,不会复位到0000H。 5、在上电复位或掉电复位控制寄存器T1CON的值将回到00H,并将关闭TMR1,且预分频器的分频比设定为缺的 1:1.在其他复位时均不会影响T1CON的值。 6、如果在复位时要将TMR1H和TMR1L的内容回到00H,可以
[单片机]
NodeMCU学习(五)--Timer
1、认识timer相关的API 2、案例代码 (1)tmr.alarm()应用 if not tmr.create():alarm(5000, tmr.ALARM_SINGLE, function() print( hey there ) end) then print( whoopsie ) end pin=4 -- 4就是D4,GPIO2 flag=1 timer1 = tmr.create() gpio.mode(pin, gpio.OUTPUT) gpio.write(pin, gpio.HIGH) function run_led() if flag == 1 then gpio.
[单片机]
NodeMCU学习(五)--<font color='red'>Timer</font>
PIC单片机-利用Timer2定时器的溢出中断实现动态扫描数码管
编写程序,令数码管的显示顺序为:0123,1230,2301,3012。 数码管显示分静态扫描和动态扫描,动态扫描显示一般分两种方式 1、选用一个数码管位,写断码显示,延时一定的时间,关闭显示,选择下一位,依次类推,完成数码管的多位扫描显示,这种方式比较耗CPU资源。 2、利用定时器,每隔一个固定的时间去选通,写断码,这种方式可以降低CPU的占用时间,同时,每个数码管显示时间固定,不存在“抖”的现象。 本程序中使用第二种方式,利用Timer2定时器的溢出中断实现动态扫描,Timer2包含一个周期控制寄存器,可以自动控制溢出周期。周期控制寄存器PR2的存在使得TIMER2的计数值有一个可以自由设定的上限。当TIMER
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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