Цитата(vladimir_orl @ Feb 3 2014, 16:54)

Может ссылку дадите?
На LPCWare тоже смотрел. Там тоже сразу с lib-ов начинается.
Спасибо, буду искать "букварь" по LPC...
Попроситесь в свои. На ftp лежит.
Можно тут посмотреть
http://kinozal.tv/details.php?id=928594 (естественно с регистрацией), могу на файлобменник скинуть.
В CORTEXax для обслуживания прерываний используется NVIC. Для работы с ним необх. несколько простых процедур:
CODE
/*************************************************************************
*
* Used with ICCARM and AARM.
*
* © Copyright IAR Systems 2009
*
* File name : irq.c
* Description : Nested Vectored Interrup Controller fuctions
*
******************************************************************************/
/*************************************************************************
* Function Name: NVIC_IntEnable
* Parameters: IntNumber - Interrup number
* Return: void
*
* Description: Enable interrup at NVIC
*
*
*************************************************************************/
void NVIC_IntEnable(unsigned int IntNumber)
{
if(IntNumber>31) return;
NVIC_ISER = (1UL<<IntNumber);
}
/*************************************************************************
* Function Name: NVIC_IntDisable
* Parameters: IntNumber - Interrup number
* Return: void
*
* Description: Disables interrup at NVIC
*
*
*************************************************************************/
void NVIC_IntDisable(unsigned int IntNumber)
{
if(IntNumber>31) return;
NVIC_ICER = (1UL<<IntNumber);
}
/*************************************************************************
* Function Name: NVIC_ClrPend
* Parameters: IntNumber - Interrup number
* Return: void
*
* Description:Clear pending interrupt at NVIC
*
*
*************************************************************************/
void NVIC_ClrPend(unsigned int IntNumber)
{
if(IntNumber>31) return;
NVIC_ICPR = (1UL<<IntNumber);
}
/*************************************************************************
* Function Name: NVIC_ClrPend
* Parameters: IntNumber - Interrup number, Interrupt Priority
* Return: void
*
* Description:Sets Interrupt priority
*
*
*************************************************************************/
void NVIC_IntPri(unsigned int IntNumber, unsigned char Priority)
{
if(IntNumber>31) return;
volatile unsigned char * pNVIC_IntPri = (unsigned char *)&NVIC_IPR0;
pNVIC_IntPri += IntNumber;
*pNVIC_IntPri = Priority&0x3;
}
void install_irq(unsigned int IntNumber, unsigned int Priority)
{
NVIC_IntDisable(IntNumber);
NVIC_IntPri(IntNumber, Priority);
NVIC_IntEnable(IntNumber);
NVIC_ClrPend(IntNumber);
}
/******************************************************************************
** End Of File
******************************************************************************/
Гдето в файле описания регистров вашего мк находите номера прерываний (пример для mkl15):
CODE
/** Interrupt Number Definitions */
typedef enum {
INT_Initial_Stack_Pointer = 0, /**< Initial stack pointer */
INT_Initial_Program_Counter = 1, /**< Initial program counter */
INT_NMI = 2, /**< Non-maskable interrupt */
INT_Hard_Fault = 3, /**< Hard fault exception */
INT_Reserved4 = 4, /**< Reserved interrupt 4 */
INT_Reserved5 = 5, /**< Reserved interrupt 5 */
INT_Reserved6 = 6, /**< Reserved interrupt 6 */
INT_Reserved7 = 7, /**< Reserved interrupt 7 */
INT_Reserved8 = 8, /**< Reserved interrupt 8 */
INT_Reserved9 = 9, /**< Reserved interrupt 9 */
INT_Reserved10 = 10, /**< Reserved interrupt 10 */
INT_SVCall = 11, /**< A supervisor call exception */
INT_Reserved12 = 12, /**< Reserved interrupt 12 */
INT_Reserved13 = 13, /**< Reserved interrupt 13 */
INT_PendableSrvReq = 14, /**< PendSV exception - request for system level service */
INT_SysTick = 15, /**< SysTick interrupt */
INT_DMA0 = 16, /**< DMA channel 0 transfer complete/error interrupt */
INT_DMA1 = 17, /**< DMA channel 1 transfer complete/error interrupt */
INT_DMA2 = 18, /**< DMA channel 2 transfer complete/error interrupt */
INT_DMA3 = 19, /**< DMA channel 3 transfer complete/error interrupt */
INT_Reserved20 = 20, /**< Reserved interrupt 20 */
INT_FTFA = 21, /**< FTFA command complete/read collision interrupt */
INT_LVD_LVW = 22, /**< Low Voltage Detect, Low Voltage Warning */
INT_LLW = 23, /**< Low Leakage Wakeup */
INT_I2C0 = 24, /**< I2C0 interrupt */
INT_I2C1 = 25, /**< I2C0 interrupt 25 */
INT_SPI0 = 26, /**< SPI0 interrupt */
INT_SPI1 = 27, /**< SPI1 interrupt */
INT_UART0 = 28, /**< UART0 status/error interrupt */
INT_UART1 = 29, /**< UART1 status/error interrupt */
INT_UART2 = 30, /**< UART2 status/error interrupt */
INT_ADC0 = 31, /**< ADC0 interrupt */
INT_CMP0 = 32, /**< CMP0 interrupt */
INT_TPM0 = 33, /**< TPM0 fault, overflow and channels interrupt */
INT_TPM1 = 34, /**< TPM1 fault, overflow and channels interrupt */
INT_TPM2 = 35, /**< TPM2 fault, overflow and channels interrupt */
INT_RTC = 36, /**< RTC interrupt */
INT_RTC_Seconds = 37, /**< RTC seconds interrupt */
INT_PIT = 38, /**< PIT timer interrupt */
INT_Reserved39 = 39, /**< Reserved interrupt 39 */
INT_USB0 = 40, /**< USB0 interrupt */
INT_DAC0 = 41, /**< DAC0 interrupt */
INT_TSI0 = 42, /**< TSI0 interrupt */
INT_MCG = 43, /**< MCG interrupt */
INT_LPTimer = 44, /**< LPTimer interrupt */
INT_Reserved45 = 45, /**< Reserved interrupt 45 */
INT_PORTA = 46, /**< Port A interrupt */
INT_PORTD = 47 /**< Port D interrupt */
} IRQInterruptIndex;
Прерывания, обслуживаемые NVIC начинаются с прерывания #16 - INT_DMA0
Поэтому номер прерывания необходимо передавать как номер инсталлируемого прерывания-16
Или преопределить номера так:
CODE
/* Interrupt Vector Table Function Pointers */
#define DMA0_irq_no 0 // Vector No 16 /**< DMA channel 0 transfer complete/error interrupt */
#define DMA1_irq_no 1 // Vector No 17 /**< DMA channel 1 transfer complete/error interrupt */
#define DMA2_irq_no 2 // Vector No 18 /**< DMA channel 2 transfer complete/error interrupt */
#define DMA3_irq_no 3 // Vector No 19 /**< DMA channel 3 transfer complete/error interrupt */
#define FTFA_irq_no 5 // Vector No 21 /**< FTFA command complete/read collision interrupt */
#define LVD_irq_no 6 // Vector No 22 /**< Low Voltage Detect, Low Voltage Warning */
#define LLWU_irq_no 7 // Vector No 23 /**< Low Leakage Wakeup */
#define I2C0_irq_no 8 // Vector No 24 /**< I2C0 interrupt */
#define I2C1_irq_no 9 // Vector No 25 /**< I2C0 interrupt 25 */
#define SPI0_irq_no 10 // Vector No 26 /**< SPI0 interrupt */
#define SPI1_irq_no 11 // Vector No 27 /**< SPI1 interrupt */
#define UART0SE_irq_no 12 // Vector No 28 /**< UART0 status/error interrupt */
#define UART1SE_irq_no 13 // Vector No 29 /**< UART1 status/error interrupt */
#define UART2SE_irq_no 14 // Vector No 30 /**< UART2 status/error interrupt */
#define ADC0_irq_no 15 // Vector No 31 /**< ADC0 interrupt */
#define CMP0_irq_no 16 // Vector No 32 /**< CMP0 interrupt */
#define FTM0_irq_no 17 // Vector No 33 /**< TPM0 fault, overflow and channels interrupt */
#define FTM1_irq_no 18 // Vector No 34 /**< TPM1 fault, overflow and channels interrupt */
#define FTM2_irq_no 19 // Vector No 35 /**< TPM2 fault, overflow and channels interrupt */
#define RTCA_irq_no 20 // Vector No 36 /**< RTC interrupt */
#define RTCS_irq_no 21 // Vector No 37 /**< RTC seconds interrupt */
#define PIT_irq_no 22 // Vector No 38 /**< PIT timer interrupt */
#define USBOTG_irq_no 24 // Vector No 40 /**< USB0 interrupt */
#define DAC_irq_no 25 // Vector No 41 /**< DAC0 interrupt */
#define TSI_irq_no 26 // Vector No 42 /**< TSI0 interrupt */
#define MCG_irq_no 27 // Vector No 43 /**< MCG interrupt */
#define LPTMR_irq_no 28 // Vector No 44 /**< LPTimer interrupt */
#define PortA_irq_no 30 // Vector No 46 /**< Port A interrupt */
#define PortD_irq_no 31 // Vector No 47 /**< Port D interrupt */
2 эквивалентных варианта инсталляции прерывания
Код
install_irq(INT_UART2-16, 0);
install_irq(UART2SE_irq_no, 0);
Самое интересно - это правильно расположить обработчики прерываний в программе.
Для этого необходимо определить таблицу векторов прерываний, расположив её по адресу .intvec:
CODE
#pragma language=extended
#pragma segment="CSTACK"
typedef void (*vector_entry)(void);
typedef union { vector_entry __fun; void * __ptr; } intvec_elem;
const intvec_elem __vector_table[] @ ".intvec" =
{
{ .__ptr = __sfe( "CSTACK" ) }, /* Initial SP */
VECTOR_001, /* Initial PC */
VECTOR_002,
VECTOR_003,
VECTOR_004,
VECTOR_005,
VECTOR_006,
VECTOR_007,
VECTOR_008,
VECTOR_009,
VECTOR_010,
VECTOR_011,
VECTOR_012,
VECTOR_013,
VECTOR_014,
VECTOR_015,
VECTOR_016,
VECTOR_017,
VECTOR_018,
VECTOR_019,
VECTOR_020,
VECTOR_021,
VECTOR_022,
VECTOR_023,
VECTOR_024,
VECTOR_025,
VECTOR_026,
VECTOR_027,
VECTOR_028,
VECTOR_029,
VECTOR_030,
VECTOR_031,
VECTOR_032,
VECTOR_033,
VECTOR_034,
VECTOR_035,
VECTOR_036,
VECTOR_037,
VECTOR_038,
VECTOR_039,
VECTOR_040,
VECTOR_041,
VECTOR_042,
VECTOR_043,
VECTOR_044,
VECTOR_045,
VECTOR_046,
VECTOR_047,
};
Также ранее переопределить VECTOR_xxx
CODE
// Address Vector IRQ Source module Source description
#define VECTOR_001 __startup // 0x0000_0004 1 - ARM core Initial Program Counter
#define VECTOR_002 default_isr // 0x0000_0008 2 - ARM core Non-maskable Interrupt (NMI)
#define VECTOR_003 default_isr // 0x0000_000C 3 - ARM core Hard Fault
#define VECTOR_004 default_isr // 0x0000_0010 4 -
#define VECTOR_005 default_isr // 0x0000_0014 5 -
#define VECTOR_006 default_isr // 0x0000_0018 6 -
#define VECTOR_007 default_isr // 0x0000_001C 7 -
#define VECTOR_008 default_isr // 0x0000_0020 8 -
#define VECTOR_009 default_isr // 0x0000_0024 9 -
#define VECTOR_010 default_isr // 0x0000_0028 10 -
#define VECTOR_011 default_isr // 0x0000_002C 11 - ARM core Supervisor call (SVCall)
#define VECTOR_012 default_isr // 0x0000_0030 12 -
#define VECTOR_013 default_isr // 0x0000_0034 13 -
#define VECTOR_014 default_isr // 0x0000_0038 14 - ARM core Pendable request for system service (PendableSrvReq)
#define VECTOR_015 default_isr // 0x0000_003C 15 - ARM core System tick timer (SysTick)
#define VECTOR_016 default_isr // 0x0000_0040 16 0 DMA DMA Channel 0 transfer complete and error
#define VECTOR_017 default_isr // 0x0000_0044 17 1 DMA DMA Channel 1 transfer complete and error
#define VECTOR_018 default_isr // 0x0000_0048 18 2 DMA DMA Channel 2 transfer complete and error
#define VECTOR_019 default_isr // 0x0000_004C 19 3 DMA DMA Channel 3 transfer complete and error
#define VECTOR_020 default_isr // 0x0000_0050 20
#define VECTOR_021 default_isr // 0x0000_0054 21 5 FTFA Command complete and read collision
#define VECTOR_022 default_isr // 0x0000_0058 22 6 PMC Low Voltage detect, low-voltage warning
#define VECTOR_023 default_isr // 0x0000_005C 23 7 LLWU Low Leakage Wakeup
#define VECTOR_024 default_isr // 0x0000_0060 24 8 IIC0
#define VECTOR_025 default_isr // 0x0000_0064 25 9 IIC1
#define VECTOR_026 default_isr // 0x0000_0068 26 10 SPI0 Single interrupt vector for all sources
#define VECTOR_027 default_isr // 0x0000_006C 27 11 SPI1 Single interrupt vector for all sources
#define VECTOR_028 default_isr // 0x0000_0070 28 12 UART0 Status and error
#define VECTOR_029 default_isr // 0x0000_0074 29 13 UART1 Status and error
#define VECTOR_030 default_isr // 0x0000_0078 30 14 UART2 Status and error
#define VECTOR_031 default_isr // 0x0000_007C 31 15 ADC0
#define VECTOR_032 default_isr // 0x0000_0080 32 16 CMP0
#define VECTOR_033 default_isr // 0x0000_0084 33 17 TPM0
#define VECTOR_034 default_isr // 0x0000_0088 34 18 TPM1
#define VECTOR_035 default_isr // 0x0000_008C 35 19 TPM2
#define VECTOR_036 default_isr // 0x0000_0090 36 20 RTC Alarm interrupt
#define VECTOR_037 default_isr // 0x0000_0094 37 21 RTC Seconds interrupt
#define VECTOR_038 default_isr // 0x0000_0098 38 22 PIT Single interrupt vector for all channels
#define VECTOR_039 default_isr // 0x0000_009C 39 23
#define VECTOR_040 default_isr // 0x0000_00A0 40 24 USB OTG
#define VECTOR_041 default_isr // 0x0000_00A4 41 25 DAC0
#define VECTOR_042 default_isr // 0x0000_00A8 42 26 TSI0
#define VECTOR_043 default_isr // 0x0000_00AC 43 27 MCG
#define VECTOR_044 default_isr // 0x0000_00B0 44 28 LPTMR0
#define VECTOR_045 default_isr // 0x0000_00B4 45 29
#define VECTOR_046 default_isr // 0x0000_00B8 46 30 Port Control Module Pin detect (Port A)
#define VECTOR_047 default_isr // 0x0000_00BC 47 31 Port Control Moudle Pin detect (Port D)
#define VECTOR_PADDING (pointer*)0xffffffff/*not used*/
//тут переопределяем реальные вектора прерываний
extern void UART2_IRQHandler(void);
#undef VECTOR_030
#define VECTOR_030 UART2_IRQHandler
В некоторых примерах названия обработчиков прерываний и их расположение во flash определены в стартапе, а в некоторых необходимо вот таким образом всё определять.
В итоге если всё правильно сделаете, то в этой таблице будут находится адреса всех обработчиков прерываний. Если вектор прерывания не определён, то в соотв. позици будет адрес default_isr, иначе адрес реального обработчика прерывания (UART2_IRQHandler).