не грусти - похрусти вот накидал для LPC2129:
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // file: main.c #include#include #include "init.h" #include "isr.h" // ........................................................................... __arm void main(void) { mam_Init(); pll_Init(); gpio_Init(); __disable_interrupt(); vic_Init(); tmr_Init(); __enable_interrupt(); while (1) { //сделаем хоть что-нибудь: // цифровой выход на осциллограф - меандр с периодом (примерно) 600нс IO0SET = 0x20; IO0CLR = 0x20; } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // file: isr.c #ifndef _isr_c_ #define _isr_c_ #include void vic_Init(void); static void isr_Timer0(void); // --------------------------------------------------------------------------- __arm void vic_Init(void) { VICProtection = 0x1; VICIntEnClear = 0xFFFFFFFF; // запретим все прерывания VICIntSelect = 0x0; // прерывание классифицировано как IRQ (по умолчанию) // настройка вектора прерываний от таймера: VICVectCntl0 = 0x24; // преравание от 4 канала установим как IRQ // и назначим его на слот 0 контроллера VICVectAddr = 0x0; VICVectAddr0 = (unsigned int) &isr_Timer0; //собственно вектор VICIntEnable = 0x10; // разрешение прерывания от канала 4 (таймер 0) VICProtection = 0x0; return; } // --------------------------------------------------------------------------- // обработчик прерывания от таймера // (сосредоточим всю мощь АРМ'а на 2-х светодиодах ;) __arm static void isr_Timer0(void) { // светодиод зеленый: if(T0IR & 0x01) { if(IO0PIN&0x10) // оценим уровень на выходе порта { IO0CLR = 0x10; // включить зеленый светодиод } else { IO0SET = 0x10; // выключить зеленый светодиод } } //светодиод красный: if(T0IR & 0x02) { if(IO0PIN&0x80) // оценим уровень на выходе порта { IO0CLR = 0x80; // включить красный светодиод } else { IO0SET = 0x80; // выключить красный светодиод } } T0IR = 0x03; // сбросим внутренние IF флаги таймера каналов MR0, MR1 return; } #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // file: init.c #ifndef _init_c_ #define _init_c_ #include void pll_Init(void); void mam_Init(void); void gpio_Init(void); void tmr_Init(void); // --------------------------------------------------------------------------- // инициализация модуля MAM __arm void mam_Init(void) { MAMTIM = 3; //установим 3 цикла ожидания, поскольку Fpclk > 40МГц MAMCR = 2; //MAM будет использоваться в полном режиме return; } // --------------------------------------------------------------------------- // инициализация модуля PLL __arm void pll_Init(void) { PLLCON = 0x01; // установим разрешение PLL, но без подключения к ядру PLLCFG = 0x05; // Коэфф. умножения частоты кварца: PLLCFG+1 = 6. // Частота кварца Fosc = 11.0592 Мгц, отсюда следует: // внутренняя частота тактирования (с выхода PLL): // Fpclk = 11.059 * 6 = 66.3552 Мгц PLLFEED = 0xAA; // произведем PLLFEED = 0x55; // фиксирующую последовательность while (!(PLLSTAT&0x400)); // не льсти себе, подождем захвата петли PLL PLLCON = 0x03; // установим разрешение PLL и подключение ее выход pclk к ядру PLLFEED = 0xAA; // еще раз запускаем PLLFEED = 0x55; // фиксирующую последовательность return; } // --------------------------------------------------------------------------- // инициализация портов __arm void gpio_Init(void) { IO0DIR = 0xB0; // выводы порта P0 4,5, 7 установлены на выход, все остальное - на вход IO0SET = 0x90; return; } // --------------------------------------------------------------------------- // инициализация таймера __arm void tmr_Init(void) { T0MR0 = 4000000; // период срабатывания 0-го канала (взят произвольно) T0MR1 = 2000000; // период срабатывания 1-го канала (взят произвольно) T0MCR = 0xB; // для канала МR0: разрешено прерывание и сброс // для канала МR1: разрешено прерывание T0PR = 0x01; // предделитель на 2 T0TC = 0x00; // сброс счетчика T0TCR = 0x01; // запуск таймера0 return; } #endif // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // file: vectors.c #ifndef _vectors_c_ #define _vectors_c_ #include #include "isr.h" // --------------------------------------------------------------------------- // IRQ. #pragma vector=0x18 __irq __arm void isr_handler_irq(void) { void (*interrupt_function)(); unsigned int vector; vector = VICVectAddr; // возьмем вектор обработки прерывания interrupt_function = (void(*)())vector; // настроим указатель на функцию обработки по вектору (*interrupt_function)(); // вызов функции обработки прерывания по вектору VICVectAddr = 0; } // --------------------------------------------------------------------------- // FIG. #pragma vector=0x1C __fiq __arm void isr_handler_fig(void) { // пустой... VICVectAddr = 0; } #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // file: init.h #ifndef _init_h_ #define _init_h_ extern void pll_Init(void); extern void mam_Init(void); extern void gpio_Init(void); extern void tmr_Init(void); #endif // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // file: isr.h #ifndef _isr_h_ #define _isr_h_ extern void vic_Init(void); #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
- Спасибо большое а то совсем замучался с этими настройками а в ИАРе примеров нормальных нет - Ivan S(22.11.2005 11:13, )
- => - blackbit(22.11.2005 10:53, , ссылка)