Зарегистрирован: Пт мар 28, 2014 06:51:19 Сообщений: 4
Рейтинг сообщения:0
Начал осваивать камни CM4, работаю с платой STM32F429I-DISCO. Возникла одна проблема, непонятная для меня. Решил настроить МК на частоту 180 МГц, сделал все по алгоритму из даташита с включением Over-drive режима и т.п. Чтобы проверить правильно ли все настроилось и работает решил по прерыванию таймера моргать СД с определенной частотой. Но не нут то было. Настроил таймер TIM4, включил прерывание по переполнению UIE, разрешил его в NVIC, разрешил прерывания глобально. Тут и возникла проблема. При переполнении таймера возникает запрос на прерывание, но в NVIC почему-то ставится флаг отложенного прерывания "Pending" и обработчик не вызывается.
На что думать, куда смотреть и как исправить? Работаю в Keil u4 v4.72. Вот код, правда на asm. Спойлер
Код:
AREA |PROGRAMMA|, CODE, READONLY
INCLUDE Sourse.s INCLUDE Flash.s INCLUDE Power.s INCLUDE RCC.s
MOV32 R0, #HSEON ; В R0 помещам адрес бита HSEON в bit band alias MOV R1, #1 STR R1, [R0] ; Запускаем внешний кварц, устанавливая бит HSEON
MOV32 R0, #HSERDY MOV R2, #0xFFFF M1 LDR R1, [R0] ; Читаем бит HSERDY по адресу в bit band region CMP R1, #0 ; Проверяем флаг готовности BNE M2 ; Если бит установился, то HSE запущен, и идем дальше SUBS R2, #1 BNE M1 ; Пробуем еще раз B System_fault ; Если не запустился, то ошибка! Fuck!
MOV32 R0, #SWS1 ; ожидаем пока Sysclck не переключится на PLL M9 LDR R1, [R0] ; читаем флаг готовности SWS1 CMP R1, #0 ; Проверяем флаг готовности BEQ M9 ; ждем пока не установится в 1
Зарегистрирован: Пт мар 28, 2014 06:51:19 Сообщений: 4
Рейтинг сообщения:0
Andrew_KMR писал(а):
Вы что весь код на ассемблере пишите?
Пока да, Си не знаю, а с ассемблером все просто. Насчет моей проблемы, один человек сказал, что у него мой проект запускается и в обработчик прерывания вызывается нормально. Может в настройках Keil выставил что не так?
По Keil честно не знаю, но в настройках Iar сложно сделать не рабочими прерывания, при условии успешной компиляции проекта и наличия подключаемых модулей. Я бы посоветовал для инициализации перифирии и прерываний использовать библиотечные функции, а уже в критичных по времени участках кода писать на ассемблере.Так будет легче работать с перифирией, тот же USB, FSMC, DCMI…
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Зарегистрирован: Пт мар 28, 2014 06:51:19 Сообщений: 4
Рейтинг сообщения:0
В общем я выяснил, что программа все-таки попадает в обработчик. Поставил breakpoint в обработчике, запустил выполнение программы и оказался в обработчике. Когда я работал на Pinboard II с stm32f103 и отлаживал через JTAG картина была другая: после переполнения сразу вылетало прерывание, и если в обработчике опять возникало переполнение (т.к. таймер/периферия при отладке не останавливается и работает независимо от ядра), то после выхода из него обработчик вызывался повторно. Как я понял с SWD как-то по другому... но как? Сейчас получается, что когда я пошагово отлаживаю программу обработчик не вызывается (а таймер как видно по регистру счета CNT так же не останавливается), и только если нажму "RUN" в него можно попасть. Самое интересное, что прерывание вызывается не через строго одинаковые интервалы времени, а всегда по разному. Допустим задал я период счета 2 секунды, но судя по счетчику (на картинке) каждый раз прерывание может вызываться через разные интервалы времени. С чем это может быть связано? Проект полностью: http://yadi.sk/d/t8Tt48ruLUCL2
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Какой в этом смысл? И если на то уж пошло, то у TIM4 уже по-умолчанию установлен насколько это возможно наивысший приоритет = 0! Выше только у NMI, HardFault и т.п. И что с того? Может тогда уже всем остальным прерываниям понизить приоритет? Тут по моему в другом дело, и связано это с отладчиком. Ядро тормозится отладчиком, а счетчик продолжает работать. Обработчик в останове не отрабатывает. Возможно обработчик вызывается по фронту импульса, который генерируется событием переполнения. Но при установленном "pending" флаге он тоже по идее должен вызываться. Жаль нет знатока, который бы это мог все объяснить. Настроил в регистрах отладки, чтобы таймер останавливался вместе с ядром - тоже ставится этот "pending". И только нажав кнопку Run программа останавливается на брекпоинте в обработчике.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 34
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения