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

 
 
> Настройка прерываний в 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
Ответов
menzoda
сообщение Jul 8 2014, 08:33
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 13-09-12
Пользователь №: 73 530



Цитата(ДЕЙЛ @ Jul 7 2014, 23:43) *
Правильно ли я оформил обработчик прерывания? (строка 5). В этой строке пробовал писать название функции от UART0_IRQ1 ло UART0_IRQ10. Компилятор не ругался, но и толку никакого не было, на осциллографе не видел дёрганий ножки после отправки байта с ПК.
На что влияет выделенное число?


Не правильно. Ни на что не влияет. Для Cortex-M обработчики всех прерываний задаются статически, обычно в startup.s-файле, но можно это сделать и в C-файле. В стандартном startup.s обработчики помечены модификатором WEAK. Не вдаваясь в подробности это значит, что если определить свою функцию с таким же именем, то будет вызываться она, иначе будет вызываться обработчик по умолчанию, который в startup.s.

Значит, тебе нужно заглянуть в этот файл и посмотреть имя интересующего тебя обработчика, никаких гаданий и переборов тут не нужно. Когда найдешь имя - реализуешь свою функцию с таким же именем, это и будет обработчиком. Никаких __irq не нужно, это было актуально для ARM7 (но все же лучше уточни, а то я давно этим занимался, может уже позабыл чего). Естественно можно при желании периименовать обработчик как душе угодно, можно выкинуть обработчик по умолчанию, можно еще много чего, но это наверное уже не входит в твои планы.

Ах, да. В прерывании возможно потребуется сбрасывать флаг прерывания. Я тут тоже не очень помню, в документацию лезть неохота, посмотри сам.

Сообщение отредактировал menzoda - Jul 8 2014, 10:04
Go to the top of the page
 
+Quote Post
ДЕЙЛ
сообщение Jul 8 2014, 11:05
Сообщение #3


Местный
***

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



Цитата(menzoda @ Jul 8 2014, 12:33) *
Никаких __irq не нужно, это было актуально для ARM7 (но все же лучше уточни, а то я давно этим занимался, может уже позабыл чего)

как тогда указать компилятору, что эта функция выполняется по прерыванию?
в startup откопал вот эту функцию: UART0_IRQHandler
Только в модуле UART0 несколько источников прерываний, скрин описаний в прикреплённом файле.
Как программе указать, что прерывание нужно именно после приёма байта?

Цитата(ДЕЙЛ @ Jul 7 2014, 23:43) *
И ещё имеется такой регистр
//SETENA0=0xFFFFFFFF;
В описании написано, что каждый бит этого регистра разрешает или запрещает соответствующее прерывание. Как понять, к какому прерыванию относится конкретный бит?

по этому вопросу откопал в даташите:

Сообщение отредактировал ДЕЙЛ - Jul 8 2014, 11:07
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ДЕЙЛ   Настройка прерываний в LPC1778   Jul 7 2014, 19:43
- - ДЕЙЛ   Сегодня утром вчитался получше в описание регистра...   Jul 8 2014, 05:58
|- - 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
- - ДЕЙЛ   Продолжаю начинать осваивать LPC. Читаю про вложен...   Jul 15 2014, 19:30
- - 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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


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


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