|
Отладка flash-проекта с помощью AT91SAM7S-EK (SAM7S64), Может можно как-нибудь иначе? Кто как пользуется отладкой во flash? |
|
|
|
Dec 27 2005, 16:54
|
Частый гость
 
Группа: Новичок
Сообщений: 170
Регистрация: 26-05-05
Из: Москва
Пользователь №: 5 405

|
Большой привет! Я отлаживаю код во flash в IAR v4.30a с помощью платы из AT91SAM7S-EK.  Для того, чтобы перед каждым сеансом загрузки кода flash была чистой, мне пришлось впаять вместо штырей джампера JP28 кнопку (ERASE), а для функционирования кнопки RESET (BP5) - впаять резистор-перемычку R17.  Каждый раз перед загрузкой проекта я нажимаю сначала кнопку ERASE, затем кнопку RESET, затем вхожу в режим отладки. Теоретически эту последовательность можно "загнать" в макрос. Если так, то КАК это сделать? Далее, если мне нужно сбросить плату, не перепрошивая flash, опять же теоретически достаточно нажать кнопку (среды IAR-EW) Reset, однако на практике это приводит лишь к сбросу PC и очистке регистров. Возможно, что-то ещё очищается, но при запуске программа ведёт себя инчае, нежели чем при запуске после перезагрузки flash, в частности, не работает периферия, не генерятся прерывания, хотя код инициализации один. Другими словами, для того, чтобы начать выполняться коду, необходимо выполнить перезагрузку flash. Соответственно, вопрос: как настроить среду IAR EW 4.30a таким образом, чтобы по нажатию кнопки Reset процессор находился бы в таком же состоянии, как после процедуры стирания->сброса->загрузки flash ? Спасибо.
|
|
|
|
|
 |
Ответов
(1 - 10)
|
Dec 28 2005, 09:45
|
Частый гость
 
Группа: Новичок
Сообщений: 170
Регистрация: 26-05-05
Из: Москва
Пользователь №: 5 405

|
Вот сейчас могу утверждать, что без нажатия кнопки ERASE отладчик даже до main не доходит. Если вручную остановить, обязательно попаду в обработчик прерывания. Может настройки проекта неверные? У меня такие:     Файл SAM7.mac имеет следующее содержание: Код // --------------------------------------------------------- // ATMEL Microcontroller Software Support - ROUSSET - // --------------------------------------------------------- // The software is delivered "AS IS" without warranty or // condition of any kind, either express, implied or // statutory. This includes without limitation any warranty // or condition with respect to merchantability or fitness // for any particular purpose, or against the infringements of // intellectual property rights of others. // --------------------------------------------------------- // File: SAM7.mac // // 1.0 08/Mar/04 JPP : Creation // 1.1 23/Mar/05 JPP : Change Variable name // // $Revision: 1.4 $ // // ---------------------------------------------------------
__var __mac_i; __var __mac_pt;
execUserReset() { CheckRemap(); ini(); AIC(); __message "-------------------------------Set Reset ----------------------------------------"; __writeMemory32(0x00000000,0xB4,"Register"); }
//----------------------------------------------------------------------------- // Watchdog //------------------------------- // Normally, the Watchdog is enable at the reset for load it's preferable to // Disable. //----------------------------------------------------------------------------- Watchdog() { //* Watchdog Disable // AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS; __writeMemory32(0x00008000,0xFFFFFD44,"Memory"); __message "------------------------------- Watchdog Disable ----------------------------------------"; }
//----------------------------------------------------------------------------- // Check Remap //------------- //----------------------------------------------------------------------------- CheckRemap() { //* Read the value at 0x0 __mac_i =__readMemory32(0x00000000,"Memory"); __mac_i =__mac_i+1; __writeMemory32(__mac_i,0x00,"Memory"); __mac_pt =__readMemory32(0x00000000,"Memory"); if (__mac_i == __mac_pt) { __message "------------------------------- The Remap is done ----------------------------------------"; //* Toggel RESET The remap __writeMemory32(0x00000001,0xFFFFFF00,"Memory"); } else { __message "------------------------------- The Remap is NOT -----------------------------------------"; }
}
execUserSetup() { ini(); __message "-------------------------------Set PC ----------------------------------------"; __writeMemory32(0x00000000,0xB4,"Register"); }
//----------------------------------------------------------------------------- // Reset the Interrupt Controller //------------------------------- // Normally, the code is executed only if a reset has been actually performed. // So, the AIC initialization resumes at setting up the default vectors. //----------------------------------------------------------------------------- AIC() { // Mask All interrupt pAic->AIC_IDCR = 0xFFFFFFFF; __writeMemory32(0xffffffff,0xFFFFF124,"Memory"); __writeMemory32(0xffffffff,0xFFFFF128,"Memory"); // disable peripheral clock Peripheral Clock Disable Register __writeMemory32(0xffffffff,0xFFFFFC14,"Memory");
// #define AT91C_TC0_SR ((AT91_REG *) 0xFFFA0020) // (TC0) Status Register // #define AT91C_TC1_SR ((AT91_REG *) 0xFFFA0060) // (TC1) Status Register // #define AT91C_TC2_SR ((AT91_REG *) 0xFFFA00A0) // (TC2) Status Register __readMemory32(0xFFFA0020,"Memory"); __readMemory32(0xFFFA0060,"Memory"); __readMemory32(0xFFFA00A0,"Memory"); for (__mac_i=0;__mac_i < 8; __mac_i++) { // AT91C_BASE_AIC->AIC_EOICR __mac_pt = __readMemory32(0xFFFFF130,"Memory"); } __message "------------------------------- AIC 2 INIT ---------------------------------------------"; }
ini() { __writeMemory32(0x0,0x00,"Register"); __writeMemory32(0x0,0x04,"Register"); __writeMemory32(0x0,0x08,"Register"); __writeMemory32(0x0,0x0C,"Register"); __writeMemory32(0x0,0x10,"Register"); __writeMemory32(0x0,0x14,"Register"); __writeMemory32(0x0,0x18,"Register"); __writeMemory32(0x0,0x1C,"Register"); __writeMemory32(0x0,0x20,"Register"); __writeMemory32(0x0,0x24,"Register"); __writeMemory32(0x0,0x28,"Register"); __writeMemory32(0x0,0x2C,"Register"); __writeMemory32(0x0,0x30,"Register"); __writeMemory32(0x0,0x34,"Register"); __writeMemory32(0x0,0x38,"Register");
// Set CPSR __writeMemory32(0x0D3,0x98,"Register");
}
RG() {
__mac_i =__readMemory32(0x00,"Register"); __message "R00 0x",__mac_i:%X; __mac_i =__readMemory32(0x04,"Register"); __message "R01 0x",__mac_i:%X; __mac_i =__readMemory32(0x08,"Register"); __message "R02 0x",__mac_i:%X; __mac_i =__readMemory32(0x0C,"Register"); __message "R03 0x",__mac_i:%X; __mac_i =__readMemory32(0x10,"Register"); __message "R04 0x",__mac_i:%X; __mac_i =__readMemory32(0x14,"Register"); __message "R05 0x",__mac_i:%X; __mac_i =__readMemory32(0x18,"Register"); __message "R06 0x",__mac_i:%X; __mac_i =__readMemory32(0x1C,"Register"); __message "R07 0x",__mac_i:%X; __mac_i =__readMemory32(0x20,"Register"); __message "R08 0x",__mac_i:%X; __mac_i =__readMemory32(0x24,"Register"); __message "R09 0x",__mac_i:%X; __mac_i =__readMemory32(0x28,"Register"); __message "R10 0x",__mac_i:%X; __mac_i =__readMemory32(0x2C,"Register"); __message "R11 0x",__mac_i:%X; __mac_i =__readMemory32(0x30,"Register"); __message "R12 0x",__mac_i:%X; __mac_i =__readMemory32(0x34,"Register"); __message "R13 0x",__mac_i:%X; __mac_i =__readMemory32(0x38,"Register"); __message "R14 0x",__mac_i:%X; __mac_i =__readMemory32(0x3C,"Register"); __message "R13 SVC 0x",__mac_i:%X; __mac_i =__readMemory32(0x40,"Register"); __message "R14 SVC 0x",__mac_i:%X; __mac_i =__readMemory32(0x44,"Register"); __message "R13 ABT 0x",__mac_i:%X; __mac_i =__readMemory32(0x48,"Register"); __message "R14 ABT 0x",__mac_i:%X; __mac_i =__readMemory32(0x4C,"Register"); __message "R13 UND 0x",__mac_i:%X; __mac_i =__readMemory32(0x50,"Register"); __message "R14 UND 0x",__mac_i:%X; __mac_i =__readMemory32(0x54,"Register"); __message "R13 IRQ 0x",__mac_i:%X; __mac_i =__readMemory32(0x58,"Register"); __message "R14 IRQ 0x",__mac_i:%X; __mac_i =__readMemory32(0x5C,"Register"); __message "R08 FIQ 0x",__mac_i:%X; __mac_i =__readMemory32(0x60,"Register"); __message "R09 FIQ 0x",__mac_i:%X; __mac_i =__readMemory32(0x64,"Register"); __message "R10 FIQ 0x",__mac_i:%X; __mac_i =__readMemory32(0x68,"Register"); __message "R11 FIQ 0x",__mac_i:%X; __mac_i =__readMemory32(0x6C,"Register"); __message "R12 FIQ 0x",__mac_i:%X; __mac_i =__readMemory32(0x70,"Register"); __message "R13 FIQ 0x",__mac_i:%X; __mac_i =__readMemory32(0x74,"Register"); __message "R14 FIQ0x",__mac_i:%X; __mac_i =__readMemory32(0x98,"Register"); __message "CPSR ",__mac_i:%X; __mac_i =__readMemory32(0x94,"Register"); __message "SPSR ",__mac_i:%X; __mac_i =__readMemory32(0x9C,"Register"); __message "SPSR ABT ",__mac_i:%X; __mac_i =__readMemory32(0xA0,"Register"); __message "SPSR ABT ",__mac_i:%X; __mac_i =__readMemory32(0xA4,"Register"); __message "SPSR UND ",__mac_i:%X; __mac_i =__readMemory32(0xA8,"Register"); __message "SPSR IRQ ",__mac_i:%X; __mac_i =__readMemory32(0xAC,"Register"); __message "SPSR FIQ ",__mac_i:%X;
__mac_i =__readMemory32(0xB4,"Register"); __message "PC 0x",__mac_i:%X;
} И опять же не понятно, почему неадекватно поведение кнопки Reset в среде IAR EW... P.S. Отдельное спасибо создателям данного форума - пользоваться одно удовольствие.
|
|
|
|
|
Dec 28 2005, 11:59
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
Приложенные картинки не видны, поэтому сказать что-то относительно настроек не могу. Прикрепляю файлы настроек рабочего проекта, сравните со своими.
Прикрепленные файлы
basic.rar ( 3.88 килобайт )
Кол-во скачиваний: 65
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Dec 28 2005, 16:01
|
Частый гость
 
Группа: Новичок
Сообщений: 170
Регистрация: 26-05-05
Из: Москва
Пользователь №: 5 405

|
Чтобы увидеть картинки, надо либо немного подождать, либо обновить их после загрузки всей страницы - Narod.ru иногда подтормаживает. Касательно загрузки и отладки я нашёл только три разницы:   Попробовал сделать так же, эффект - 0. Всё по прежнему: без стирания flash кнопкой ERASE отладчик не доходит до main. Причём прерывание, в котором отладчик оказывается - System Interrupt (SYSIRQ, ID=1). Кнопка среды Reset ведёт себя так же. Похоже, дело не в бобине
|
|
|
|
|
Dec 28 2005, 16:54
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
У картинок странный адрес; впрочем, посмотрел их в отдельном окне.Цитата Похоже, дело не в бобине  Дело и в этом тоже (рис. 1 предыдущего поста). Ещё посмотрите xcl на предмет диапазона флэш-памяти и векторов. Я завёл проект, выставив такие значения: Код -DROMSTART=00100000 -DROMEND=0010FFFF -Z(CODE)INTVEC=00100000-0010003F А вообще, конечно, пришлось повозиться, пока подобрал рабочие настройки
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Dec 28 2005, 17:02
|
Частый гость
 
Группа: Новичок
Сообщений: 170
Регистрация: 26-05-05
Из: Москва
Пользователь №: 5 405

