2016-12-21 17 views
1

Ответа на этот вопрос здесь
Libopencm3 interrupt table on STM32F4
объясняет весь механизм хорошо, но то, что я получаю все вектор таблиц заполнены с блокирующими обработчиками.LibOpenCM3 таблица векторов всех блокировки обработчик

Я знаю это потому, что вижу это в отладчике (кроме всего этого не работает): disassembly screenshot showing vector table.

Это как если бы компоновщик просто игнорирует мою хорошо определенную функцию обработчика прерываний (ы), например:

void sys_tick_handler(void) 
{ 
... 
} 

void tim1_up_isr(void) 
{ 
... 
} 

Я использую EmBitz IDE и следовал этому учебнику here получить libopencm3 работать (и это делает работа, кроме этой проблемы).

Я проверил имена функций n-fold и попробовал несколько онлайн-примеров, в том числе из проекта примеров libopencm3.

Все скомпилировано без сбоев и загружается в целевую плату (STM32F103C8) и работает нормально - за исключением того, что ISR не вызываются (я получаю прерывания, но они застревают в блокирующих обработчиках).

У кого-нибудь есть идея, почему это происходит?

+0

Правильно ли, что у вас такая же проблема при создании и запуске проектов из примеров libopencm3? Если да, то как вы их строите? Просто запустив 'make' в соответствующем каталоге проекта? И какую ОС вы используете? –

+0

@Sam, я использую EmBitz IDE, как указано в вопросе. Я запускаю его на Win 7 VM, но не вижу, как это может быть связано. Это может быть проблема EmBitz? – spacer

ответ

0

Это похоже на ссылку на стандартную векторную таблицу (из SPL или HAL ST).

Чтобы проверить это, попробуйте переименовать sys_tick_handler() в SysTick_Handler() и tim1_up_isr() к TIM1_UP_IRQHandler().

Если это работает, найдите файл с этим SysTick_Handler и TIM1_UP_IRQHandler (я думаю, что будет startup*.s) и удалите его из своего проекта.

+0

Когда я переименую 'sys_tick_handler()' в 'SysTick_Handler()', он работает. Символ 'SysTick_Handler' используется только в файле« startup_stm32f10x_md.s », который содержит код запуска и определение векторной таблицы - вы предлагаете удалить этот файл? – spacer

+0

Собственно, это начинает иметь смысл - файл «startup_stm32f10x_md.s» использует символ SysTick_Handler для заполнения таблицы векторов, но символ определен ** только ** в этом файле (в качестве обработчика блокировки) ** и ** между ним и символом 'sys_tick_handler' нет никакой связи, поэтому неудивительно, что он не работает. Все это происходит из учебника, который я использовал [link] (https://github.com/OliviliK/STM32F103/wiki/Tutorial2_LOCM3Template), который предлагает удалить файл LibOpenCM3 «vector_nvic.c» и вводит загрузочный файл (который, по-видимому, предполагается определить векторную таблицу). – spacer

+0

ОК, нашел способ, как заставить его работать: в начале файла «startup_stm32f10x_md.S» добавить '#include ' (который содержит только # define из IRQ-обработчиков альтернативных имен), добавьте '#define SysTick_Handler sys_tick_handler' (потому что по какой-либо причине он не определен в «irqhandlers.h») и добавляет еще один путь поиска к параметрам проекта («C: \ CommonLibs \ libopencm3 \ include \ libopencmsis \ stm32 \ f1»). – spacer