123kill12 0 10 июля, 2010 Опубликовано 10 июля, 2010 (изменено) · Жалоба #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) Изменено 10 июля, 2010 пользователем aaarrr Оформление цитаты исходника Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 10 июля, 2010 Опубликовано 10 июля, 2010 · Жалоба Программы нужно начинать писать с пяти, максимум с 10 строчек. Причем писать самому, а не копипастить какие-то примеры. И все получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DpInRock 0 10 июля, 2010 Опубликовано 10 июля, 2010 · Жалоба Причина неработы - невнимательный копипаст.(Пару-тройку нужных процедур не хватат). И по моему имху - вообще ничего не должно работать. По крайней мере прерывания - не должны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
123kill12 0 10 июля, 2010 Опубликовано 10 июля, 2010 · Жалоба но они работают. я раньше не работал с ARM вообще. поэтому и спрашиваю может что забыл какой нить флаг. с прерываниями не сложно настроил и разрешил. таймер пашит, а int0 нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 10 июля, 2010 Опубликовано 10 июля, 2010 · Жалоба но они работают. Только в Ваших грезах :(. DpInRock прав - не могут работать прерывания, поскольку они, как минимум, запрещены. Остальную белиберду вообще читать не имеет смысла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
123kill12 0 10 июля, 2010 Опубликовано 10 июля, 2010 · Жалоба да не наяву. я наблюдаю на плате как диодики моргают. киньте примерный код как запустить внешнее прерывание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 10 июля, 2010 Опубликовано 10 июля, 2010 · Жалоба киньте примерный код как запустить внешнее прерывание. а как кинуть в мозг даташит и перевести в С, ASM или на чем там у Вас? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
123kill12 0 10 июля, 2010 Опубликовано 10 июля, 2010 (изменено) · Жалоба я и делал по даташиту. брал пример через дебаг разбирал что куда и зачем пишется и потом свое писал. тока у меня на плате есть int0 кнопка, а пример у IAR для int2. а с таймерами все работало. Изменено 10 июля, 2010 пользователем 123kill12 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 11 июля, 2010 Опубликовано 11 июля, 2010 · Жалоба бегло так по коду а чего это прерывания разрешаются в самих прерываниях? void TMR0_IRQHandler (void) { T0IR=1; __enable_interrupt(); cnt++; if ( cnt >= 0x20) void EINT0_IRQHandler (void) { IO2INTCLR |= (1<<10); __enable_interrupt(); /* handles nested interrupt */ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 11 июля, 2010 Опубликовано 11 июля, 2010 · Жалоба да не наяву. я наблюдаю на плате как диодики моргают. Тогда не постите исходники не имеющие отношения к реальности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
123kill12 0 11 июля, 2010 Опубликовано 11 июля, 2010 · Жалоба void TR0int(void) { cnt=0; T0MR0=FCCLK_FREQ/200; установливаем MR0 T0MCR=3; разрешение прерывания если MR0 и TC совпадают и сброс TC SETENA0 |= (1<<1); ISER0 записываем 1 в 1 разряд что соответствует разрешению прерывания от timer0 IP0=0; тут не стал нечего придумывать. поставил ноль для всех прерываний T0TCR=1; TCR нулевой бить ставил м в 1 чтоб запустить таймер на счет } void TMR0_IRQHandler (void) { T0IR=1; регистр прерываний. сбрасываем наше самое прерывание по сравнению __enable_interrupt(); это единственное что я не понял, но сча закоментил и без него работало cnt++; CLRPEND0 |= ~(1<<1); записываем в ICPR0 1 в первый разряд } таймер так работает( __enable_interrupt(); и без этой строчки) void ExInt(void) { IO2INTENF |= (1<<10); устанавливаем прерывание IntEnF SETENA0 |= (1<<18); ISER0 записываем 1 в 18 разряд что соответствует разрешению прерывания от int0 } void EINT0_IRQHandler (void) { IO2INTCLR |= (1<<10); очищаем 10 пин intClr __enable_interrupt(); это единственное что я не понял, но сча закоментил и без него работало FIO1PIN=0x80000000; CLRPEND0 |= ~(1<<18); записываем в ICPR0 1 в 18 разряд } нет. но потом вспомнил что у lpc17xx есть прерывания на портах P0 и P2. которые настраиваются но обработка их в int3. может я как раз так настроил а обрабатывать пытаюсь в int0?? и переделал void ExInt(void) { IO2INTENF |= (1<<10); SETENA0 |= (1<<21); } void EINT3_IRQHandler (void) { IO2INTCLR |= (1<<10); // __enable_interrupt(); /* handles nested interrupt */ FIO1PIN=0x80000000; CLRPEND0 |= ~(1<<21); } и заработало. алилуя но возвращаемся в простым int0-int2. как из настроить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 11 июля, 2010 Опубликовано 11 июля, 2010 · Жалоба void EINT0_IRQHandler (void) { IO2INTCLR |= (1<<10); очищаем 10 пин intClr __enable_interrupt(); это единственное что я не понял, но сча закоментил и без него работало FIO1PIN=0x80000000; CLRPEND0 |= ~(1<<18); записываем в ICPR0 1 в 18 разряд } Комментарии написаны там где не надо и их нет где надо. Пока не привыкли стоит одуматься... ПС оформляйте ваши посты в соответствии с общепринятыми здесь нормами - выделяйте исходники в секции кода [ code ] ВАШИ ИСХОДНИКИ [ /code ] (пробелы внутри квадратных скобок не нужны) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DpInRock 0 11 июля, 2010 Опубликовано 11 июля, 2010 · Жалоба Не поленился (хотя это и очень трудно - папка с иаром очень долго у меня открывается) посмотреть реальные исходники. Общее и у ваших и оригинальных конечно есть. Но этого недостаточно. Воин. Будь внимателен при контрол-с контрол-в. Могу дать совет. берете первую строчку исходника и задаете себе вопрос - "а нафига она нужна". После ответа, переходите к следущей строчке. И так до конца файла. Гарантирую полный успех. (Я лично языка Си не знаю и только такой подход помогает таки составлять работающие программы на этом языке). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 12 июля, 2010 Опубликовано 12 июля, 2010 · Жалоба (Я лично языка Си не знаю и только такой подход помогает таки составлять работающие программы на этом языке). Во, блин, до чего народ дошел! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Wano 0 12 июля, 2010 Опубликовано 12 июля, 2010 · Жалоба Скажите,а в каком месте заносится указатель функции прерывания? Или в LPC17 всё не так как в LPC2? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться