Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC1768 NVIC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
theBMV
Среда: IAR ARM 5.4
Контроллер: LPC1768

Пишу инициализацию и обработчик прерываний для UART3
Код
void init_uart3(void)
{
  // Скорость
  /*
  F = Fp/(16*(DLM*256+DLL)*(1+DIV/MUL))
  F = 250 kBod
  Fp = 25 MHz
  DLM = 0
  DLL = 5
  DIV = 1
  MUL = 4
  */
  U3LCR_bit.DLAB = 1;
  U3DLL = 5;
  U3DLM = 0;
  U3LCR_bit.DLAB = 0;
  U3FDR_bit.DIVADDVAL = 1;
  U3FDR_bit.MULVAL = 4;
  
  // Формат
  U3FCR_bit.FCRFE = 1;                                                          // Включаем FIFO
  U3FCR_bit.RTLS = 2;                                                           // Порог срабатывания 8 символов
  U3LCR_bit.WLS = 3;                                                            // 8 бит данных
  U3LCR_bit.SBS = 1;                                                            // 2 стоп бита
  
  // Прерывания
  U3IER_bit.RDAIE = 1;                                                          // Прерывание по вх. данным
  U3IER_bit.RXLSIE = 1;                                                         // Прерывание по статусу линии
  SETENA0 = (1UL << 8);                                                           // Разрешаем NVIC UART3
}

...и тут оп! J-link переходит из пошагового в режим выполнения,
нажимаю Break, и вижу, что он уже в
Код
void UART3_IRQHandler(void)
{
  
  U3RBR;
  CLRPEND0 = 1UL << 8;                                                          // Сбрасываем флаг прерывания NVIC UART0
}

F11, F11 .. и опять из пошагового вылетает! Делаю Break,
он или там же, или тут
Код
while(1)
  {
    __disable_interrupt();
    WDFEED = 0xAA;                                                              // Кормим
    WDFEED = 0x55;                                                              // собаку
    __enable_interrupt();
    
    
  }

Причем, по UART3 в этот момент ничего не идет.
И что это вообще за ерунда с отладкой???
KAlex
Цитата(theBMV @ Jul 6 2011, 14:49) *
// Прерывания
U3IER_bit.RDAIE = 1; // Прерывание по вх. данным
U3IER_bit.RXLSIE = 1; // Прерывание по статусу линии


Я не знаю LPC, но логически думаю надо убрать прерывание по статусу линии.
sysel
UM10360, стр. 303
Цитата
Given the status of UnIIR[3:0], an
interrupt handler routine can determine the cause of the interrupt and how to clear the
active interrupt. The UnIIR must be read in order to clear the interrupt prior to exiting the
Interrupt Service Routine.


Надо сбросить прерывание средствами самого уарта.

И ещё вопрос: в PCONP UART3 запитан?
theBMV
Цитата
И ещё вопрос: в PCONP UART3 запитан?

Да, забыл указать.

Теперь делаю так
Код
  SETENA0_bit.SETENA8 = 1;                                                      // Разрешаем в NVIC
  U3IER_bit.RDAIE = 1;
  U3IER_bit.RXLSIE = 1;

а в обработчике
Код
  U3IIR;
  U3RBR;
  CLRPEND0_bit.CLRPEND8 = 1;

NVIC Clear Pending всё равно приходится делать. В примерах по крайней мере так. Ды и логично как-то.

Но, совершенно непонятно поведение отладчика. Он просто как будто теряет точку исполнения программы!
Первый раз такое наблюдаю.
После возврата из прерывания это обычно происходит.
Цитата
Wed Jul 06 16:46:53 2011: Failed to set breakpoint at 0xFFFFFFF8 (out of breakpoints?)
Wed Jul 06 16:46:53 2011: Performance warning: Lack of breakpoints forces single-stepping.

говорит. Использую 1 БП, он в обработчике
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.