Доступ к загрузчику STM32L4 через USART: нет подтверждения - PullRequest
0 голосов
/ 02 июня 2019

Я пытаюсь получить доступ к загрузчику для "ведомой" платы Nucleo L476RG.

«Мастер» - это плата Nucleo L496ZG. В моей программе на главной плате определено DigitalOut, которое называется extBoot0, extReset. Они выходят на контакты boot0 и NRST на ведомой плате. Кроме того, у меня есть экземпляр Serial с именем usart на главном устройстве, который подключен к UART2 на ведомой плате. Кроме того, кажется, что там BOOT1 предустановлен для запуска загрузчика, то есть он имеет низкий уровень и не может быть изменен для запуска чего-либо в SRAM.

В настоящее время, в resetToBootloader, я устанавливаю BOOT0 высоким и понижаю NRST на 0,1 секунды, а затем возвращаю его на высокий уровень. Я заметил, что запуск этой функции действительно сбрасывает устройство и препятствует запуску программы.

В initBootloader я форматирую серийный номер для AN2606: 8-битный, четный, 1 стоповый бит. Затем я посылаю 0x7F через эту последовательную шину на ведомую плату. Я не получаю никакого ответа и использую логический анализатор, я подтвердил, что ведомое устройство получает его на правильном выводе, и нет никаких изменений на входе передачи ведомого устройства. Что еще нужно сделать, чтобы запустить загрузчик?

Вот мой соответствующий код:

DigitalOut extBoot0(D7);
DigitalOut extBoot1(D6);
DigitalOut extReset(D5);

Serial usart(/* tx, rx */ D1, D0);


uint8_t rxBuffer[1];
event_callback_t serialEventCb;

void serialCb(int events) {
    printf("something happened!\n");
}

void initBootloader() {
    wait(5); // just in case?
    // Once initialized the USART1 configuration is: 8-bits, even parity and 1 Stop bit
    serialEventCb.attach(serialCb);
    usart.format(8, SerialBase::Even, 1);
    uint8_t buffer[1024];

    // write 0x7F
    buffer[0] = 0x7F;
    usart.write(buffer, 1, 0, 0);
    printf("sending cmd\n");
    // should ack 0x79
    usart.read(rxBuffer, 1, serialEventCb, SERIAL_EVENT_RX_ALL, 0x79);
}

Если это вообще поможет, вот изображение моей настройки платы .

1 Ответ

0 голосов
/ 03 июня 2019

Я полагал, что решил эту проблему, используя USART1 вместо USART2.В документации говорится, что можно использовать и USART1, и USART2, но я получаю только 0x79 от USART1.

Кроме того, мне пришлось переключиться с Serial на UARTSerial.Сначала ведомое устройство отправляет неверный пакет 0xC0 с неверным битом четности.Не совсем уверен, почему он это делает, но это заставляет обычный экземпляр Serial не обрабатывать исходящий байт.

...