gcc + lpc21isp и при этом запуск программы из RAM в LPC2000.
Как-то все у меня не получалось запускать программу из RAM в LPC2103 Read more…
- June 6th
- No Comments
Как-то все у меня не получалось запускать программу из RAM в LPC2103 Read more…
Проковырялся с прерываниями на LPC2103 больше недели (периодически это забрасывая и потом снова к этому возвращаясь). У меня прерывания либо выполнялось только 1 раз, после него только более высокоприоритетное, либо прерывание “зацикливалось”.
Компилирую я естественно GCC, ибо денег на коммерческие среды разработки и компиляторы мне жалко.
Оказалось что чтобы прерывание завершить нужно сбросить адрес прерывания в VIC (VICVectAddr=0) и сбросить прерывание в той части контроллера которая его вызвала (например в таймере).
Вот пример для таймера и EINT
void __attribute__((interrupt(”IRQ”))) TMR_ISR( void ) {
IOSET = (1<
VICVectAddr = 0; //Сбрасываем interrupt из VIC
}
void __attribute__((interrupt(”IRQ”))) EINT0_ISR( void ) {
IOSET = (1<
VICVectAddr = 0; // из VIC тоже сбросить
}
А повесить прерывание на EINT0 вот так:
PINSEL1 |= (1<<0); // Пишем 1 в 0й разряд
PINSEL1 &= ~(1<<1); // и 0 в 1й, чтобы сказать что эта нога камня будет у нас EINT0
EXTINT |= (1<<0); // Разрешаем генерить прерывания
VICIntSelect &= ~(1<
VICVectAddr3 = (uint32_t)EINT0_ISR; // Указываем какая функция будет его обрабатывать.
T1TCR = TCR_RESET; // выключаем и сбрасываем таймер
T1PR=500; // выставляем прескалер
T1TC=0; // Сбрасываем таймер в 0 (наверное не обязательно)
T1MR0=0×0000ffff; // как только досчитает до 0xffff сработает match register0
T1MCR|=(1<<0); // и вызовит прерывание
//T1MCR|=(1<<2); // а еще он может сброс сделать
T1MR1=0×0002ffff; // А когда досчитает до 2ffff сработает MR1
T1MCR|=(1<<3); // И тоже вызовит прерывание
T1TCR = TCR_ENABLE; // включаем таймер
VICIntSelect &= ~(1<
VICVectAddr4 = (uint32_t)TMR_ISR;
вот так прерывания будут срабатывать и корректно завершаться :)
Как-то несколько месяцев назад у меня возникла идея создания “умного дома”. Для реализации хотя-бы части всех скопившихся идей естественно необходимо разрабатывать железки. В настоящий момент самым разумными вариантами являются Микроконтроллеры и ПЛИС(FPGA) Read more…
У любого провайдера рано или поздно появляеться необходимость настраивать шейпер. У некоторых провайдеров это просто полисеры для абонентов (если внешний канал резиновый), а у других это достаточно сложный шейпер, который делит канал на основе приоритетов.
Однажды мне потребовалось создать шейпер на 200-300 мегабит, 50k pps и 15k пользователей. Read more…