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.
/**
<p><b>Function: TMR1_Open</b></p> <p><b>Summary: Initialization of Timer </b></p> <p><b>Description: TMR1 on; 0.08 microsecond every tick, overflow and interrupt per ms </b></p> <p><b>Remarks: Pre-scale 1:8; PB 100MHz; PR1 0x30D3</b></p>
*/
// 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
/**
<p><b>Function: TMR1_Write</b></p> <p><b>Summary: Write TMR1</b></p> <p><b>Description: Write a value to TMR1</b></p> <p><b>Remarks: the value is range of 0~65535</b></p>
*/
// 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 <xc.h>
#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++ >= )
{
COUNTER = ;
LED_ONOFF();
}
TMR1_Write();
IFS0CLR = 0x10; // Clear flag
} void main(void)
{
LED_OPEN();
LED_IOCTL();
TMR1_Open();
TMR1_Write();
SelectMultiVector();
EnableINT();
COUNTER = ;
while ()
{
; // 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 -- OC Interrupt
In my previous blog "PIC32MZ tutorial -- Output Compare", I shows how to apply Output Comp ...
- PIC32MZ tutorial -- External Interrupt
In my older blog "PIC32MZ tutorial -- Key Debounce", I shows how to acheive key debounce w ...
- PIC32MZ tutorial -- 32-bit Timer
The microcontroller is PIC32MZ2048ECH144 on the PIC32MZ EC Starter Kit. This microcontroller has fou ...
- PIC32MZ tutorial -- Watchdog Timer
Watchdog is a very necessary module for embedded system. Someone said that embedded system operates ...
- (LPC1769) Timer Interrupt Application
void TIMER0_IRQHandler (void) { if(LPC_TIM0->IR & 0x01) { LPC_GPIO1->FIOPIN ^= ( << ...
- PIC32MZ tutorial -- Core Timer
Core Timer is a very popular feature of PIC32 since it is a piece of the MIPS M4K core itself and is ...
- PIC32MZ tutorial -- Output Compare
Output Compare is a powerful feature of embedded world. The PIC32 Output Compare module compares the ...
- PIC32MZ tutorial -- Input Capture
Today I accomplish a simple application for PIC32MZ EC Starter Kit. This application uses Input Capt ...
- PIC32MZ tutorial -- Change Notification
In my last post I implement "Key Debounce" with port polling, port polling is not very eff ...
随机推荐
- 对HTML+CSS+JavaScript的个人理解
HTML就像人的骨头架子,是人的根基,要有个人样呀,一个网站,一个WebApp要是缺根儿骨头,那就像人少个胳膊少个腿儿的,行动不方便啊:CSS就像人穿得衣服.鞋子,男人的纹身,女人擦得粉儿,好看呀,一 ...
- Android ContentResolve使用
在Android中使用ContentResolve访问其他程序的数据: http://developer.android.com/reference/android/content/ContentPr ...
- WCF终结点配置
错误信息:已有针对 IP 终结点 127.0.0.1:8235 的侦听器.如果有其他应用程序已在侦听此终结点,或者,如果在服务主机中具有多个服务终结点,这些终结点具有相同的 IP 终结点但绑定配置不兼 ...
- Linux线程-终止
在前文讨论了线程创建的一些基本东西,这里讨论有哪些方法可以使线程终止,线程终止又是如何与创建所需的参数进行关联的. 一,正常终止 线程在执行完成之后,正常终止. 二,线程取消 2.1 线程取消的定义 ...
- ios项目接入sdk事项
使用cocos2d-x引擎创建的项目在xcode里可以看到都带有一个ios目录,把要接入的sdk的包含.framework库文件和.bundle的资源文件的父目录拖入到xcode项目里的这个ios目录 ...
- 相同vlan之间的相互访问
- HttpClient_4 用法 由HttpClient_3 升级到 HttpClient_4 必看
转自:http://www.blogjava.net/stevenjohn/archive/2012/09/26/388609.html HttpClient程序包是一个实现了 HTTP 协议的客户端 ...
- Spring Autowired错误???
@SpringBootApplicationpublic class TestMqApplication extends SpringBootServletInitializer { @Suppres ...
- set的应用
头文件 ;#include <set> 简单应用: begin() 返回set容器的第一个元素 end() 返回set容器的最后一个元素 clear() 删除se ...
- LeetCode【217. Contains Duplicate】
Given an array of integers, find if the array contains any duplicates. Your function should return t ...