реклама на сайте
подробности

 
 
> Настройка прерываний в LPC1778, с полного нуля
ДЕЙЛ
сообщение Jul 7 2014, 19:43
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 234
Регистрация: 7-11-13
Пользователь №: 79 085



Листинг в общих чертах такой:

Инициализация и настройка тактирования

1: U0IER|=0x4; //Разрешение прерывания по приёму байта в RX
2: __enable_irq(); //Разрешаем прерывания (CMSIS)
3: __set_BASEPRI(0xFFFFFFFF); //Разрешаем все прерывания (CMSIS)
4: NVIC_EnableIRQ(UART0_IRQn); //Разрешение прерывания UART0 (CMSIS)

while(1)
{
Циклическая отправка данных на ПК
}


5: __irq void UART0_IRQ1(void)
{
for (k=0; k<200; k++)
{
FIO1SET=0x2000000; //Подёргаем ножкой 200 раз
FIO1CLR=0x2000000;
}
}


Хочу сделать так, чтобы при появлении байта в буфере приёма UART вызывалось прерывание. Вот с этим вызовом прерывания проблема и пока не знаю, с какой стороны к ней подходить. Вопросы такие:
1. Правильно ли я выполнил настройки? (строки 1-4)
в строке 4 в качестве параметра функции передаётся UART0_IRQn. Что значит эта n? Её так и нужно оставлять или вместо n нужно какое-то число стаить? Хотя компилятор ругается.

2. Правильно ли я оформил обработчик прерывания? (строка 5). В этой строке пробовал писать название функции от UART0_IRQ1 ло UART0_IRQ10. Компилятор не ругался, но и толку никакого не было, на осциллографе не видел дёрганий ножки после отправки байта с ПК.
На что влияет выделенное число?


Данные в буфер приёма однозначно приходят правильные с ПК.
На скрине моя программа в сыром виде. При нажатии кнопки "ТЕСТОВАЯ" с COM-порта отправляется 1 байт 0xAA, который я вижу принятым программой от МК (выделено). Т.е. с приёмом нормально всё, но не совсем удобно каждый раз смотреть на буфер, куда удобнее считывать из него байт по прерыванию. Ну и с настройкой прерываний разобраться нужно.

И ещё имеется такой регистр
//SETENA0=0xFFFFFFFF;
В описании написано, что каждый бит этого регистра разрешает или запрещает соответствующее прерывание. Как понять, к какому прерыванию относится конкретный бит?

Сообщение отредактировал ДЕЙЛ - Jul 7 2014, 19:46
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ДЕЙЛ
сообщение Jul 15 2014, 19:30
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 234
Регистрация: 7-11-13
Пользователь №: 79 085



Продолжаю начинать осваивать LPC. Читаю про вложенные прерывания. Логику работы я понимаю так: если во время выполнения прерывания появляется запрос от источника с более высоким приоритетом, то текущая процедура обработчика приостанавливается на время выполнения обработчика более высокоприоритетного прерывания и после этого продолжается выполнение. Более высокоприоритетное прерывание приостанавливает работу низкоприоритетного так же, как обычное прерывание приостанавливает главную программу в 8битных МК?

написал вот такой код:
Код
#include "C:\10062014LPC\iolpc1778.h"
#include "C:\10062014LPC\src\inc\LPC17xx.h"
void main(void)
{
    
{ //INIT
//Инициализация ножек
IOCON_P1_25 = 0; //PIO
FIO1DIR     = 0x2200000; //Выходы PIN1_25, PIN1_11
PCONP      |= 0x8;
IOCON_P0_02 = 0x1;
IOCON_P0_03 = 0x1;
FIO0DIR     = 0x4+0x8;

//Настройка тактирования
SCS        |= 0x20; //подключение осциллятора
while(!(SCS&0x40)){} //ожидание запуска

PLL0CON   |= 0x01;
PLL0CFG   |= 0x09;
PLL0FEED   = 0xAA;  
PLL0FEED   = 0x55;    
CCLKSEL   |= 0x100;
PCLKSEL    = 1;
CLKSRCSEL |= 1;

//Настройка UART0
U0LCR     |= 0x83;   //razrecchenie dostupa k delitely
U0DLL      = 0xC8;   //0xF0;//0xA0; //0x14;  //0x4E;  //nastrojka delitelya
U0LCR     &=~0x80;   //zapret dostupa k delitely
U0IER     |= 0x1+0x4;//Разрешение прерываний UART0

NVIC_EnableIRQ(UART0_IRQn);    //Enable IRQ UART0 (ISER0=32)

//Настройка системного таймера
SYSTICKCSR  = 0;
SYSTICKRVR  = 0xF423F;
SYSTICKCVR  = 2;
SYSTICKCSR |= 7;
}

//Пустой бесконечный цикл
while(1){ }
}
/////////////////////////////  IRQ  /////////////////////////////////////

