通过 USART 访问 STM32L4 引导加载程序:无 ACK
Accessing STM32L4 bootloader over USART: No ACK
我正在尝试访问 Nucleo L476RG "slave" 开发板的引导加载程序。
"master" 开发板是 Nucleo L496ZG 开发板。在我的程序中,我在主板上定义了一个名为extBoot0
、extReset
的DigitalOut
。这些连接到从板上的 boot0
和 NRST
引脚。此外,我在主机上有一个名为 usart
的 Serial
实例,它连接到从板上的 UART2。此外,似乎 BOOT1 已预设为 运行 引导加载程序,即它被断言为低电平并且无法更改为 运行 SRAM 中的任何内容。
目前,在 resetToBootloader
中,我将 BOOT0 设置为高电平并将 NRST 拉低 0.1 秒,然后将其恢复为高电平。我观察到 运行ning 这个功能确实会重置设备并阻止程序 运行ning.
在 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);
}
我相信我通过使用 USART1 而不是 USART2 解决了这个问题。文档说USART1和USART2都可以用,但是我只收到USART1的0x79。
此外,我不得不从 Serial
切换到 UARTSerial
。从设备首先发送一个不正确的数据包,0xC0 带有不正确的奇偶校验位。不太确定为什么这样做,但它会导致常规 Serial
实例无法处理后续字节。
我正在尝试访问 Nucleo L476RG "slave" 开发板的引导加载程序。
"master" 开发板是 Nucleo L496ZG 开发板。在我的程序中,我在主板上定义了一个名为extBoot0
、extReset
的DigitalOut
。这些连接到从板上的 boot0
和 NRST
引脚。此外,我在主机上有一个名为 usart
的 Serial
实例,它连接到从板上的 UART2。此外,似乎 BOOT1 已预设为 运行 引导加载程序,即它被断言为低电平并且无法更改为 运行 SRAM 中的任何内容。
目前,在 resetToBootloader
中,我将 BOOT0 设置为高电平并将 NRST 拉低 0.1 秒,然后将其恢复为高电平。我观察到 运行ning 这个功能确实会重置设备并阻止程序 运行ning.
在 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);
}
我相信我通过使用 USART1 而不是 USART2 解决了这个问题。文档说USART1和USART2都可以用,但是我只收到USART1的0x79。
此外,我不得不从 Serial
切换到 UARTSerial
。从设备首先发送一个不正确的数据包,0xC0 带有不正确的奇偶校验位。不太确定为什么这样做,但它会导致常规 Serial
实例无法处理后续字节。