Здравствуйте! Данные вопросы относятся к микроконтроллеру FM33A048EV на Cortex-M0 процессоре. Я никогда ранее не пользовался средой Кейл, но вот нужно подключить экран к этому контроллеру и более подходящего варианта я не нашел. По итогам того, к чему я пришел, при попытке отладки, отладчик запускается, но если сделать шаг выдает ошибку JLink - Cortex-M Error. Что может быть причиной данной ошибки? Программа судя по логу в в чип загружается
Код:
Load "C:\\Projects\\keil\\FM33ADisp\\test.axf" * JLink Info: Device "CORTEX-M0" selected. Set JLink Project File to "C:\Projects\keil\FM33ADisp\JLinkSettings.ini" * JLink Info: Device "CORTEX-M0" selected.
Full Chip Erase Done. Programming Done. Verify OK. * JLink Info: Reset: Halt core after reset via DEMCR.VC_CORERESET. * JLink Info: Reset: Reset device via AIRCR.SYSRESETREQ. Application running ... Flash Load finished at 16:20:03
Так же настроил пин PG6 на высокий уровень, но на этом пине никаких движений не происходит.
С этими МК и с Кейл дел не имел, но первое что бросается в глаза: почему "max.clock" стоит = 5kHz? Это очень мало. Я обычно ставлю не менее 4 МГц (хотя работаю с более старшими ядрами чем CM0). Также лучше сразу в начале отладочной сессии (ещё до всяких шаганий) ещё и своими глазами убедиться, что прошивка реально прошилась в чип (открыв окно "Memory", перейдя в нём на начало флешь и глазами сравнив данные там с содержимым своего файла прошивки).
По итогам того, к чему я пришел, при попытке отладки, отладчик запускается, но если сделать шаг выдает ошибку JLink - Cortex-M Error. Что может быть причиной данной ошибки?
Что происходит после старта отладочной сессии? Показывает окошко с кодом и с точкой в которой сейчас находится PC? (остановленный) Причиной сбоев после загрузки может быть внезапно прилетевший на контроллер RESET. От WDT или по питанию или ещё от чего-то. Или какие-то другие проблемы с соединением эмулятора с отлаживаемым МК. Или с питанием.
Это лучше проверить своими глазами. По окошку "Memory". Тем более что и галки "Download to Flash" и "Verify Code Download" на последнем скрине у вас почему-то сняты.
Спасибо за ответ! 5кГц это я менял разные скорости. Сейчас поставил 5МГц, ничего не изменилось
Добавлено after 25 minutes 50 seconds: jcxz,
Добавлено after 6 minutes 5 seconds:
Добавлено after 3 minutes 52 seconds:
Добавлено after 32 minutes 1 second: Пересоздал проект. Память вроде программируется корректно. С адреса 0x0
Вот структура проекта и код
Окно отладчика когда я только в него вошёл. Почему то сразу запущен. Если остановить (на красный кружок с белым крестиком) он остановится но шаги не работают. Ничего не происходит.
Zikon, да, вот я позже пприсылал скриншоты там уже стоят как вы написали
Добавлено after 5 minutes 26 seconds: Zikon, сейчас при входе в отладчик сразу код идёт, или что, доступна кнопка STOP. Если нажать ее выделяются некоторые регистры синим, и всё. Шаги не делает, а если нажать Run to cursor line опять запускается и всё.
что за белый кружок с красным крестиком, и зачем его в отладчике нажимать
запускаем отладку и должен сразу на main() перейти и в си коде и в асм коде и дальше шагаем
Добавлено after 2 minutes 36 seconds: шаги делаем и при изменении - жёлтая стрелочка перемещается синие регистры - те которые изменились при шаге или шагах
может ещё зависит шаг в каком окне находишься
и как-то си программу там шаги странно работают я больше асм отлаживаю немного
в настройках можно в закладке Debug убрать галочку Run to main() тогда стартовать будет с ResetHandler и в асм окне будет если интересно асм по шагам смотреть
и сейчас проще в телеге найти канал по MCU и там спрашивать на форумах мало движухи и отклик долгий
Zikon, сейчас при входе в отладчик сразу код идёт, или что, доступна кнопка STOP.
После старта отладочной сессии, процессор должен по идее быть остановленным или в начале main() или по адресу вектора сброса. Не должен он быть в "run". Что-то не так тут. Может адрес точки входа (стартовый адрес прошивки) не задан или неправильно задан? Или выполнение по каким-то причинам не доходит от 0x165 до main()?
У вас, судя по скриншоту с образом прошивки, вектор сброса указывает на адрес 0x165. Можно перед подключением отладчика, поставить на этот адрес бряк (в окне дизасма). И дальше прошагать до начала main(). Или же 2-й бряк поставить на начало main() и от адреса 0x165 до бряка в main() запустить CPU свободно бежать (run). Исполнение должно дойти до бряка в main(). Если не дошло - искать что не так со входом в main(). Вобщем - я бы плясал от адреса в векторе сброса (0x165).
PS: В вашем МК флешь находится с адреса 0x00000000? Точно? Нужно убедиться в этом. У меня нет мануала на ваш МК - не знаю.
jcxz, когда я вхожу в дебаггер желтая стрелка уже сразу почему то стоит на while(1)
"Жёлтая стрелка" это видимо где должно идти выполнение кода. Но в окне слева у вас в регистре PC=0, хотя если CPU действительно выполняет команду по адресу 0x236, то должно быть PC=0x236. И в остальных регистрах почему-то 0. Не должно быть такого. Тем более что SP однозначно должен указывать на стек (RAM), а не на flash как у вас. К тому же вы скрыли код до 0x236. Там есть код начала main()? Или что там?
Вобщем - ваш отладчик показывает полную чушь (на последнем скриншоте). Советую также проверить реальность программирования флешь отдельно от Кейла. Запустите jflash.exe и проверьте содержимое флеши там.
убери старт отладки с main() ( в настройках проекта вкладка Debug и убери галочку на "Run to main()" ) должен при входе в отладку начинать с адреса ResetHandler 0x00000164
и зачаем Stop нажимать ? Run что-ли нажал - зачем ? Есть же step - разные
и правильно - если Run нажал - он у тебя в бесконечном цикле крутится - while(1) который Stop нажал - он там и выпал !
Где он должен быть то ещё ?
Странно main с адреса 0x00000218 и до while какая-то инициализация идёт а листинг откуда ?
Zikon, убирал run to main. Ничего не менялось. При входе в дебаггер он сразу стоит по тому Адресу что на картинке. И сразу почему то как будто запущен (как на скрине). Я run не нажимал.. так сразу, при входе в отладчик. Листинг с дизасеиблера отладчика
Zikon, убирал run to main. Ничего не менялось. При входе в дебаггер он сразу стоит по тому Адресу что на картинке.
Он у вас как раз не стоит. (как сами же пишете) А CPU выполняет программу. А должен именно стоять после старта отладочной сессии. На начале main() или на адресе reset-вектора. Как будто что-то заставляет отладчик нажать "run" самостоятельно. Или как будто отладчик не видит точки входа программы.
Интересно - а какой адрес фигурирует в .hex-файле в качестве стартового адреса программы? Это строка .hex-файла с типом =5. См.описание .hex: https://ru.wikipedia.org/wiki/Intel_HEX там ищем "32-битный адрес запуска программы в «линейном» адресном пространстве".
Странно main с адреса 0x00000218 и до while какая-то инициализация идёт
Там как раз ничего странного: По reset-вектору сразу делается вызов SystemInit() (почему-то пустой, который только зачем-то записывает одно слово в начало ОЗУ и больше ничего не делает). А после выхода из SystemInit() выполняется си-стартап код. Который должен быть выполнен до входа в main(). Тут всё стандартно. Странно, что CPU проскакивает все эти адреса без остановки. Не останавливаясь ни на ResetHandler ни в начале main().
PS: Подозреваю что какая-то фигня в .elf-файле. Со старт-адресом программы.
Типу 5 соответствует предпоследняя строка :04000005000000C136 . Выходит что адрес 0x000000C1, исходя из примеров данного формата. Но в дизассемблере что-то я не наблюдаю такого адреса
Добавлено after 4 minutes 28 seconds: Приведу еще системИнит и стартап коды
Код:
;//-------- <<< Use Configuration Wizard in Context Menu >>> ---------- ;*/
All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of ARM nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------*/
#include <stdint.h> #include "FM33A0XXEV.h"
/*---------- DEFINES *----------*/
/*---------- Define clocks *----------*/ /* ToDo: add here your necessary defines for device initialization following is an example for different system frequencies */ #define __SYSTEM_CLOCK (8000000) /* Value of the INITIAL frequencies in Hz */
/*---------- Clock Variable definitions *----------*/ /* ToDo: initialize SystemCoreClock with the system core clock frequency value achieved after system intitialization. This means system core clock frequency after call to SystemInit() */ uint32_t SystemCoreClock = __SYSTEM_CLOCK; /*!< System Clock Frequency (Core Clock)*/
/*---------- Clock functions *----------*/ void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ { /* ToDo: add code to calculate the system frequency based upon the current register settings. This function can be used to retrieve the system core clock frequeny after user changed register sittings. */ SystemCoreClock = __SYSTEM_CLOCK; //return; }
/** * Initialize the system * * @param none * @return none * * @brief Setup the microcontroller system. * Initialize the System. */ void SystemInit (void) { /* ToDo: add code to initialize the system do not use global variables because this function is called before reaching pre-main. RW section maybe overwritten afterwards. */ SystemCoreClock = __SYSTEM_CLOCK; //return; }
Добавлено after 11 minutes 48 seconds:
При попытке чтения JFlash почему то не показывает память. Хотя программа пишет что коннектится и очищает чип.
адреса в Cortex-M выровнены по 2 байта, но младший бит используется для указания что это сокращённая система команд Thumb и должен быть равен 1 реальный адрес 0x000000C0 и по этому адресу находится процедура __main внутренняя обёртка для функции main() в которой делаются многие инициализации до запуска main()
точно также адрес ResetHandler расположен по адресу 0x00000004
и равняется 0x00000165 -> 0x00000164
и если адрес старта записан в HEX (как тип 5) скорее всего надо после того как убрать галочку с "Run to main" заново собрать прроект (Build) и запустить отладку ?
Может ещё надо описания чипа для JLink установить (JLinkDevices) какие-то дополнительные моменты есть у этих чипов ? Но не нашёл что-то для этих чипов такое.
- WARNING: Flash bank 0 disabled, skipped. может в этом проблема?
Скорее всего. Похоже у вас стоит защита на флешь. Сделайте полное стирание чипа "Erase chip". Потом - "Check blank". В JFlash. Полное стирание иногда позволяет снять защиту флешь. И не должно быть никаких ошибок или варнингов в логе. Если JFlash не работает с МК, то пытаться что-то делать отладчиком - бессмысленно. Отладчик просто врёт что загрузил прошивку.
Типу 5 соответствует предпоследняя строка :04000005000000C136 . Выходит что адрес 0x000000C1, исходя из примеров данного формата. Но в дизассемблере что-то я не наблюдаю такого адреса
С .hex у вас всё нормально. Стартовые адреса правильные. Zikon уже правильно написал.
PS: Я бы, в целях теста, скомпоновал программу в ОЗУ. И попробовал запустить оттуда. Тем более что её вроде "up to 80KB". Если флешь залочена, то возможно из ОЗУ запуск получится. Да и отлаживать программы в ОЗУ обычно удобнее. Если размер позволяет.
PPS: Также ваш мануал содержит описание "LDT0 page" и "LDT1 page", в которых содержатся некие LOCK-слова и OPTBYTES. Почитайте про них подробнее - возможно с их помощью можно разлочить флешь.
Сейчас этот форум просматривают: Sergi и гости: 16
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения