Здравствуйте! Не могу победить ATSAM4S16C. Отладка всегда стартует с ROM 0x00800000 (ROM-bootloader). Вход ERASE, который выполняет стирание всего чипа после RESET, через 4.7К посадил на землю. На нём низкий уровень при старте.
Пробовал IDE Eclipse и Atollic TrueStudio, пробовал проект демо-платы Xplained из ASF, пробовал проект с нуля Atollic - результат один. Компилируется успешно. Связь с чипом OpenOCD через CMSIS-DAP-отладчик есть. Соединение IDE с GDB-сервером есть. Правда, штатная загрузка образа вообще не срабатывает ни в одной, ни в другой среде. Пришлось включить загрузку в скрипт запуска отладки или грузить вручную с telnet-консоли.
Попытка запуска выглядит примерно так:
./openocd -f /interface/cmsis-dap.cfg -c"transport select swd" -f /target/at91sam4sXX.cfgOpen On-Chip Debugger 0.10.0+dev-00207-g4109263-dirty (2017-11-18-23:30)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
swd
adapter speed: 500 kHz
adapter_nsrst_delay: 100
cortex_m reset_config sysresetreq
Info : CMSIS-DAP: SWD Supported
Info : CMSIS-DAP: JTAG Supported
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : CMSIS-DAP: FW Version = 1.10
Info : SWCLK/TCK = 0 SWDIO/TMS = 1 TDI = 0 TDO = 1 nTRST = 0 nRESET = 0
Info : CMSIS-DAP: Interface ready
Info : clock speed 500 kHz
Info : SWD DPIDR 0x2ba01477
Info : sam4.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : accepting 'telnet' connection on tcp/4444
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x0080004c msp: 0x20000800
** Programming Started **
auto erase enabled
Info : sam4 does not auto-erase while programming (Erasing relevant sectors)
Info : sam4 First: 0x00000000 Last: 0x00000000
Info : Erasing sector: 0x00000000
wrote 8192 bytes from file /home/nikolaypo/Atollic/TrueSTUDIO/ARM_workspace_8.0/sam4s_run_test/Debug/sam4s_run_test.hex in 1.738829s (4.601 KiB/s)
** Programming Finished **
** Verify Started **
verified 520 bytes in 0.203942s (2.490 KiB/s)
** Verified OK **
Info : accepting 'gdb' connection on tcp/3333
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x0080004c msp: 0x20000800
Скрипт интерфейса CMSIS-DAP такой:
# script for ATMEL sam4, a Cortex-M4 chip
#
source [find target/at91sam4XXX.cfg]
set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME at91sam4 0x00400000 0 1 1 $_TARGETNAME
gdb_flash_program enable
$_TARGETNAME configure -event gdb-attach {
reset init
}
Команду reset init на событие gdb-attach пришлось добавить, иначе на момент подключения GDB чип оставался в работе и на попытки внедрения точек останова не откликался.
На приведённом выше логе виден останов в коде загрузчика ROM. FLASH начинается с 0x00400000 и программа должна размещаться где-то здесь. Но как я ни бьюсь, запуска из FLASH не происходит. Точка останова на или внутри main() не срабатывает. Если ставлю точку останова на адресе в ROM, то останов происходит штатно. Работает пошаговая отладка, если выбрать Instuction Stepping Mode. Короче, всё работает, кроме того, чтобы запустить программу из FLASH.
Пробовал вручную изменить программный счётчик на 0x00400000, но программа опять вылетает на загрузчик ROM.
Во вложении файлы листинга, карты памяти, скрипт компоновщика и исполняемый файл.
ЧЯДНТ?
P.S. Вообще, со стороны OpenOCD всё выглядит адекватным. Вот отклик на запрос info:
> at91sam4 info
CKGR_MOR: [0x400e0420] -> 0x00000028
MOSCXTEN: 0 [0x0000] (main xtal enabled: NO)
MOSCXTBY: 0 [0x0000] (main osc bypass: NO)
MOSCRCEN: 1 [0x0001] (onchip RC-OSC enabled: YES)
MOSCRCF: 2 [0x0002] (onchip RC-OSC freq: 12 MHz)
MOSCXTST: 0 [0x0000] (startup clks, time= 0.000000 uSecs)
MOSCSEL: 0 [0x0000] (mainosc source: internal RC)
CFDEN: 0 [0x0000] (clock failure enabled: NO)
CKGR_MCFR: [0x400e0424] -> 0x00011b45
MAINFRDY: 1 [0x0001] (main ready: YES)
MAINF: 6981 [0x1b45] (14.297 Mhz (32.768khz slowclk)
CKGR_PLLAR: [0x400e0428] -> 0x08073f01
DIVA: 1 [0x0001]
MULA: 7 [0x0007]
PLLA Freq: 114.377 MHz
CKGR_UCKR: [0x400e041c] -> 0x00000000
PMC_FSMR: [0x400e0470] -> 0x00000000
PMC_FSPR: [0x400e0474] -> 0x00000000
PMC_IMR: [0x400e046c] -> 0x00000000
PMC_MCKR: [0x400e0430] -> 0x00000012
CSS: 2 [0x0002] plla (114.377 Mhz)
PRES: 1 [0x0001] (clock/2)
Result CPU Freq: 57.188
PMC_PCK0: [0x400e0440] -> 0x00000000
PMC_PCK1: [0x400e0444] -> 0x00000000
PMC_PCK2: [0x400e0448] -> 0x00000000
PMC_PCSR: [0x400e0418] -> 0x00000100
PMC_SCSR: [0x400e0408] -> 0x00000001
PMC_SR: [0x400e0468] -> 0x0002000a
CHIPID_CIDR: [0x400e0740] -> 0x28ac0ce0
Version: 0 [0x0000]
EPROC: 7 [0x0007] Cortex-M4
NVPSIZE: 12 [0x000c] 1024K bytes
NVPSIZE2: 0 [0x0000] none
SRAMSIZE: 12 [0x000c] 128K Bytes
ARCH: 138 [0x008a] ATSAM3S/SAM4S xC Series (100-pin version)
NVPTYP: 2 [0x0002] embedded flash memory
EXTID: 0 [0x0000] (exists: NO)
CHIPID_EXID: [0x400e0744] -> 0x00000000
rc-osc: 12.000 MHz
mainosc: 14.297 MHz
plla: 114.377 MHz
cpu-freq: 57.188 MHz
mclk-freq: 57.188 MHz
UniqueId: 0x53323100 0x3153344c 0x32303232 0x34363030
Может, не поднимается сконфигурированный в программе тактовый генератор и срабатывает исключение по останову генератора? После чего исполнение передаётся загрузчику в ПЗУ?