Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывание в asm
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Sprite
Здравствуйте.

Продолжаю изучать ассемблер. Камень - stm32f103, среда разработки - keil. Пример проекта брал здесь.Нужно организовать прерывание по совпадению с регистром сравнения таймера.
Когда я писал на C - с проектом шел файлик "STM32F10x.s", где были прописаны все вектора прерываний. А в моем проекте этого файлика нет sad.gif
Как организовать прерывание? (желательно пример кода).
kovigor
Цитата(Sprite @ Jun 3 2011, 18:14) *
Когда я писал на C - с проектом шел файлик "STM32F10x.s", где были прописаны все вектора прерываний. А в моем проекте этого файлика нет sad.gif
Как организовать прерывание? (желательно пример кода).


Так это же, по сути, обычный ассемблерный файл. Можно разобраться в его содержимом и адаптировать для использования в своем проекте. В конце концов, можно сделать проект на Си, откомпилировать, получить листинг и изучить его. Вот только зачем вам это ? Компилятор почти наверняка сделает и быстрее, и лучше, чем вы напишете сами ...
Sprite
Ответы, типа "компилятор сделает быстрее и лучше" не принимаются. Жду советов по существу.
SII
А Вам ответили уже по существу. Смотрите .s-файл и разбирайтесь, как он устроен и что делает. Там прописаны и векторы прерываний, и настройки PLL, и всё такое прочее, что необходимо сделать до начала кода собственно программы (а на чём она написана -- на ассемблере или языке высокого уровня, -- особой роли не играет, инициализировать-то контроллер всё равно нужно).
Sprite
Вроде разобрался, остался один вопрос: как активизировать прерывание? В эмуляторе keil открываю вкладку NVIC, нахожу свое прерывание, ставлю напротив него галочку "Active" - все работает, происходит переход в процедуру обработки прерывания, но при этом я не вижу, что какой-нибудь регистр меняет свое значение. Как поставить эту галочку программно? В какой регистр (и какое значение) записывать?
Sprite
Решил проблему след. образом:
Код
        LDR R0,=SETENA0
        MOV R1, #NVIC_ISER_SETENA_27
        STR R1,[R0]

Все работает, в прерывание заходит как надо! Только компилятор ругается на строчку
Код
        LDR R0,=SETENA0

Говорит:
Код
main.s(200): warning: A1581W: Added 2 bytes of padding at address 0x142
Насколько критичный этот warning? Можно ли его как-нибудь красиво обойти? (не отключая в настройках).
SII
Это он предупреждает, что добавил 2 пустых байта (какую-нибудь ничего не делающую команду) для обеспечения выравнивания.
Sprite
Спасибо. Тема закрыта.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.