//IRQ_UART0
void UART0_IRQHandler(void)
{
for (int i=0; i<2; i++) //2 импульса (канал_2 осциллографа)
  {  
  FIO1CLR   = 0x2200000; //pin; //0  
  FIO1SET   = 0x2000000; //pin; //1    
  FIO1CLR   = 0x2200000; //pin; //0
  }

  while(1) {} //здесь должна висеть процедура обработчика IRQ_UART0
  
  NVIC_ClearPendingIRQ(UART0_IRQn);
  return;
}

//IRQ_SYSTICK
void SysTick_Handler(void)
{ //1 импульс (канал_1 осциллографа)
  FIO1CLR   = 0x2200000; //pin; //0  
  FIO1SET   = 0x200000; //pin; //1
  FIO1CLR   = 0x2200000; //pin; //0
  return;
}


Логика задумана такая: имеются два прерывания - UART0 и от системного таймера. После запуска и инициализации в первом канале осциллографа вижу работу обработчика прерываний системного таймера - короткие импульсы с частотой 120Гц. Тут всё нормально. Далее отправляю байт на вход UART0, во втором канале появляются два импульса, т.е. в прерывание вошли и после этого в обработчике стоит бесконечный цикл while(1) {}. Это для того, чтобы МК не выходил из обработчика IRQ_UART0. Но почему-то данный бесконечный цикл не прерывается для выполнения прерывания от системного таймера. В чём тут может быть проблема? Неправильная настройка или я неправильно понял смысл вложенности прерываний?

Сообщение отредактировал ДЕЙЛ - Jul 15 2014, 19:32
Прикрепленные файлы
Прикрепленный файл  10062014LPC.rar ( 918.83 килобайт ) Кол-во скачиваний: 9
 
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ДЕЙЛ   Настройка прерываний в LPC1778   Jul 7 2014, 19:43
- - ДЕЙЛ   Сегодня утром вчитался получше в описание регистра...   Jul 8 2014, 05:58
- - menzoda   Цитата(ДЕЙЛ @ Jul 7 2014, 23:43) Правильн...   Jul 8 2014, 08:33
|- - ДЕЙЛ   Цитата(menzoda @ Jul 8 2014, 12:33) Никак...   Jul 8 2014, 11:05
|- - menzoda   Цитата(ДЕЙЛ @ Jul 8 2014, 15:05) как тогд...   Jul 8 2014, 12:50
|- - mempfis_   Цитата(ДЕЙЛ @ Jul 8 2014, 14:05) как тогд...   Jul 8 2014, 14:29
|- - ДЕЙЛ   Цитата(mempfis_ @ Jul 8 2014, 18:29) Вот ...   Jul 8 2014, 20:54
|- - menzoda   Критиковать пока особо нечего, это же просто набро...   Jul 9 2014, 05:43
- - ДЕЙЛ   Прогнал в отладчике через JTAG пошагово. Запусти...   Jul 9 2014, 19:40
|- - menzoda   Все логично. Она застряла в бесконечном цикле обра...   Jul 10 2014, 05:05
|- - ДЕЙЛ   Цитата(menzoda @ Jul 10 2014, 09:05) Эй, ...   Jul 10 2014, 17:58
- - ДЕЙЛ   Вечером попробую. Интересно узнать ещё мнение насч...   Jul 10 2014, 06:36
- - menzoda   КодNVIC_EnableIRQ(UART0_IRQn); //Enable IR...   Jul 16 2014, 06:12
|- - ДЕЙЛ   Цитата(menzoda @ Jul 16 2014, 10:12) КодN...   Jul 16 2014, 07:12
|- - menzoda   Цитата(ДЕЙЛ @ Jul 16 2014, 11:12) Данная ...   Jul 16 2014, 11:40
|- - ДЕЙЛ   Цитата(menzoda @ Jul 16 2014, 15:40) Хм, ...   Jul 16 2014, 12:30
- - ДЕЙЛ   На другом форуме сказали посмотреть регистры уровн...   Jul 17 2014, 07:32
- - ДЕЙЛ   С уровнями приоритетов разобрался. Ошибка была в т...   Jul 17 2014, 17:45
- - menzoda   В даташите про него ничего не будет, надо искать в...   Jul 17 2014, 17:59
- - ДЕЙЛ   Цитата(menzoda @ Jul 17 2014, 21:59) В да...   Jul 18 2014, 03:26
- - menzoda   Никакая. Точнее так, можно сообщить библиотеке вре...   Jul 18 2014, 05:07


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 02:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016