Я пытаюсь получить доступ к загрузчику «ведомой» платы 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);
}
Если это вообще поможет, вот изображение моей настройки платы.