Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- Revision:
- 3:93d0057b0690
- Parent:
- 1:7f19a1b1a9df
- Child:
- 4:5c5eff85eea1
diff -r 7f19a1b1a9df -r 93d0057b0690 main.cpp
--- a/main.cpp Tue Nov 24 12:49:45 2015 +0000
+++ b/main.cpp Tue Dec 22 12:34:39 2015 +0100
@@ -65,8 +65,8 @@
|----------------|---------------|-------------------------|
| Signal | Nucleo F401 | Mti-1s Dev board header |
|----------------|---------------|-------------------------|
- | SCL | PB8 | 11 |
- | SDA | PB9 | 9 |
+ | SCL | PB8 | 9 |
+ | SDA | PB9 | 11 |
| DRDY | PB3 | 15 |
| ADD0 | PB13 | 17 |
| ADD1 | PB14 | 19 |
@@ -140,6 +140,7 @@
#define BUS_MODE_I2C
//#define BUS_MODE_UART
+static void updateUartBaudrate();
/*! \brief Instance of MtInterface. Should be initialized by createMtInterface().
*/
@@ -155,6 +156,7 @@
*/
static DigitalInOut resetLine(MT_RESET, PIN_INPUT, OpenDrain, 1);
+
/*! \brief Instance of the firmware updater
*/
static FwUpdate *g_fwUpdate = NULL;
@@ -175,7 +177,7 @@
#endif
#ifdef BUS_MODE_UART
- mtInterface = new MtInterfaceUart;
+ mtInterface = new MtInterfaceUart(115200);
#endif
}
@@ -208,14 +210,17 @@
pc.printf("Firmware update ready\r\n");
else if (result == FWU_Failed)
pc.printf("Firmware update failed\r\n");
+
+ if (mtInterface->busFormat() == XBF_Uart)
+ updateUartBaudrate();
}
+
/*! \brief Sends a XMID_GotoConfig message to the Module
*/
static void gotoConfig()
{
- XbusMessage xbusMessage = {XMID_GotoConfig};
- xbusMessage.m_length = 0;
+ XbusMessage xbusMessage(XMID_GotoConfig);
mtInterface->sendXbusMessage(&xbusMessage);
}
@@ -320,8 +325,7 @@
if (stayInBootloader)
{
wait(0.02);
- XbusMessage xbusMessage = {XMID_GotoBootLoader};
- xbusMessage.m_length = 0;
+ XbusMessage xbusMessage(XMID_GotoBootLoader);
mtInterface->sendXbusMessage(&xbusMessage);
} else
{
@@ -329,6 +333,50 @@
}
}
+
+/*! \brief Try to find the correct uart baudrate
+*/
+static void updateUartBaudrate()
+{
+ if (mtInterface->busFormat() != XBF_Uart)
+ return;
+
+ pc.printf("Detecting uart baudrate of module\r\n");
+
+ const int nofBaudrates = 2;
+ int baudrates[nofBaudrates] = {921600, 115200};
+
+ bool success = false;
+ for (int n = 0; n < nofBaudrates; n++)
+ {
+ ((MtInterfaceUart*)mtInterface)->setBaudrate(baudrates[n]);
+ pc.printf("Baudrate set to %d\r\n", baudrates[n]);
+ XbusMessage gotoConfigMessage(XMID_GotoConfig);
+ XbusMessage* result = mtInterface->sendAndWait(&gotoConfigMessage);
+ success = result && result->m_mid == XMID_GotoConfigAck;
+ mtInterface->releaseXbusMessage(result);
+ if (success)
+ break;
+ }
+ if (success)
+ pc.printf("Detecting uart baudrate of module done\r\n");
+ else
+ pc.printf("Detecting uart baudrate of module failed\r\n");
+}
+
+bool isInBootloader()
+{
+ XbusMessage fwRevisionMessage(XMID_ReqFirmwareRevision);
+ XbusMessage* ack = mtInterface->sendAndWait(&fwRevisionMessage);
+
+ bool result = false;
+ if (ack && ack->m_mid == XMID_FirmwareRevision)
+ result = ack->m_data[0] == 255;
+
+ mtInterface->releaseXbusMessage(ack);
+ return result;
+}
+
/*! \brief C-wrapper for sendXbusMessage callback function of FwUpdate.
*/
static void sendXbusMessageWrapper(XbusMessage const* xbusMessage)
@@ -385,6 +433,10 @@
// Initialize the mtInterface object for communicating with the module:
createMtInterface();
+
+ // If Uart mode is used update the baudrate to match the baudrate of the module:
+ if (mtInterface->busFormat() == XBF_Uart)
+ updateUartBaudrate();
// Reset the module
hardwareReset(false);
@@ -407,11 +459,19 @@
mtInterface->process();
XbusMessage* xbusMessage = mtInterface->getXbusMessage();
+ bool updateUartBaudrateRequired = false;
if (xbusMessage != NULL)
{
handleXbusMessage(xbusMessage);
+ updateUartBaudrateRequired = (mtInterface->busFormat() == XBF_Uart && (xbusMessage->m_mid == XMID_ResetAck || xbusMessage->m_mid == XMID_GotoBootLoaderAck));
mtInterface->releaseXbusMessage(xbusMessage);
}
+
+ if (updateUartBaudrateRequired)
+ {
+ wait(0.2);
+ updateUartBaudrate();
+ }
if (pc.readable())
{
@@ -430,44 +490,46 @@
case 'm':
{
- XbusMessage xbusMessage = {XMID_GotoMeasurement};
- xbusMessage.m_length = 0;
+ XbusMessage xbusMessage(XMID_GotoMeasurement);
mtInterface->sendXbusMessage(&xbusMessage);
} break;
case 'r':
{
- XbusMessage xbusMessage = {XMID_Reset};
- xbusMessage.m_length = 0;
+ XbusMessage xbusMessage(XMID_Reset);
mtInterface->sendXbusMessage(&xbusMessage);
} break;
case 'b':
{
- XbusMessage xbusMessage = {XMID_GotoBootLoader};
- xbusMessage.m_length = 0;
+ XbusMessage xbusMessage(XMID_GotoBootLoader);
mtInterface->sendXbusMessage(&xbusMessage);
} break;
case 'v':
{
- XbusMessage xbusMessage = {XMID_ReqFirmwareRevision};
- xbusMessage.m_length = 0;
+ XbusMessage xbusMessage(XMID_ReqFirmwareRevision);
mtInterface->sendXbusMessage(&xbusMessage);
} break;
case 'd':
{
- XbusMessage xbusMessage = {XMID_ReqDid};
- xbusMessage.m_length = 0;
+ XbusMessage xbusMessage(XMID_ReqDid);
mtInterface->sendXbusMessage(&xbusMessage);
} break;
case 'u':
{
- pc.printf("Starting firmware update\r\n");
- FwUpdate_init(g_fwUpdate);
- FwUpdate_start(g_fwUpdate);
+ if (isInBootloader())
+ {
+ pc.printf("Starting firmware update\r\n");
+ FwUpdate_init(g_fwUpdate);
+ FwUpdate_start(g_fwUpdate);
+ }
+ else
+ {
+ pc.printf("Firmware update not possible now. First switch module to bootloader.\r\n");
+ }
} break;
case 'x':

