打印

在中断向量表添加中断服务函数指针如何添加?

[复制链接]
2351|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
6019实验室|  楼主 | 2010-2-21 01:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠:
我刚看了几天两本教材,现在开始实验了。
在GPIO中断示例中,有这样一句--注意:最后需要在中断向量表中相应的位置添加中断服务函数指针。请问如何添加,怎么没仔细说啊?菜鸟不懂,请赐教。

相关帖子

沙发
6019实验室|  楼主 | 2010-2-21 01:06 | 只看该作者
请看例程:

// GPIO_Interrupt.C
// GPIO端口中断编程示例

#include <hw_types.h>
#include <hw_memmap.h>
#include <hw_ints.h>
#include <hw_sysctl.h>
#include <hw_gpio.h>
#include <interrupt.h>
#include <sysctl.h>
#include <gpio.h>

/* 将较长的标识符定义成较短的形式 */
#define SysCtlPeriEn SysCtlPeripheralEnable
#define SysCtlPeriDis SysCtlPeripheralDisable
#define GPIOPinTypeIn GPIOPinTypeGPIOInput
#define GPIOPinTypeOut GPIOPinTypeGPIOOutput

/* 定义按键 */
#define KEY_PORT SYSCTL_PERIPH_GPIOA
#define KEY_PIN GPIO_PORTA_BASE , GPIO_PIN_4
#define keyGet( ) GPIOPinRead(KEY_PIN)

/* 定义LED */
#define LED_PORT SYSCTL_PERIPH_GPIOC
#define LED_PIN GPIO_PORTC_BASE , GPIO_PIN_5
#define ledOn( ) GPIOPinWrite(LED_PIN , 0 << 5)
#define ledOff( ) GPIOPinWrite(LED_PIN , 1 << 5)

/* 定义PD4和PD5管脚 */
#define PD4 GPIO_PORTD_BASE , GPIO_PIN_4
#define PD5 GPIO_PORTD_BASE , GPIO_PIN_5
#define PD4_PD5 GPIO_PORTD_BASE , GPIO_PIN_4 | GPIO_PIN_5

/* 防止JTAG失效 */
void jtagWait(void)
{
SysCtlPeriEn(KEY_PORT); /* 使能KEY所在的GPIO端口 */
GPIOPinTypeIn(KEY_PIN); /* 设置KEY所在的管脚为输入 */
if ( keyGet( ) == 0x00 ) { /* 如果复位时按下KEY,则进入 */
for (;;); /* 死循环,以等待JTAG连接 */
}
SysCtlPeriDis(KEY_PORT); /* 禁止KEY所在的GPIO端口 */
}

int main(void)
{
jtagWait( ); /* 防止JTAG失效,重要! */

SysCtlPeriEn(LED_PORT); /* 使能LED所在的GPIO端口 */
GPIOPinTypeOut(LED_PIN); /* 设置LED所在管脚为输出模式 */
ledOn( ); /* 点亮LED */

SysCtlPeriEn(SYSCTL_PERIPH_GPIOD); /* 使能GPIOD端口 */
GPIOPinTypeIn(PD4_PD5); /* 设置PD4和PD5管脚为输入 */

GPIOIntTypeSet(PD4_PD5 , GPIO_FALLING_EDGE); /* 设置PD4和PD5的中断类型 */
GPIOPinIntEnable(PD4_PD5); /* 使能PD4和PD5中断 */
IntEnable(INT_GPIOD); /* 使能GPIOD总中断 */
IntMasterEnable( ); /* 使能处理器中断 */

for (;;) {
}
}

/* GPIOD的中断服务函数 */
void GPIO_Port_D_ISR(void)
{
if ( GPIOPinIntStatus(PD4) != 0 ) { /* 如果PD4的中断状态有效 */
GPIOPinIntClear(PD4); /* 清除PD4中断,重要! */
ledOn( ); /* 点亮LED */
}

if ( GPIOPinIntStatus(PD5) != 0 ) { /* 如果PD5的中断状态有效 */
GPIOPinIntClear(PD5); /* 清除PD5中断,重要! */
ledOff( ); /* 熄灭LED */
}
}



// startup.c
//*****************************************************************************
//
// startup.c - Boot code for Stellaris.
//
// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved.
//
// Software License Agreement
//
// Luminary Micro, Inc. (LMI) is supplying this software for use solely and
// exclusively on LMI's microcontroller products.
//
// The software is owned by LMI and/or its suppliers, and is protected under
// applicable copyright laws. All rights are reserved. You may not combine
// this software with "viral" open-source software in order to form a larger
// program. Any use in violation of the foregoing restrictions may subject
// the user to criminal sanctions under applicable laws, as well as to civil
// liability for the breach of the terms and conditions of this license.
//
// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
//
// This is part of revision 1928 of the Stellaris Peripheral Driver Library.
//
//*****************************************************************************

//*****************************************************************************
//
// Enable the IAR extensions for this source file.
//
//*****************************************************************************
#pragma language=extended

//*****************************************************************************
//
// Forward declaration of the default fault handlers.
//
//*****************************************************************************
void ResetISR(void);
static void NmiSR(void);
static void FaultISR(void);
static void IntDefaultHandler(void);

//*****************************************************************************
//
// The entry point for the application.
//
//*****************************************************************************
extern int main(void);
extern void GPIO_Port_D_ISR(void);
//*****************************************************************************
//

使用特权

评论回复
板凳
6019实验室|  楼主 | 2010-2-21 01:06 | 只看该作者
// Reserve space for the system stack.
//
//*****************************************************************************
#ifndef STACK_SIZE
#define STACK_SIZE 256
#endif
static unsigned long pulStack[STACK_SIZE];

