Обработчики прерываний К1887ВЕ3Т Keil
Модераторы: ea, Alis, pip, gurzzza, _sva_
-
frenele
- Сообщения: 12
- Зарегистрирован: 27 янв 2015, 13:51
- Предприятие: "Океанприбор"
- Откуда: Кировск, ленинградская обл.
- Контактная информация:
Обработчики прерываний К1887ВЕ3Т Keil
Создал проект в Keil на микроконтроллере работает.
Теперь задача написать любой обработчик прерывания, но не понятно где прописаны имена обработчиков прерываний.
Смотрел файл "START167.A66", но не обнаружил. Для STM32 для меня всё понятно как писать оболочку обработчика прерываний. А вот для К1887ВЕ3Т непонятно. Помогите разобраться! Может какой пример скинете с работой прерываниями.
Re: Обработчики прерываний К1887ВЕ3Т Keil
У Keil довольно неплохой Help, посмотрите там. Обработчикам прерываний Вы сами даете имена, для Keil важен только номер прерывания, что в Assembler, что в C.
Код: Выделить всё
void CAN_OUT_MSG(void) interrupt 0x66
{
P3 = ~0x0066;
printf("\n interrupt 0x66 CAN_OUT_MSG\n");
}-
frenele
- Сообщения: 12
- Зарегистрирован: 27 янв 2015, 13:51
- Предприятие: "Океанприбор"
- Откуда: Кировск, ленинградская обл.
- Контактная информация:
Re: Обработчики прерываний К1887ВЕ3Т Keil
То есть как я понял в строчке "void CAN_OUT_MSG(void) interrupt 0x66" и есть адрес вектора прерывания как если писать на Assembler. Спасибо посмотрю Help. Опыт в Keil у меня только любительский. Вот и осваиваю.
Re: Обработчики прерываний К1887ВЕ3Т Keil
Нет, это номер прерывания, ни в коем случае не вектор.
-
frenele
- Сообщения: 12
- Зарегистрирован: 27 янв 2015, 13:51
- Предприятие: "Океанприбор"
- Откуда: Кировск, ленинградская обл.
- Контактная информация:
Re: Обработчики прерываний К1887ВЕ3Т Keil
Спасибо я уже разобрался. Прерывания заработали. Да это порядковый номер прерывания.
void ASC0_Receive(void) interrupt 0x2B
{
P2 ^= 0x4000;
}
void ASC0_Transmit(void) interrupt 0x2A
{
tx_uart_byte('$');
}
void ASC0_Receive(void) interrupt 0x2B
{
P2 ^= 0x4000;
}
void ASC0_Transmit(void) interrupt 0x2A
{
tx_uart_byte('$');
}
-
alina_krylova
- Сообщения: 6
- Зарегистрирован: 07 июн 2024, 11:36
- Предприятие: АО АВЭКС
Re: Обработчики прерываний К1887ВЕ3Т Keil
Напишите как работать с прерываниями с asc0. Я включаю прерывания по приему S0RIC = 0x40; затем включаю глобально: PSW|=0x800;
Функция обработки:
void ASC0_Receive(void) interrupt 0x2B
{
S0RIR=0;
counter++;
}
И не работает(прерывания не приходят)(( что не правильно?
Функция обработки:
void ASC0_Receive(void) interrupt 0x2B
{
S0RIR=0;
counter++;
}
И не работает(прерывания не приходят)(( что не правильно?
-
dav
- Сообщения: 225
- Зарегистрирован: 14 дек 2015, 08:21
- Предприятие: АО НИИЭТ
- Откуда: АО НИИЭТ, Воронеж
Re: Обработчики прерываний К1887ВЕ3Т Keil
Доброго времени суток!alina_krylova писал(а): ↑11 фев 2025, 18:12 Напишите как работать с прерываниями с asc0. Я включаю прерывания по приему S0RIC = 0x40; затем включаю глобально: PSW|=0x800;
И не работает(прерывания не приходят)(( что не правильно?
Обратите внимание, при разрешении прерываний в регистр записывается значение 0x44: S0RIC = 0x0044;
На стр. 215 технического описания приведена информация про уровень приоритета:
"Уровень приоритета 0000 является значением по умолчанию центрального процессора. Поэтому запрос с уровнем ILVL 0000 не будет принят ЦПУ."
Вот пример инициализации последовательного интерфейса:
void init_asc0 (unsigned long freq, unsigned int baud) {
S0BG = (unsigned int)(freq / (32*(unsigned long) baud)) - 1; // baudrate reload
DP3 |= 0x0400; // Set TXD for output
DP3 &= 0xF7FF; // Set RXD for input
ALTSEL0P3 |= 0x0400; // Configure port pins for serial interface 0
P3 |= 0x0400; // Set TXD high
S0CON = 0x8011;
S0RIC = 0x0044; // Enable serial receive interrupt
S0TIC = 0x0044; // Enable serial transmit interrupt
}
-
alina_krylova
- Сообщения: 6
- Зарегистрирован: 07 июн 2024, 11:36
- Предприятие: АО АВЭКС
Re: Обработчики прерываний К1887ВЕ3Т Keil
Спасибо! Напишите пжлст: формула для расчета S0BG подходит для fclk = 20 МГц? В спецификации только примеры для 40 и 60 МГц((
Re: Обработчики прерываний К1887ВЕ3Т Keil
Пример настройки интерфейса ASC0:
void init_asc0 (unsigned long freq, unsigned int baud) {
S0BG = (unsigned int)(freq / (32*(unsigned long) baud)) - 1; // baudrate reload
DP3 |= 0x0400; // Set TXD for output
DP3 &= 0xF7FF; // Set RXD for input
ALTSEL0P3 |= 0x0400; // Configure port pins for serial interface 0
P3 |= 0x0400; // Set TXD high
S0CON = 0x8011;
S0RIC = 0x0044; // Enable serial receive interrupt
S0TIC = 0x0044; // Enable serial transmit interrupt
transmit_finish = 1;
}
void init_asc0 (unsigned long freq, unsigned int baud) {
S0BG = (unsigned int)(freq / (32*(unsigned long) baud)) - 1; // baudrate reload
DP3 |= 0x0400; // Set TXD for output
DP3 &= 0xF7FF; // Set RXD for input
ALTSEL0P3 |= 0x0400; // Configure port pins for serial interface 0
P3 |= 0x0400; // Set TXD high
S0CON = 0x8011;
S0RIC = 0x0044; // Enable serial receive interrupt
S0TIC = 0x0044; // Enable serial transmit interrupt
transmit_finish = 1;
}
-
alina_krylova
- Сообщения: 6
- Зарегистрирован: 07 июн 2024, 11:36
- Предприятие: АО АВЭКС
Re: Обработчики прерываний К1887ВЕ3Т Keil
Добрый день. Как обрабатывать внешние прерывания(вход внешнего прерывания EX7IN, …, EX0IN)? в каком регистре выставляется приоритет ? И какие у них номера векторов прерываний?
