Кто-то любит пирожки, а кто-то - нет.
NVIC, векторный контроллер прерываний, есть во всех контроллерах на базе ядер Cortex-M, так как он входит в состав ядра. В старых ядрах контроллер прерываний был отдельно и не отличался хорошими характеристиками в плане скорости.
Описывается он подробно в Cortex-M4 Programming Manual.

читать дальше

<< Предыдущее Следующее >>

@темы: arm, программизмы, электроника, ассемблер, stm32f4discovery, stm32

Комментарии
22.07.2013 в 18:16

Точно, почему я сразу не догадался перевести 0x16 в десятичный вид.
Спасибо!
25.03.2014 в 18:17

dcfcdkd interesting dcfcdkd! dcfcdkd good!
26.03.2014 в 22:59

Возникла проблема, совершенно мне непонятная. Использую STM32F429... настроил таймер TIM4, разрешил прерывание UIE в таймере, разрешил его в NVIC - №30, разрешил прерывания глобально.
При переполнении таймера ставится флаг "pending", и в обработчик входить не желает. Что делать?
На f103 при тех же самых настройках работает как и должен. Почему? Каких-то кординальных отличий в Tim4 на f103 и f429 не заметил.
27.03.2014 в 09:58

Кто-то любит пирожки, а кто-то - нет.
Гость, прерывание названо правильно, не объявлено как статик?

Просто я сейчас попробовал (не кодом, в system viewer), всё отлично запрерывалось, а я всего-то nvic разрешил, UIE в DIER и CEN в CR1.
27.03.2014 в 12:35

MOV32 R0, #RCC
MOV R1, #0x4
STR R1, [R0, #RCC_APB1ENR]

MOV32 R0, #TIM4
MOV R1, #0xAFC8
STR R1, [R0, #0x28] ; TIMx_PSC - делитель
MOV R1, #0x07D0
STR R1, [R0, #0x2C] ; TIMx_ARR - максимум счета
MOV R1, #0x0000
STR R1, [R0, #0x24] ; TIMx_CNT
MOV R1, #0x0001
STR R1, [R0, #0x0C] ; TIMx_DIER - тут только разрешаю прерывания UIE
MOV R1, #0x0085
STR R1, [R0] ; TIMx_CR1 - APRE+URS+CEN биты

MOV32 R0, #NVIC_Base
MOV32 R1, #0x40000000
STR R1, [R0] ; - Тут у регистра NVIC_ISER0 смещение равно 0

CPSIE I
27.03.2014 в 12:53

Кто-то любит пирожки, а кто-то - нет.
Гость, тут всё на первый взгляд в порядке. Подозреваю, прерывание названо неправильно, сам обработчик.

System Viewer пользовали? Программа не улетает в стартап?
27.03.2014 в 13:44

Или же он забыл поставить единицу в векторной таблице.


27.03.2014 в 14:02

Кто-то любит пирожки, а кто-то - нет.
altaw, так единицу кейл сам добавляет =) Скорее уж EXPORT TIM4_IRQHandler забыт
27.03.2014 в 14:15

В Keil не нужно +1 ставить насколько я знаю. Выглядит это как-то так:

По крайней мере для STM32f103 +1 не требовалось, все и так работало. Тем более Startup файл создается автоматом и там как я думаю все првильно.
Название прерывания скопировал из Startup, как оно может быть неправильным?
Да и... прерывание не то чтобы не вызывается... оно вызывается, только в NVIC почему-то сразу после запроса ставится статус отложенного прерывания - "pending" флаг. Поэтому обработчик и не вызывается! А как исправить?
27.03.2014 в 14:18

EXPORT TIM4_IRQHandler тоже есть
27.03.2014 в 14:36

Кто-то любит пирожки, а кто-то - нет.
Гость, что за pending?

Я смог добиться невызывания прерывания только отключив глобально прерывания или отключив в nvic 30е прерывание. Оно вызывается железно =D
27.03.2014 в 14:42

Кто-то любит пирожки, а кто-то - нет.
Вот такой код у меня работает:

27.03.2014 в 20:51

вот проект если что хттп://yadi.sk/d/KHsGH317LKjeg
27.03.2014 в 21:14

Может процессор думает, что он уже в другом прерывании? Этим можно объяснить почему ставиться флаг отложенного прерывания "pending". Состояние процессора "privileged", режим "threat"... не знаю имеет ли это значение?
28.03.2014 в 09:57

Кто-то любит пирожки, а кто-то - нет.
Гость, я ничего не менял, запустил — всё прекрасно в прерывание попадает. Даже светодиоды моргают.
28.03.2014 в 10:28

Там моргалка в главном цикле, не только в прерывании. Удали из main все и запусти повторно
28.03.2014 в 16:05

Кто-то любит пирожки, а кто-то - нет.
Гость, это неважно, т.к. я вижу, что в прерывание код попадает (ибо брекпоинт не соврёт). И без кода в main тоже моргает.
28.03.2014 в 17:00

Ты на STM429I-Disco это все делаешь? А в чем же тогда может проблема быть у меня? Настроил что не так в Keil? Где-то косяк-то...
29.03.2014 в 09:39

Да... я совсем ничего не понимаю. При отладке в Keil программа не попадает в обработчик, а когда работает сама, то вижу что СД моргают, значит заходит в обработчик. Почему тогда в Keil при отладке через SWD отладчик так косячно работает?
30.03.2014 в 19:15

В общем я выяснил, что программа все-таки попадает в обработчик. Поставил breakpoint в обработчике, запустил выполнение программы и оказался в обработчике.
Когда я работал на Pinboard II с stm32f103 и отлаживал через JTAG картина была другая: после переполнения сразу вылетало прерывание, и если в обработчике опять возникало переполнение
(т.к. таймер/периферия при отладке не останавливается и работает независимо от ядра), то после выхода из него обработчик вызывался повторно.
Как я понял с SWD как-то по другому... но как? Сейчас получается, что когда я пошагово отлаживаю программу обработчик не вызывается (а таймер как видно по регистру счета CNT так же не останавливается), и только если нажму "RUN" в него можно попасть.
Самое интересное, что прерывание вызывается не через строго одинаковые интервалы времени, а всегда по разному. Допустим задал я период счета 2 секунды, но судя по счетчику каждый раз прерывание может вызываться через разные интервалы времени.
С чем это может быть связано?
06.04.2014 в 15:35

Кто-то любит пирожки, а кто-то - нет.
Гость, мм, всё должно вызываться через равные промежутки времени (со стороны контроллера как минимум). Если свд тормозит тактирование, таймер может и завять. По крайней мере, существуют регистры, которые позволяют остановить тактирование для обычных таймеров TIM, вачдогов и типа того в те моменты, когда код не выполняется из-за отладчика. Про сустик я точно не знаю, как он себя ведёт при остановке выполнения .з.

Такие тонкости лучше узнавать из документации на ядро и отладку =) Возможно, специально сделано так, чтоб при пошаговом выполнении он не кидался во все обработчики подряд, не давая выполнять основной код. В авр студии это раздражает — там надо специально глобальные прерывания запрещать, а то он не даст пошагать по коду.

Точность хода лучше проверять анализатором логическим при постоянном выполнении. При остановке выполнения есть куда разных задержек (передача инфы на комп, перенастройка IDE, поиск обработчика по адресу и т.д.), из-за которых время срабатывания субъективно казаться больше и разным.