Доступ к загрузчику STM32L4 через USART: Нет ACK

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

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

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

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

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

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);
}

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


person Community    schedule 02.06.2019    source источник
comment
Вы можете подключить логический анализатор, чтобы увидеть, что происходит на линиях? если нет - это может быть решение sysprogs.com/analyzer2go/boards/STM32L476RG-Nucleo   -  person Shahar Hadas    schedule 02.06.2019
comment
На каких линиях? На логическом анализаторе я наблюдал, что от мастера к слейву передается 0x7F, а в ответ ничего нет.   -  person    schedule 02.06.2019
comment
все линии - вы видите, что RX постоянно низкий или высокий? с ПК с адаптером USB-UART (TTL) вы можете инициировать загрузчик?   -  person Shahar Hadas    schedule 02.06.2019
comment
Оба ведомых RX/TX имеют высокий уровень, за исключением случаев, когда RX получает 0x7F. Только что попробовал с последовательным портом USB, и он тоже не отвечает. Вот скриншот логического анализатора, порядок TX, RX   -  person    schedule 03.06.2019


Ответы (1)


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

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

person Community    schedule 03.06.2019
comment
Прохладно. Только сейчас я заметил, что вы упомянули USART2 в исходном сообщении. - person Shahar Hadas; 03.06.2019