|
внешние прерывания. помогите плз |
|
|
|
Jul 10 2010, 18:19
|
Частый гость
 
Группа: Участник
Сообщений: 96
Регистрация: 12-05-10
Пользователь №: 57 217

|
CODE #include <intrinsics.h> #include <stdio.h> #include <nxp/iolpc1766.h>
#include "board.h"
#pragma section=".intvec" #define FCCO_FREQ (300UL MHZ) #define CCKL_DIV (3UL) #define FCCLK_FREQ (FCCO_FREQ/CCKL_DIV) #define FPCLK_FREQ (FCCLK_FREQ/4) #define PCLK FPCLK_FREQ
volatile Int8U LedsState; Int32U Reg;
void InitClock(void) { // 1. Init OSC SCS_bit.OSCRANGE = 0; SCS_bit.OSCEN = 1; // 2. Wait for OSC ready while(!SCS_bit.OSCSTAT); // 3. Disconnect PLL PLL0CON_bit.PLLC = 0; PLL0FEED = 0xAA; PLL0FEED = 0x55; // 4. Disable PLL PLL0CON_bit.PLLE = 0; PLL0FEED = 0xAA; PLL0FEED = 0x55; // 5. Select source clock for PLL CLKSRCSEL_bit.CLKSRC = 1; // Selects the main oscillator as a PLL clock source. PCLKSEL0 = PCLKSEL1 = 0; // other peripherals 100/4 = 25MHz // 6. Set PLL settings 300 MHz PLL0CFG_bit.MSEL = 25-1; PLL0CFG_bit.NSEL = 2-1; PLL0FEED = 0xAA; PLL0FEED = 0x55; // 7. Enable PLL PLL0CON_bit.PLLE = 1; PLL0FEED = 0xAA; PLL0FEED = 0x55; // 8. Wait for the PLL to achieve lock while(!PLL0STAT_bit.PLOCK); // 9. Set clk divider settings CCLKCFG = 3-1; // 1/3 Fpll // 10. Connect the PLL PLL0CON_bit.PLLC = 1; PLL0FEED = 0xAA; PLL0FEED = 0x55; }
void GpioInit(void) { // Set to inputs FIO0DIR = \ FIO1DIR = \ FIO2DIR = \ FIO3DIR = \ FIO4DIR = 0;
// clear mask registers FIO0MASK =\ FIO1MASK =\ FIO2MASK =\ FIO3MASK =\ FIO4MASK = 0;
// Reset all GPIO pins to default primary function PINSEL0 =\ PINSEL1 =\ PINSEL2 =\ PINSEL3 =\ PINSEL4 =\ PINSEL7 =\ PINSEL8 =\ PINSEL9 = 0; }
Int32U cnt; void TR0int(void) { cnt=0; T0MR0=FCCLK_FREQ/200; T0MCR=3; SETENA0 |= (1<<1); IP0=0; T0TCR=1; }
void ExInt(void) { IO2INTENF |= (1<<10); SETENA0 |= (1<<18); }
void TMR0_IRQHandler (void) { T0IR=1; __enable_interrupt(); cnt++; if ( cnt >= 0x20) { FIO2PIN = Reg; Reg=Reg<<1; if(Reg>128) { FIO2PIN=0; Reg=4; } cnt = 0; } CLRPEND0 |= ~(1<<1); }
void EINT0_IRQHandler (void) { IO2INTCLR |= (1<<10); __enable_interrupt(); /* handles nested interrupt */ FIO1PIN=0x80000000; CLRPEND0 |= ~(1<<18); }
int main(void) { // Flash accelerator init FLASHCFG = (0x5UL<<12) | 0x3AUL; // Init clock InitClock(); #if FCCLK_FREQ < 20000000 FLASHCFG = (0x0UL<<12) | 0x3AUL; #elif FCCLK_FREQ < 40000000 FLASHCFG = (0x1UL<<12) | 0x3AUL; #elif FCCLK_FREQ < 60000000 FLASHCFG = (0x2UL<<12) | 0x3AUL; #elif FCCLK_FREQ < 80000000 FLASHCFG = (0x3UL<<12) | 0x3AUL; #elif FCCLK_FREQ < 100000000 FLASHCFG = (0x4UL<<12) | 0x3AUL; #endif Reg=4; // Init GPIO GpioInit(); ExInt(); TR0int();
// Init LEDs FIO2DIR = 0x000000ff; FIO1DIR = 0xF0000000;
while (1) { /* Loop forever */
} }
пограмма написана на подобие примеров IAR. работает все кроме внешнего прерывания. вроде бы все сделал правильно. EINT0 приходится на 10 ножку P2 и флаг разрешения внешнего прерывания 0 находиться на 18 бите регистра разрешений прерываний. в обработчике прерыванию ставлю брейк поинт и нечего нет((( (у меня MT-link)
Сообщение отредактировал aaarrr - Jul 10 2010, 18:24
Причина редактирования: Оформление цитаты исходника
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jul 11 2010, 00:01
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
бегло так по коду а чего это прерывания разрешаются в самих прерываниях? Код void TMR0_IRQHandler (void) { T0IR=1; __enable_interrupt(); cnt++; if ( cnt >= 0x20) Код void EINT0_IRQHandler (void) { IO2INTCLR |= (1<<10); __enable_interrupt(); /* handles nested interrupt */
|
|
|
|
|
Jul 11 2010, 10:24
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(123kill12 @ Jul 11 2010, 12:20)  void EINT0_IRQHandler (void) { IO2INTCLR |= (1<<10); очищаем 10 пин intClr __enable_interrupt(); это единственное что я не понял, но сча закоментил и без него работало FIO1PIN=0x80000000; CLRPEND0 |= ~(1<<18); записываем в ICPR0 1 в 18 разряд } Комментарии написаны там где не надо и их нет где надо. Пока не привыкли стоит одуматься... ПС оформляйте ваши посты в соответствии с общепринятыми здесь нормами - выделяйте исходники в секции кода [ code ] ВАШИ ИСХОДНИКИ [ /code ] (пробелы внутри квадратных скобок не нужны)
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|