Не могу залить код в контроллер Миландр 1986ВЕ92

Только начинаю работать с контроллерами. Заливаю простенький код на работу с кнопками, светодиодами.

Работаю с платой LDM-K1986BE92QI. Испрользую eclipse. Flash и RTT с помощью: https://github.com/in4lio/mdr1986x-JFlash

Все работало отлично, но в один момент код перестал заливаться в eeprom. Причем любой код, и тот который был ранее проверен и мною не изменялся.

Простенький код. Вообще проблема появилась после того как начал пытаться включить тактирование не всей периферии сразу, а только нужных портов. Совпадение или нет? Первая мысль новичка - по какой то причине не удается стереть старое содержимое EEPROM перед заливкой нового. И нужно каким-то другим способом стереть EEPROM. Но строки eeprom_erase() ok в KiTTY смущают. Не очень хочется слепо тыкаться, не до конца понимая что происходит, чтобы не испортить. В какую сторону копать? Где может быть проблема?

Самый простой код, который заливаю:

#include <stdio.h>
#include "SEGGER_RTT.h"
#include "MDR32F9Qx_config.h"
#include "MDR32F9Qx_port.h"
#include "MDR32Fx.h"


#define BUTTON_SELECT (1<<2)
#define BUTTON_DOWN (1<<1)

#define LAMP_VD5 (1<<0)
#define LAMP_VD4 (1<<1)

void main (void) {
    MDR_RST_CLK->PER_CLOCK = 0xFFFFFFFF;
//  MDR_RST_CLK->PER_CLOCK = (1<<22)|(1<<23)|(1<<25);
//  MDR_RST_CLK->PER_CLOCK = 0x2C00000;

    MDR_PORTC->ANALOG = BUTTON_SELECT;
    MDR_PORTC->PWR = BUTTON_DOWN;

    MDR_PORTE->ANALOG = BUTTON_DOWN;
    MDR_PORTE->PWR = BUTTON_DOWN;

    MDR_PORTB->OE = LAMP_VD4|LAMP_VD5;
    MDR_PORTB->ANALOG = LAMP_VD4|LAMP_VD5;
//  MDR_PORTB->ANALOG |= 0x0000FFFF;
//  MDR_PORTB->PWR = LAMP_VD5|LAMP_VD4;
    MDR_PORTB->PWR |= 0x55555555;

    while(1) {
        if (MDR_PORTC->RXTX & BUTTON_SELECT) {
            MDR_PORTB->RXTX &= ~LAMP_VD5;
    } else {
            MDR_PORTB->RXTX |= LAMP_VD5;

        }

        if (MDR_PORTE->RXTX & BUTTON_DOWN) {
            MDR_PORTB->RXTX &= ~LAMP_VD4;
    } else {
            MDR_PORTB->RXTX |= LAMP_VD4;

        }
}

}

Консоль eclipse сообщает что "ERROR EEPROM is not empty"

09:44:20.503 INFO     J-Link GDB Server connecting...
09:44:20.528 INFO     JFlash 0.7.5
09:44:20.528 INFO     Binary file: eval_board_manual.bin
09:44:20.529 INFO     Size: 13636
09:44:20.529 INFO     CRC-32: 0xa32de338
09:44:20.529 INFO     Hello!
09:44:20.552 DEBUG    Resets core & peripherals via SYSRESETREQ & VECTRESET bit.
09:44:20.559 INFO     CPUID: 0x412fc230 (CM3)
09:44:20.559 INFO     MCU data buffer at 0x20002464
09:44:20.559 INFO     MCU state at 0x2000245c
09:44:20.736 INFO     LOADER uploading...
09:44:20.851 DEBUG    Restoring binary file D:\programming\aps\cortex\packages\Milandr\MDR1986BExx\1.4.2\JFlash\LOADER/LOADER_F9Qx.bin into memory (0x20000000 to 0x20001110)
09:44:21.023 INFO     EEPROM erasing...
09:44:21.056 INFO     TICK
09:44:21.484 ERROR    EEPROM is not empty.

В консоли KiTTY, которая используется для RTT такое:

SEGGER J-Link V6.12 - Real time terminal output
SEGGER J-Link ARM V8.0, SN=11111118
Process: JLinkGDBServerCL.exe

MCU MDR32F9Qx EEPROM LOADER 0.7

eeprom_erase()
ok

Вот что в консоли GDB сервера:

SEGGER J-Link GDB Server V6.12 Command Line Version

JLinkARM.dll V6.12 (DLL compiled Nov 25 2016 18:08:26)

-----GDB Server start settings-----
GDBInit file:                  none
GDB Server Listening port:     2331
SWO raw output listening port: 2332
Terminal I/O port:             2333
Accept remote connection:      localhost only
Generate logfile:              off
Verify download:               on
Init regs on start:            off
Silent mode:                   off
Single run mode:               off
Target connection timeout:     none
------J-Link related settings------
J-Link Host interface:         USB
J-Link script:                 none
J-Link settings file:          none
------Target related settings------
Target device:                 Cortex-M1
Target interface:              SWD
Target interface speed:        2000kHz
Target endian:                 little