//*****************************************************************************
//
// A union that describes the entries of the vector table. The union is needed
// since the first entry is the stack pointer and the remainder are function
// pointers.
//
//*****************************************************************************
typedef union
{
void (*pfnHandler)(void);
unsigned long ulPtr;
}
uVectorEntry;

//*****************************************************************************
//
// The minimal vector table for a Cortex M3. Note that the proper constructs
// must be placed on this to ensure that it ends up at physical address
// 0x0000.0000.
//
//*****************************************************************************
__root const uVectorEntry g_pfnVectors[] @ "INTVEC" =
{
{ .ulPtr = (unsigned long)pulStack + sizeof(pulStack) },
// The initial stack pointer
ResetISR, // The reset handler
NmiSR, // The NMI handler
FaultISR, // The hard fault handler
IntDefaultHandler, // The MPU fault handler
IntDefaultHandler, // The bus fault handler
IntDefaultHandler, // The usage fault handler
0, // Reserved
0, // Reserved
0, // Reserved
0, // Reserved
IntDefaultHandler, // SVCall handler
IntDefaultHandler, // Debug monitor handler
0, // Reserved
IntDefaultHandler, // The PendSV handler
IntDefaultHandler, // The SysTick handler
IntDefaultHandler, // GPIO Port A
IntDefaultHandler, // GPIO Port B
IntDefaultHandler, // GPIO Port C
GPIO_Port_D_ISR, // GPIO Port D
IntDefaultHandler, // GPIO Port E
IntDefaultHandler, // UART0 Rx and Tx
IntDefaultHandler, // UART1 Rx and Tx
IntDefaultHandler, // SSI Rx and Tx
IntDefaultHandler, // I2C Master and Slave
IntDefaultHandler, // PWM Fault
IntDefaultHandler, // PWM Generator 0
IntDefaultHandler, // PWM Generator 1
IntDefaultHandler, // PWM Generator 2
IntDefaultHandler, // Quadrature Encoder
IntDefaultHandler, // ADC Sequence 0
IntDefaultHandler, // ADC Sequence 1
IntDefaultHandler, // ADC Sequence 2
IntDefaultHandler, // ADC Sequence 3
IntDefaultHandler, // Watchdog timer
IntDefaultHandler, // Timer 0 subtimer A
IntDefaultHandler, // Timer 0 subtimer B
IntDefaultHandler, // Timer 1 subtimer A
IntDefaultHandler, // Timer 1 subtimer B
IntDefaultHandler, // Timer 2 subtimer A
IntDefaultHandler, // Timer 2 subtimer B
IntDefaultHandler, // Analog Comparator 0
IntDefaultHandler, // Analog Comparator 1
IntDefaultHandler, // Analog Comparator 2
IntDefaultHandler, // System Control (PLL, OSC, BO)
IntDefaultHandler, // FLASH Control
IntDefaultHandler, // GPIO Port F
IntDefaultHandler, // GPIO Port G
IntDefaultHandler, // GPIO Port H
IntDefaultHandler, // UART2 Rx and Tx
IntDefaultHandler, // SSI1 Rx and Tx
IntDefaultHandler, // Timer 3 subtimer A
IntDefaultHandler, // Timer 3 subtimer B
IntDefaultHandler, // I2C1 Master and Slave
IntDefaultHandler, // Quadrature Encoder 1
IntDefaultHandler, // CAN0
IntDefaultHandler, // CAN1
IntDefaultHandler, // CAN2
IntDefaultHandler, // Ethernet
IntDefaultHandler // Hibernate
};

//*****************************************************************************
//
// The following are constructs created by the linker, indicating where the
// the "data" and "bss" segments reside in memory. The initializers for the
// for the "data" segment resides immediately following the "text" segment.
//
//*****************************************************************************
#pragma segment="DATA_ID"
#pragma segment="DATA_I"
#pragma segment="DATA_Z"

//*****************************************************************************
//
// This is the code that gets called when the processor first starts execution
// following a reset event. Only the absolutely necessary set is performed,
// after which the application supplied main() routine is called. Any fancy
// actions (such as making decisions based on the reset cause register, and
// resetting the bits in that register) are left solely in the hands of the
// application.
//
//*****************************************************************************
void
ResetISR(void)
{
unsigned long *pulSrc, *pulDest, *pulEnd;

//
// Copy the data segment initializers from flash to SRAM.
//
pulSrc = __segment_begin("DATA_ID");
pulDest = __segment_begin("DATA_I");
pulEnd = __segment_end("DATA_I");
while(pulDest < pulEnd)
{
*pulDest++ = *pulSrc++;
}

//
// Zero fill the bss segment.
//
pulDest = __segment_begin("DATA_Z");
pulEnd = __segment_end("DATA_Z");
while(pulDest < pulEnd)
{
*pulDest++ = 0;
}

//
// Call the application's entry point.
//
main();
}

//*****************************************************************************
//
// This is the code that gets called when the processor receives a NMI. This
// simply enters an infinite loop, preserving the system state for examination
// by a debugger.
//
//*****************************************************************************
static void
NmiSR(void)
{
//
// Enter an infinite loop.
//
while(1)
{
}
}

//*****************************************************************************
//
// This is the code that gets called when the processor receives a fault
// interrupt. This simply enters an infinite loop, preserving the system state
// for examination by a debugger.
//
//*****************************************************************************
static void
FaultISR(void)
{
//
// Enter an infinite loop.
//
while(1)
{
}
}

//*****************************************************************************
//
// This is the code that gets called when the processor receives an unexpected
// interrupt. This simply enters an infinite loop, preserving the system state
// for examination by a debugger.
//
//*****************************************************************************
static void
IntDefaultHandler(void)
{
//
// Go into an infinite loop.
//
while(1)
{
}
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

121

主题

470

帖子

0

粉丝