DA14585 Booting from UART

Learn MoreFAQsTutorials

2 posts / 0 new
Last post
liyehuan
Offline
Last seen:1 year 4 months ago
加入:2018-11-12 08:27
DA14585 Booting from UART

Hi Dialog,

I want to booting from UART to my DA14585 device. However, i only found doc about DA14580/581/583 Booting from serial interfaces.

Do you have any specific document for DA14585 booting sequence?

Thanks!

Best Regards!

Lionel

Device:
CYibin
Offline
Last seen:4 months 1 week ago
工作人员
加入:2017-12-14 02:48
Hi liyehuan,

Hi liyehuan,

The booting sequence of 585 is the same as 580's, so the doc is also suitable for 585.

For better reference, you can find the code on how 585 receive booting datas from UART in secondary_bootoader project (DA14585_SDK_6.0.10.511_0\DA14585_SDK\6.0.10.511\utilities\secondary_bootloader).

Below is the related code:

/** **************************************************************************************** * @brief download firmware from UART interface **************************************************************************************** */ int FwDownload(void) { int fw_size; int i; char *code; char crc_code; char recv_byte; uart_send_byte(STX); // send start TX char if (0 == uart_receive_byte(&recv_byte)) return -1; // receive SOH if (recv_byte != SOH) return -2; if (0 == uart_receive_byte(&recv_byte)) return -3; // receive FW length LSB fw_size = recv_byte; if (0 == uart_receive_byte(&recv_byte)) return -4; // receive FW length MSB fw_size += (recv_byte << 8); // Support the extended length protocol if (fw_size == 0) { if (0 == uart_receive_byte(&recv_byte)) return -3; // receive FW length LSB fw_size = recv_byte; if (0 == uart_receive_byte(&recv_byte)) return -4; // receive FW length MiddleSB fw_size += (recv_byte << 8); if (0 == uart_receive_byte(&recv_byte)) return -9; // receive FW length MSB fw_size += (recv_byte << 16); } if ((fw_size == 0) || fw_size > MAX_CODE_LENGTH) // check if the program fits into memory { uart_send_byte(NAK); // if it does not fit send ACK return -5; } else { uart_send_byte(ACK); // if it fits send ACK } crc_code = 0; code = (char*) (SYSRAM_COPY_BASE_ADDRESS); // set pointer to SYSRAM for (i = 0; i < fw_size; i++) // copy code from UART to RAM { if (0 == uart_receive_byte(&recv_byte)) return -6; // receive code byte crc_code ^= recv_byte; // update CRC *code = recv_byte; // write to RAM code++; // increase RAM pointer } uart_send_byte(crc_code); // send CRC byte if (0 == uart_receive_byte(&recv_byte)) return -7; // receive ACK if (recv_byte != ACK) return -8; return fw_size; }