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

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

Я делал так (+)

Отправлено vinogradov aleksei 01 марта 2007 г. 15:51
В ответ на: Инициализация VIC в LPC2124 отправлено MixEr 01 марта 2007 г. 15:46

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

// USART Receiver buffer
#define RX_BUFFER_SIZE 32
unsigned char rx_buffer[RX_BUFFER_SIZE];
unsigned char rx_wr_index,rx_rd_index,rx_counter;

// USART Transmitter buffer
#define TX_BUFFER_SIZE 32
char tx_buffer[TX_BUFFER_SIZE];
unsigned char tx_wr_index,tx_rd_index,tx_counter;

//Обработчик прерывания от UART1 (IRQ !)
void uart1_handler (void) __irq
{
unsigned char received_symbol;
unsigned long iir_storage;
IO0SET = 0x80000000;
//Выйти, если нет ожидающих обслужвания прерываний
iir_storage=U1IIR;
if ((iir_storage & 0x01) != 0) {IO0CLR = 0x80000000;
VICVectAddr=0x00000000;
return; //Нет ожидающих обслуживания прерываний
}

//Выйти, если была ошибка приема
if ((U1LSR & 0x9e) != 0) {received_symbol=U1RBR;
IO0CLR = 0x80000000;
VICVectAddr=0x00000000;
return;
}

//Имеется ли необслуженное прерывание RLS или CTI ?
if ((iir_storage & 0x0c)!=0){
//Если считать U1RBR,то флажок прерывания в регистре U1IIR сбросится (!)
rx_buffer[rx_wr_index]=U1RBR; //Положить символ в буфер приемника
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE) rx_counter=0;
}

//Имеется ли необслуженное прерывание THRE ?
if ((iir_storage & 0x02)!=0){
IO0SET=0x00200000;
if (tx_counter!=0){--tx_counter;
U1THR=tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
}
IO0CLR = 0x80000000;
VICVectAddr=0x00000000;
}

//Функция "Main"
int main (void)
{
rx_wr_index=0;
rx_rd_index=0;
rx_counter=0;

tx_wr_index=0;
tx_rd_index=0;
tx_counter=0;

//Инициализация портов ввода-вывода
IO0DIR=0xffffffff;
IO0CLR=0xffffffff;
//Инициализируем UART1
PINSEL0=0x00550000; //Подключить RxD1, TxD1, RTS1 и CTS1 к UART1
U1MCR=0xc0; //Разрешить аппаратное управление потоком (RTS/CTS)
U1LCR=0x83; //8 битов данных,не проверять четность,1 стоп-бит,DLAB -> 1
U1DLL=31; //115200 Бит/Сек., при этом VPB Clock = (14.318 MHz * 4)
U1DLM=0; //115200 Бит/Сек., при этом VPB Clock = (14.318 MHz * 4)
U1FCR=0x87; //Разрешить и сбросить FIFO для приемника и передатчика.
//Глубина буферов FIFO - по 8 байтов на буфер
U1LCR=0x03; //DLAB -> 0
U1IER=0x03; //Разрешить прерывания от UART1 по заполнению FIFO и тайм-ауту
//приема, а также по готовности интерфейса к передаче

VICIntSelect=0x00000000; //Прерывание от UART1 будет иметь статус прерывания IRQ
VICVectCntl0=0x00000027; //Разрешить нулевой слот и считать, что прерывания от этого
//слота имеют нулевой номер
VICVectAddr0=(unsigned long)uart1_handler; //Загрузить адрес обработчика в адресный регистр нулевого слота
VICIntEnable=0x00000080; //Разрешить прерывания от UART1

while (1){
if (rx_counter==0) continue;

VICIntEnClr=0x00000080; //Запретить прерывания от UART1
if (rx_counter!=0) {tx_buffer[tx_wr_index]=rx_buffer[rx_rd_index];
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
--rx_counter;
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
}
VICIntEnable=0x00000080; //Разрешить прерывания от UART1
}
}

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

Ответы


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

Сообщение:

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

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

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

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