Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Вот, например, рабочий код (Кейл):

Отправлено vinogradov aleksei 12 декабря 2007 г. 19:48
В ответ на: Не могу заставить одновременно работать IRQ и FIQ в LPC21x отправлено GW 12 декабря 2007 г. 19:24


//Программа для кварца на 14,7456 МГц
#include
#include

//Инициализация таймера 0
void timer0_init (void)
{
T0PR=58982; //Делить тактовую частоту сигнала с выхода PLL на 58982+1
//и этим сигналом тактировать таймер
T0TCR=2; //Сбросить счетчик и предделитель
T0MCR=3; //При совпадении сбрасывать таймер и генерировать прерывание
T0MR0=250; //Считать до совпадения с числом "250" (получается 250 мС)
T0TCR=1; //Запустить таймер
}

//Инициализизация UART0
void uart0_init (void)
{
PINSEL0=0x00000005; //Подключить RxD0 и TxD0 к UART0
U0LCR=0x83; //8 битов данных,не проверять четность,1 стоп-бит,DLAB -> 1
U0DLL=32; //115200 Бит/Сек., при этом VPB Clock = (14.7456 MHz * 4)
U0DLM=0; //115200 Бит/Сек., при этом VPB Clock = (14.7456 MHz * 4)
U0FCR=0x07; //Разрешить и сбросить FIFO для приемника и передатчика.
//Глубина буферов FIFO - по одному байту на буфер
U0LCR=0x03; //DLAB -> 0
U0IER=0x01; //Разрешить прерывания от UART0 по приему символа и тайм-ауту
}

//Обработчик прерывания по совпадению (Match) в Таймере 0
void FIQ_Handler (void) __fiq
{
if (IOPIN & 0x00008000) IOCLR=0x00008000; else IOSET=0x00008000;
T0IR=T0IR | 0x01; //сбросить флаг прерывания "совпадение по нулевому каналу"
}

//Обработчик прерывания от UART0 (IRQ !)
void uart0_handler (void) __irq
{
IOSET=0x00000100;
if ((U0IIR & 0x01) != 0) {IOSET = 0x00000010; VICVectAddr=0x00000000; return;}
if ((U0IIR & 0x0e) != 4) {IOSET = 0x00000020; VICVectAddr=0x00000000; return;}
if (((U0LSR & 0x02) != 0) | ((U0LSR & 0x04) != 0) | ((U0LSR & 0x08) != 0) |
((U0LSR & 0x10) != 0) | ((U0LSR & 0x80) != 0)) {IOSET = 0x00000040;
VICVectAddr=0x00000000;
return;
}
IOCLR=0x00000070;
if ((IOPIN & 0x00000008) != 0) IOCLR = 0x00000008; // Clear pin P0.0
else IOSET = 0x00000008; // Set pin P0.0
U0THR = U0RBR; //Передать символ хосту
IOCLR=0x00000100;
VICVectAddr=0x00000000;
}

//Функция "Main"
int main (void)
{
//Инициализация портов ввода-вывода
IODIR = 0xFFFF; //P0.0..15 defined as Outputs
IOCLR = 0xffff;
timer0_init();
uart0_init();
VICIntSelect=0x00000010;
VICVectCntl0=0x00000026; //Разрешить нулевой слот и считать, что прерывания от этого
//слота имеют нулевой номер
VICVectAddr0=(unsigned long)uart0_handler; //Загрузить адрес обработчика в слот
VICIntEnable=0x00000050;
while (1) { //Бесконечный цикл
}
}



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
поделите 4 пополам:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru