Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4 не стартует вне отладки
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
athlon64
Процессор STM32F407IGT6, ревизия Z.
Проект STM32F4x7_ETH_LwIP_V1.0.0 с сайта stm, из которого выкинута работа с сетью, оставлена только задача мигания светодиодами.
Коэффициенты PLL: M = 25, N = 336, P = 2, Q = 7. Кварц 25 МГц.

При запуске под отладкой (jlink) процессор успешно стартует и начинает мигать светодиодами.
При запуске не в отладке (при подаче питания) - процессор не стартует.
Ножка PDR_ON подключена к Vdd.

Куда копать?
AVNN
Цитата(athlon64 @ Nov 8 2012, 14:33) *
Куда копать?


Такое бывает если смещены векторы прерываний. Например если в файле icf (IAR) смещены ROM_Start и INTVEC_Start адреса
.
athlon64
С векторами прерываний всё в порядке.
В ходе экспериментов удалось выяснить следующее:
- В случае когда процессор не стартует, генерация на кварце 25 МГц отсутствует.
- При тактировании от HSI глюк повторяется аналогично тактованию от кварца.
- Если при включении удерживать сброс при подаче питания и после этого отпустить сброс, то процессор стартует стабильно. Сброс после подачи питания приводит к нормальному старту процессора.
- BOR включен, порог выставлен на 2,7В, при выставлении любых порогов или отключении BOR ситуация не меняется. Работу BOR проверили лабораторным БП - BOR срабатывает.
Всё это при запитывании процессора от БП на той же плате (5В на LM2679 -> 3.3В на LM1085)
- Под рукой есть плата Discovery с процессором STM32F407VG, при запитывании её от того же БП 3.3В (с платы устройства), процессор Discovery стартует стабильно. NRST у дискавери подключен аналогично.
- Если запитывать процессор от лабораторного БП в обход БП на плате, то процессор стартует стабильно.

Осциллограммы нарастания напряжения питания 3.3В (жёлтый) и уровня на ноге NRST (синий):
От лабораторного БП:
Нажмите для просмотра прикрепленного файла
От нашего БП:
Нажмите для просмотра прикрепленного файла

Какие у кого соображения?
Сергей Борщ
А на BOOT0 случайно никаких резисторов с емкостями нет? Есть возможность после того как не стартанул подключиться отладчиком на всем скаку и посмотреть, куда его занесло - в загрузчик, в исключение или еще куда?
athlon64
Цитата(Сергей Борщ @ Nov 12 2012, 13:54) *
А на BOOT0 случайно никаких резисторов с емкостями нет? Есть возможность после того как не стартанул подключиться отладчиком на всем скаку и посмотреть, куда его занесло - в загрузчик, в исключение или еще куда?

Стыдно признавать, но косяк действительно был в ноге BOOT0 biggrin.gif
Не был запаян резистор, подтягивающий её к земле, нога висела в воздухе.
Сейчас всё стабильно стартует всегда rolleyes.gif
Allregia
Цитата(athlon64 @ Nov 12 2012, 11:37) *
Стыдно признавать, но косяк действительно был в ноге BOOT0 biggrin.gif
Не был запаян резистор, подтягивающий её к земле, нога висела в воздухе.
Сейчас всё стабильно стартует всегда rolleyes.gif


А почему оно с отладчиком запускалсь, при плавающем буст0? Должно ведь было тоже глючить, или нет?
athlon64
Цитата(Allregia @ Nov 12 2012, 21:36) *
А почему оно с отладчиком запускалсь, при плавающем буст0? Дллжно ведь было тоже глючить, или нет?

Если дёрнуть резет после установления напряжения питания, то старт был стабильным.
Ну а отладчик как раз и дёргал резет.
LWW
У меня аналогичный глюк.. F4 дискавери, новенькая только из коробки. Родная прошивка (которая идёт с платой) работала, без всяких сбросов и перезапусков. Просто втыкаешь в USB и она работает.

Написал свою прошивку (моргание светодиодами). Что бы она стартанула, нужно открыть утилиту ST-LINK и подключиться/отключиться к камню. Или нажать System Reset в окне MCU Core.

Обратно возвращаю прошивку от дискавери - работает! А значит никаких перемычек и переделок не нужно.

Может дело в самой прошивке? Например, родная начинается с циферки 2
:20000000800C00202D420008353C0008373C0008393C00083B3C00083D3C0008000000004C

а моя прошивка начинается с единички, формат intel hex. И стока короче.
:10000000800C002088010000F6010000F6010000CD

Поразбирался - нет, дело не в формате прошивки, а в чём-то другом..

Залито всё правильно, с адреса 0800. Вектор на start и вершина стека установлены. Прерывания закрыты. Про ресету от ст-линка работает, а сама по себе не хочет sad.gif
LWW
И ещё, перемычки BOOT0/BOOT1 запапяны на землю. Так что и этот вариант отпадает..
_Артём_
Цитата(LWW @ Dec 22 2012, 11:45) *
Может дело в самой прошивке? Например, родная начинается с циферки 2
:20000000800C00202D420008353C0008373C0008393C00083B3C00083D3C0008000000004C

а моя прошивка начинается с единички, формат intel hex. И стока короче.
:10000000800C002088010000F6010000F6010000CD

10 и 20 - это количество байт данных в строке.

Цитата(LWW @ Dec 22 2012, 11:45) *
Залито всё правильно, с адреса 0800.

С 800 или с 0x800000?

Цитата(LWW @ Dec 22 2012, 11:45) *
Вектор на start и вершина стека установлены. Прерывания закрыты.

Откуда знаете про стек и старт? Что значит "Прерывания закрыты"?
LWW
Скорей всего тактирование периферии не включено. GPIODEN стоит но этого мало. SWD видимо что-то дополнительно от себя включает..

Одним словом, нужно до конца инициализировать камень. Сегодня поковыряюсь ещё.
LWW
Ну всё уже перепробовал. Все флажки попереключал, какие только есть.. Если сбрасывать через st-link SWD, работает. А просто кнопочкой сбросить - нет. В рот.. ну что за чудеса? wacko.gif
AHTOXA
Цитата(LWW @ Dec 22 2012, 21:44) *
ну что за чудеса? wacko.gif

Показывайте программу, чего уж.
LWW
Люди! Нет ну это же ну просто свинство!! Взял другую платку. На ней такой же камень и 4 светодиода, только на другом порту. Исправил имена портов. Работает! С первого пинка пошла. Причём как часики.


AHTOXA
Мимо sad.gif

Да и он на ассемблере. Очень простой код! И на другой-то плате работает. С первого раза запустился, только порт другой выставил. Вон лежит моргает...


На дискавери какая-то деталюха ступорит камень! Но с другой стороны интересно, если демо-код (с акселерометром и мышкой) работает, значит это можно обойти программно?

Может что-то с тактированием? Типа такты приходят от swd, а в камне фьюзами задано внешнее тактирование? Такое вообще бывает? (так помню бывало в тинках))
AHTOXA
Цитата(LWW @ Dec 23 2012, 00:38) *
AHTOXA
Мимо sad.gif

Эх, сорвался мой хитрый план выманить у вас код! sm.gif
Цитата(LWW @ Dec 23 2012, 00:38) *
Может что-то с тактированием? Типа такты приходят от swd, а в камне фьюзами задано внешнее тактирование? Такое вообще бывает? (так помню бывало в тинках))

Ждите прибытия телепатов.
LWW
А код очень маленький. Всего 120 байт. 26 инструкций.

Вот если решим проблему, покажу! a14.gif

Ну а какая телепатия? Два абсолютно одинаковых новых камня. На голой плате код работает. На дискавери нет.

Тут надо не код смотреть, а схему.. Чего там наворочали, что требуется какой-то хитрый сброс, что даже кнопка не помогает?
ViKo
Цитата(LWW @ Dec 22 2012, 21:47) *
Тут надо не код смотреть, а схему.. Чего там наворочали, что требуется какой-то хитрый сброс, что даже кнопка не помогает?

Схема на плату есть в User Manual. Скачивается с сайта ST.
LWW
Да я уж её всю пересмотрел..
LWW
Блииин.. Какой кошмар, люди... Ладно! Забудьте! Всё работает.

Показываю обещанный код cool.gif
http://stm32asm.ru/minimal_code.html
_Артём_
Цитата(LWW @ Dec 23 2012, 23:32) *
Блииин.. Какой кошмар, люди... Ладно! Забудьте! Всё работает.

Показываю обещанный код cool.gif
http://stm32asm.ru/minimal_code.html

Цитата
Помните, как это было в тинках и мегах? Нужно вначале установить вершину стека, прописать калибровочный байт, отрубить пса!

Калибровочный байт - это для RC что ли?
Стек компилятор пропишет до старта main - проблемы нет.

Цитата
А сколько народу на этом отрубилось!

Тьма...

Цитата
Ведь кто-же его поймёт, что по умолчанию пёс всегда включен и будет сбрасывать процессор до тех пор, пока не вырубишь!

Это зависит от модели меги и фузов. Но тоже не проблема.

Цитата
А калибровочный байт - его нужно предварительно считать из камня программатором и где-то сохранить. В каждом камне - свой уникальный байт. Очень много возни..

Кварц чем не устраивает?

P.S. Честно говоря ни разу не использовал этот регистр. Чем-то это чревато?
RabidRabbit
Цитата(LWW @ Dec 24 2012, 01:32) *
Показываю обещанный код cool.gif

А какой глубокий смысл в использовании Ваших макросов MOV32, когда можно тупо писать ldr r0, =число ??? sm.gif
LWW
Смотря какое число. Не всё можно загрузить через LDR. Изучите команду и поймёте sm.gif
Сергей Борщ
QUOTE (LWW @ Jan 9 2013, 23:18) *
Не всё можно загрузить через LDR. Изучите команду и поймёте sm.gif
Так "=" как раз и используется для того, чтобы об этом голова болела у ассемблера. Изучите ассемблер и поймете wink.gif

QUOTE
Syntax

The syntax of LDR is:
LDR{condition} register,=[expression | label-expression]

where:

...

expression
evaluates to a numeric constant:

If the value of expression is within range of a MOV or MVN instruction, the assembler generates the appropriate instruction.
If the value of expression is not within range of a MOV or MVN instruction, the assembler places the constant in a literal pool and generates a program-relative LDR instruction that reads the constant from the literal pool.
LWW
Там всякая ерунда написана.

LDR r1,=0xfff и
LDR r1, 0xffffffff

- это немного разные команды. Вы должны это понять. Объясняю, а то офф уже какой-то начался.. ARMv7 не имеет команды прямой загрузки 32-битной константы в регистр. А мой макрос MOV32 это делает в два шага.

Вот и всё.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.