Connecting to J-Link...
J-Link is connected.
Firmware: J-Link ARM V8 compiled Nov 28 2014 13:44:46
Hardware: V8.00
S/N: 11111118
Checking target voltage...
Target voltage: 3.25 V
Listening on TCP/IP port 2331
Connecting to target...WARNING: Identified core does not match configuration. (F
ound: Cortex-M3, Configured: Cortex-M1)
Connected to target
Waiting for GDB connection...Connected to 127.0.0.1
Reading all registers
Read 4 bytes @ address 0x20000F86 (Data = 0x681B4B19)
Read 2 bytes @ address 0x20000F86 (Data = 0x4B19)
Executed SetRTTAddr 0x200005f0
Resets core & peripherals via SYSRESETREQ & VECTRESET bit.
Starting target CPU...
GDB closed TCP/IP connection
Connected to 127.0.0.1
Reading all registers
ERROR: Can not read register 0 (R0) while CPU is running
ERROR: Can not read register 1 (R1) while CPU is running
ERROR: Can not read register 2 (R2) while CPU is running
ERROR: Can not read register 3 (R3) while CPU is running
ERROR: Can not read register 4 (R4) while CPU is running
ERROR: Can not read register 5 (R5) while CPU is running
ERROR: Can not read register 6 (R6) while CPU is running
ERROR: Can not read register 7 (R7) while CPU is running
ERROR: Can not read register 8 (R8) while CPU is running
ERROR: Can not read register 9 (R9) while CPU is running
ERROR: Can not read register 10 (R10) while CPU is running
ERROR: Can not read register 11 (R11) while CPU is running
ERROR: Can not read register 12 (R12) while CPU is running
ERROR: Can not read register 13 (R13) while CPU is running
ERROR: Can not read register 14 (R14) while CPU is running
ERROR: Can not read register 15 (R15) while CPU is running
ERROR: Can not read register 16 (XPSR) while CPU is running
ERROR: Can not read register 17 (MSP) while CPU is running
ERROR: Can not read register 18 (PSP) while CPU is running
ERROR: Can not read register 24 (PRIMASK) while CPU is running
ERROR: Can not read register 25 (BASEPRI) while CPU is running
ERROR: Can not read register 26 (FAULTMASK) while CPU is running
ERROR: Can not read register 27 (CONTROL) while CPU is running
Read 4 bytes @ address 0x00000000 (Data = 0x20008000)
Read 4 bytes @ address 0x00000000 (Data = 0x20008000)
Resets core & peripherals via SYSRESETREQ & VECTRESET bit.
Halting target CPU...
...Target halted (PC = 0x000000A6)
Read 4 bytes @ address 0xE000ED00 (Data = 0x412FC230)
Reading 8192 bytes @ address 0x08000000
Reading 5444 bytes @ address 0x08002000
Downloading 4096 bytes @ address 0x20000000 - Verified OK
Downloading 272 bytes @ address 0x20001000 - Verified OK
Writing register (F1 = 0x20008000)
Writing register (PC = 0x20000B44)
Downloading 4 bytes @ address 0xE000E008 - Verify failed
Reading all registers
Read 4 bytes @ address 0x20000B44 (Data = 0x4A0B490A)
Read 2 bytes @ address 0x20000B44 (Data = 0x490A)
Read 4 bytes @ address 0xFFFFFFFF (Data = 0x00800000)
Read 2 bytes @ address 0xFFFFFFFF (Data = 0x0000)
Read 4 bytes @ address 0xFFFFFFFF (Data = 0x00800000)
Read 2 bytes @ address 0xFFFFFFFF (Data = 0x0000)
Downloading 4 bytes @ address 0x2000245C - Verified OK
Reading all registers
Read 4 bytes @ address 0x20000B44 (Data = 0x4A0B490A)
Read 2 bytes @ address 0x20000B44 (Data = 0x490A)
Executed SetRTTAddr 0x20002414
Starting target CPU...
Halting target CPU...
...Target halted (PC = 0x20000FD4)
Read 4 bytes @ address 0x2000245C (Data = 0xFFFFFFFF)
Downloading 4 bytes @ address 0x2000245C - Verified OK
Reading all registers
Read 4 bytes @ address 0x20000FD4 (Data = 0xBF00E7D7)
Read 2 bytes @ address 0x20000FD4 (Data = 0xE7D7)
Read 4 bytes @ address 0x2000024E (Data = 0x687B69FA)
Read 2 bytes @ address 0x2000024E (Data = 0x69FA)
Read 4 bytes @ address 0x2000024E (Data = 0x687B69FA)
Read 2 bytes @ address 0x2000024E (Data = 0x69FA)
Starting target CPU...
Read 4 bytes @ address 0x2000245C (Data = 0x00000001)
Read 4 bytes @ address 0x2000245C (Data = 0xFFFFFFFF)
Halting target CPU...
...Target halted (PC = 0x20000F86)
Read 4 bytes @ address 0x08000000 (Data = 0x20008000)
GDB closed TCP/IP connection

Ответы (1 шт):

Автор решения: maestro

У этих контроллеров есть несколько блоков, тактирование которых отключать ни в коем случае нельзя. Сейчас я не помню, какие именно, но вы можете увидеть их в отладчике - в регистре PER_CLOCK они сразу после запуска будут установлены в единицу. Когда вы пишете:

MDR_RST_CLK->PER_CLOCK = (1<<22)|(1<<23)|(1<<25);

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

Чтобы установить какой-то отдельный бит в регистре, не меняя остальные, воспользуйтесь следующим кодом:

MDR_RST_CLK->PER_CLOCK |= (1<<22)|(1<<23)|(1<<25);

Чтобы снять какой-то бит, делайте так:

MDR_RST_CLK->PER_CLOCK &= ~((1<<22)|(1<<23)|(1<<25));

Теперь о том, как реанимировать ваш контроллер. Нужно заставить его не выполнять зашитую вами программу, которая перекрывает процу кислород. Для этого надо выбрать нужный режим загрузки с помощью выводов MODE0, MODE1, MODE2. В даташите есть таблица, показывающая, какой режим какой комбинацией задаётся. Выберите такой режим, который исключает выполнение программы из флеш-памяти по адресу 0x08000000. После этого залейте рабочую прошивку.

→ Ссылка