|
Цитата(vet @ Dec 27 2005, 21:37)  я прошиваю флэш простым нажатием Ctrl+D в IDE, без дополнительных действий. Плата та же, соединяюсь через J-Link, настройки проекта взяты из примеров, модель Debug_flash. Я вот чего не увидел, А ГДЕ В ВАШЕМ СООБЩЕНИИ НАПИСАНО, ЧТО ТАК МОЖНО ОТЛАЖИВАТЬСЯ ВО FLASH??!! Если отлаживаться в ОЗУ, то заморочек со стиранием flash не существует, а вот при отладке кода во flash... Я подчёркиваю, при отладке! а не при однократной загрузке и запуске кода.
|
|
|
|
|
Dec 28 2005, 17:05
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
Цитата(Master @ Dec 28 2005, 20:02)  Цитата(vet @ Dec 27 2005, 21:37)  я прошиваю флэш простым нажатием Ctrl+D в IDE, без дополнительных действий. Плата та же, соединяюсь через J-Link, настройки проекта взяты из примеров, модель Debug_flash.
Я вот чего не увидел, А ГДЕ В ВАШЕМ СООБЩЕНИИ НАПИСАНО, ЧТО ТАК МОЖНО ОТЛАЖИВАТЬСЯ ВО FLASH??!! Если отлаживаться в ОЗУ, то заморочек со стиранием flash не существует, а вот при отладке кода во flash... Я подчёркиваю, при отладке! а не при однократной загрузке и запуске кода. Разумеется, отлаживаюсь - загрузить и самбой можно, стоило ли пользовать тогда J-Link
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Dec 28 2005, 17:18
|
Частый гость
 
Группа: Новичок
Сообщений: 170
Регистрация: 26-05-05
Из: Москва
Пользователь №: 5 405

|
Цитата(vet @ Dec 28 2005, 19:54)  Дело и в этом тоже (рис. 1 предыдущего поста). Ещё посмотрите xcl на предмет диапазона флэш-памяти и векторов. Я завёл проект, выставив такие значения: Код -DROMSTART=00100000 -DROMEND=0010FFFF -Z(CODE)INTVEC=00100000-0010003F Я не совсем понимаю смысл в данном дополнительном определении расположения flash-памяти в адресном пространстве... Вот цитата из документа doc6175.pdf, страница 18: Цитата The AT91SAM7S256/128/64/321/32 features one bank of 256/128/64/32/32 Kbytes of Flash. At any time, the Flash is mapped to address 0x0010 0000. It is also accessible at address 0x0 after the reset and before the Remap Command. Переопределения (Remap Command) мы с Вами не делаем, соответственно, зачем дополнительно прописывать, где лежит flash? А самое главное, как это влияет на процесс отладки в данном случае?
Сообщение отредактировал Master - Dec 28 2005, 17:20
|
|
|
|
|
Dec 28 2005, 17:26
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
Цитата(Master @ Dec 28 2005, 20:18)  Я не совсем понимаю смысл в данном дополнительном определении расположения flash-памяти в адресном пространстве... Вот цитата из документа doc6175.pdf, страница 18: Цитата The AT91SAM7S256/128/64/321/32 features one bank of 256/128/64/32/32 Kbytes of Flash. At any time, the Flash is mapped to address 0x0010 0000. It is also accessible at address 0x0 after the reset and before the Remap Command. Переопределения (Remap Command) мы с Вами не делаем, соответственно, зачем дополнительно прописывать, где лежит flash? А самое главное, как это влияет на процесс отладки в данном случае? Подобрано методом проб и ошибок. Из перепробованных комбинаций настроек заработала именно эта. Другие - не работали, либо работали неверно. Про ремап - в курсе, тем не менее...
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Mar 5 2006, 19:44
|
Частый гость
 
Группа: Свой
Сообщений: 187
Регистрация: 22-06-04
Пользователь №: 127

|
Цитата .......... Я завёл проект, выставив такие значения: Код -DROMSTART=00100000 -DROMEND=0010FFFF -Z(CODE)INTVEC=00100000-0010003F Действительно, помогло. А на сайте IAR нашёл ещё один вариант, который тоже работает: В файле at91SAM7S64_Remap.xcl после строчки Код -Z(CODE)INTVEC=00-3F нужно вставить Код -QINTVEC=MOVED_INTVEC -Z(CODE)MOVED_INTVEC=ROMSTART-ROMEND В принципе, почти то же самое, только вместо одной строки - три. Вот ссылка: Using the Atmel remap feature together with IAR EWARM
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|