Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Staptup-файл, asm, инициализация, прерывания в stm32 Cortex-M3
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
tulupov.kv
Приветствую всех! Освоил использование GPIO, поработал с дисплеем, попробовал также слёту, не разбираясь, использовать внешние прерывания.
Настроил прерывания и NVIC, написал два обработчика EXTI 3,4. При нажатии кнопки контроллер зависает.

Знаю, что таблица векторов прерываний лежит в файле startup_stm32f10x_md_vl.s
Его, и файлы system_stm32f10x.h, system_stm32f10x.c и stm32f10x.h взял с сайта ST, CMSIS встроена в IAR.
В стартап файле такие строки:
Код
        PUBWEAK EXTI3_IRQHandler
        SECTION .text:CODE:REORDER(1)
        EXTI3_IRQHandler
        B EXTI3_IRQHandler

Похоже на зацикливание.

Вопросы:
1) Как заменить эту петлю на мой обработчик?
2) Наверное, нужно как-то правильно подключить стартап файлы .c и .s, причём без прерываний всё и без них работало, а там строки
Код
        EXTERN  __iar_program_start
        EXTERN  SystemInit        
        PUBLIC  __vector_table
и
        DCD     sfe(CSTACK)
        DCD     Reset_Handler

без этого работать программа не должна? IAR вместо моих стартап-файлов пихает что-то по умолчанию?
3) Где вызывается SystemInit? Что еще происходит до входа в main?
4) Где-то читал про то, что вроде обработчик прерывания нужно объявлять extern "C", точно не помню, поясните суть в конкретном случае и в общем.
5) Что бы такое почитать по ассемблеру для M3, препроцессору IAR и по теме вопросов, желательно кратко – пока хочу делать простые вещи без углубления в ядро, читать The Definitive Guide to the ARM® Cortex-M3 и Cortex-M3 Technical Reference Manual думаю пока рановато и нерационально. С английским дружу. Раньше писал на асме под авр.
Архив с проектом
nill
1) Обработчики в стартовом файле имеют атрибут weak. Соответственно, необходимо написать свой обработчик с таким же именем. При линковке он будет заменён на Ваш.
3) SystemInit вызывается из обработчика Reset_Handler, там же вызывается __main. Вообще же в начале стартового файла есть краткая справка о выполняемых действиях.
4) Если я всё правильно путаю, то extern "C" имеет смысл тогда, когда Вы пишете на c++, поскольку c и c++ используют разные соглашения по именованию функций.
5) Не уверен, что правильно понимаю Ваш термин "кратко", но загляните в Cortex-M3 programming manual.
menzoda
Добавлю.

1. Обработчик можно написать как на си, так и на ассемблере. На си это будет просто функция с таким же именем, не принимающая никаких параметров и ничего не возвращающая.
2. Как так без них работало? Без них ничего не может работать.
3. До входа в main происходит инициализация библиотеки времени исполнения (C Runtime Library), инициализация статических переменных, при необходимости копирование кода в область исполнения.
4. Лучше всего читать документы от ARM, потому что первоисточник. Необходимо заметить, что IAR использует свой ассемблер, поэтому некоторые конструкции могут выглядеть по-другому нежели в документах ARM. Синтаксис IAR'овского ассемблера можно посмотреть в соответствующем документе от IAR.
tulupov.kv
Спасибо за ответы.
Проблему решил, прерывания с NVIC работают.
Остался вопрос, почему при создании проекта без стартап файла, в котором обработчик Reset_Handler с функциями SystemInit и __iar_program_start, мк успешно мигает диодами, сбрасывается, только при обработке прерываний виснет.
menzoda
Черт его знает, может сам по тихому подключает что-нибудь, но скорей всего ты просто его не заметил, потому что мне помниться, что при создании проекта он там есть, хотя может я путаю чего. Именно поэтому я всегда создаю пустой (полностью) проект, и добавляю все нужные файлы сам.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.