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

 
 
> Staptup-файл, asm, инициализация, прерывания в stm32 Cortex-M3, Использую IAR 6.50 и stm32vldiscovery (stm32f100rb)
tulupov.kv
сообщение Oct 30 2014, 17:02
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 27-02-14
Пользователь №: 80 724



Приветствую всех! Освоил использование 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 думаю пока рановато и нерационально. С английским дружу. Раньше писал на асме под авр.
Архив с проектом

Сообщение отредактировал tulupov.kv - Oct 30 2014, 17:02
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
nill
сообщение Oct 31 2014, 07:29
Сообщение #2


Частый гость
**

Группа: Validating
Сообщений: 124
Регистрация: 10-08-05
Пользователь №: 7 502



1) Обработчики в стартовом файле имеют атрибут weak. Соответственно, необходимо написать свой обработчик с таким же именем. При линковке он будет заменён на Ваш.
3) SystemInit вызывается из обработчика Reset_Handler, там же вызывается __main. Вообще же в начале стартового файла есть краткая справка о выполняемых действиях.
4) Если я всё правильно путаю, то extern "C" имеет смысл тогда, когда Вы пишете на c++, поскольку c и c++ используют разные соглашения по именованию функций.
5) Не уверен, что правильно понимаю Ваш термин "кратко", но загляните в Cortex-M3 programming manual.
Go to the top of the page
 
+Quote Post
menzoda
сообщение Oct 31 2014, 08:33
Сообщение #3


Участник
*

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



Добавлю.

1. Обработчик можно написать как на си, так и на ассемблере. На си это будет просто функция с таким же именем, не принимающая никаких параметров и ничего не возвращающая.
2. Как так без них работало? Без них ничего не может работать.
3. До входа в main происходит инициализация библиотеки времени исполнения (C Runtime Library), инициализация статических переменных, при необходимости копирование кода в область исполнения.
4. Лучше всего читать документы от ARM, потому что первоисточник. Необходимо заметить, что IAR использует свой ассемблер, поэтому некоторые конструкции могут выглядеть по-другому нежели в документах ARM. Синтаксис IAR'овского ассемблера можно посмотреть в соответствующем документе от IAR.

Сообщение отредактировал menzoda - Oct 31 2014, 08:35
Go to the top of the page
 
+Quote Post
tulupov.kv
сообщение Nov 1 2014, 20:02
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 27-02-14
Пользователь №: 80 724



Спасибо за ответы.
Проблему решил, прерывания с NVIC работают.
Остался вопрос, почему при создании проекта без стартап файла, в котором обработчик Reset_Handler с функциями SystemInit и __iar_program_start, мк успешно мигает диодами, сбрасывается, только при обработке прерываний виснет.
Go to the top of the page
 
+Quote Post
menzoda
сообщение Nov 2 2014, 09:54
Сообщение #5


Участник
*

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



Черт его знает, может сам по тихому подключает что-нибудь, но скорей всего ты просто его не заметил, потому что мне помниться, что при создании проекта он там есть, хотя может я путаю чего. Именно поэтому я всегда создаю пустой (полностью) проект, и добавляю все нужные файлы сам.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 10:21
Рейтинг@Mail.ru


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