Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
1 / 1 / 0
Регистрация: 27.10.2014
Сообщений: 7

Milandr не входит в обработчик прерывания

14.04.2022, 00:23. Показов 3270. Ответов 4

Студворк — интернет-сервис помощи студентам
Добрый вечер!
Обращаюсь с возможно глупой проблемой, но никак не могу понять по какой причине у меня такие сложности.
Осваиваю ARM контроллеры в данном примере будет использоваться контроллер MDR32F9Q2 от отечественного производителя МИландр (такая же проблема возникла на STM32).
Суть проблемы в том что на этапе освоения последовательного порта и работой с прерываниями получаю зависание в собственно вызываемых прерываниях.
Активируется прерывание, флаги выставляются, но в обработчик Handler программа не входит и в итоге контроллер продолжает висеть бесконечно.
Проекты делаю в Keil 5. Обработчики прописаны в startup файлах. При работе без прерываний, а просто на флажках всё летает как надо. Надеюсь на спасение ибо на флажках далеко не уедешь.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <MDR32Fx.h>
#include <MDR32F9Qx_port.h>
#include <MDR32F9Qx_rst_clk.h>
#include <MDR32F9Qx_uart.h>
 
void UART1_IRQHandler();
char buff;
    
void CLK_enable()
{
    MDR_RST_CLK->PER_CLOCK|=((1<<6)|(1<<22)|(1<<4));
    MDR_RST_CLK->HS_CONTROL|=0b1<<0;
    MDR_RST_CLK->CPU_CLOCK&=~(0b11<<0)|(0b111111<<4);
    MDR_RST_CLK->CPU_CLOCK|=((0b1<<1)|(0b1<<8));
    
    MDR_RST_CLK->UART_CLOCK|=(1<<24);
}
 
void portB_UART_init()   
{
    MDR_PORTB->OE&=~(1<<6);
    MDR_PORTB->OE|=(1<<5);
    MDR_PORTB->FUNC|=(0b10<<10)|(0b10<<12);
    MDR_PORTB->ANALOG|=(0b11<<5);
    MDR_PORTB->PWR|=(0b11<<10)|(0b11<<12);
    MDR_PORTB->PULL&=~(0xFFFF<<0);
}
 
void UART1_init()
{
    MDR_UART1->IBRD=52;
    
    MDR_UART1->FBRD&=~(0b111111<<0);
    MDR_UART1->FBRD=5;
    MDR_UART1->LCR_H&=~(0xFF<<0);
    MDR_UART1->LCR_H|=(0b11<<5);
    MDR_UART1->CR|=(1<<9)|(1<<8)|(1<<0);
    MDR_UART1->ICR|=(0b1111<<0);
    MDR_UART1->IMSC|=(1<<4);
}
 
 
void UART1_IRQHandler(void)
{   
    while (MDR_UART1->RIS&(1<<4))
    {
    MDR_UART1->ICR|=(1<<4);
        while (MDR_UART1->FR&~(1<<4))
        {
        buff=MDR_UART1->DR;
        
        UART_SendData(MDR_UART1, buff);
            }
         }
}
 
int main(void)
{
    int tmp;
    SystemInit();
    CLK_enable();
    
    portB_UART_init();
    UART1_init();
    NVIC_EnableIRQ(UART1_IRQn);
    while(1)
    {
        
    }
}


Заранее спасибо, проект во вложении.
Вложения
Тип файла: rar UART.rar (75.8 Кб, 21 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.04.2022, 00:23
Ответы с готовыми решениями:

Прерывания в микроконтроллере Milandr
Здравствуйте! Работаю с отладочной платой LDM-HELPER-K1986BE1QI-FULL. Написал простой код, засвечивающий один светодиод сразу (PD0) и...

Обработчик прерывания
Есть некая программа, которая по прерыванию выводит набор значений в порт F (сразу на все пины, а не по одному). Есть структура в которой...

Обработчик прерывания int 9
Всем доброго времени суток. Я недавно начал постигать прерывания и решил, что если я напишу &quot;мини-драйвер&quot; для клавиатуры, то...

4
1 / 1 / 0
Регистрация: 27.10.2014
Сообщений: 7
14.04.2022, 00:43  [ТС]
В какой-то не тот раздел закинуло почему-то
0
2 / 1 / 2
Регистрация: 15.04.2022
Сообщений: 2
15.04.2022, 21:48
Лучший ответ Сообщение было отмечено ValeryS как решение

Решение

У Вас файл main, где определен обработчик UART1_IRQHandler(), имеет расширение CPP, а потому собирается компилятором С++. Из-за это обработчику присваивается имя в стиле C++ - _Z16UART1_IRQHandlerv, а не UART1_IRQHandler, из-за чего компоновщик благополучно удаляет этот обработчик, объявленный в main.cpp. Всё это указано Listings/UART_prj.map. Попробуйте или расширение у main сменить на .с, либо extern "C" добавить для UART1_IRQHandler(), чтобы имя в стиле С создавалось.
1
1 / 1 / 0
Регистрация: 27.10.2014
Сообщений: 7
17.04.2022, 09:11  [ТС]
Спасибо большое! Зашевелилось действительно, не знал о такой особенности. Находил инфу о том что нужно map файл почитывать, но не понимал о чем речь. Постараюсь получше структуру проекта поизучать. Вопрос закрыт
1
17.04.2022, 14:07

Не по теме:

Цитата Сообщение от GAvR71 Посмотреть сообщение
не знал о такой особенности.
Зачем создаете C++ проект если не знаете особенности языка?

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.04.2022, 14:07
Помогаю со студенческими работами здесь

Обработчик прерывания клавиатуры
По идее обработчик отлавливает нажатие на клавишу SHIFT и устанавливает соответствующий бит в слове флагов клавиатуры, но он этого не...

Не работает обработчик прерывания
Нужно, что бы программа при включенном CapsLock выводила глассные буквы, а при выключенном - только согласные. Собственно, программа...

Резидентный обработчик прерывания
Всем привет, ищу помощи в написании такой-вот программы: Разработать резидентный обработчик прерывания, который по истечении...

Обработчик прерывания Си & ASM
Не подскажет ли кто нибудь как можно в WinAVR написать обработчик прерывания через asm, просто компилятор пихает в обычном прерывании...

Обработчик прерывания(звук)
Здравствуйте,у меня такое задание: разработать обработчик прерывания который при нажатии некоторой клавиши издаст звук.(мелодия) У меня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru