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.
Dependencies: CANnucleo CANnucleo_Hello mbed
Fork of CANnucleo_Hello by
Diff: main.cpp
- Revision:
- 10:66da8731bdb6
- Parent:
- 7:2dce8ed51091
- Child:
- 11:07d927da1a94
diff -r 8352cfe17ab1 -r 66da8731bdb6 main.cpp
--- a/main.cpp Wed Dec 23 10:38:02 2015 +0000
+++ b/main.cpp Fri Mar 11 12:19:22 2016 +0000
@@ -7,14 +7,13 @@
* CAN transceivers are not part of NUCLEO boards, therefore must be added by you.
* Remember also that CAN bus (even a short one) must be terminated with 120 Ohm resitors at both ends.
*
- * For more details see the wiki page <https://developer.mbed.org/users/hudakz/code/CAN_Nucleo_Hello/>
+ * For more details see the wiki page <https://developer.mbed.org/users/hudakz/code/CANnucleo_Hello/>
*
- * NOTE: If you'd like to use the official NUCLEO-F103RB boards
- * comment out the line #define TARGET_STM32F103C8T6 1
+ * NOTE: If you'd like to use the official NUCLEO boards comment out line 25
*
* The same code is used for both NUCLEO boards, but:
* For board #1 compile the example without any change.
- * For board #2 comment out the line #define BOARD1 1 before compiling
+ * For board #2 comment out line 26 before compiling
*
* Once the binaries have been downloaded to the boards reset board #1.
*
@@ -23,31 +22,34 @@
#include "mbed.h"
#include "CAN.h"
-#define BOARD1 1 // comment out this line when compiling for board #2
+#define TARGET_STM32F103C8T6 1 // comment out this line when using official NUCLEO boards!
+#define BOARD1 1 // comment out this line when compiling for board #2
-#if defined(BOARD1)
- #define RX_ID 0x100
- #define TX_ID 0x101
+#if defined(TARGET_STM32F103C8T6)
+ #define LED_PIN PC_13
+ const int OFF = 1;
+ const int ON = 0;
#else
- #define RX_ID 0x101
- #define TX_ID 0x100
+ #define LED_PIN LED1
+ const int OFF = 0;
+ const int ON = 1;
#endif
-// See wiki page <https://developer.mbed.org/users/hudakz/code/CAN_Nucleo_Hello/>
-//#define TARGET_STM32F103C8T6 1 // comment out this line if you'd like to use the official NUCLEO-F103RB boards
-
-#if defined(TARGET_STM32F103C8T6)
- DigitalOut led(PC_13);
+#if defined(BOARD1)
+ const unsigned int RX_ID = 0x100;
+ const unsigned int TX_ID = 0x101;
#else
- DigitalOut led(LED1);
+ const unsigned int RX_ID = 0x101;
+ const unsigned int TX_ID = 0x100;
#endif
-int ledReceived;
-Timer timer;
-CAN can(PA_11, PA_12); // CAN Rx pin name, CAN Tx pin name, Automatic recovery from bus-off state enabled by default
-CANMessage rxMsg;
-CANMessage txMsg;
-int counter = 0;
+DigitalOut led(LED_PIN);
+int ledState;
+Timer timer;
+CAN can(PA_11, PA_12); // CAN Rx pin name, CAN Tx pin name
+CANMessage rxMsg;
+CANMessage txMsg;
+int counter = 0;
volatile bool msgAvailable = false;
/**
@@ -72,37 +74,27 @@
can.attach(&onMsgReceived, CAN::RxIrq); // attach 'CAN receive-complete' interrupt handler
#if defined(BOARD1)
- #if defined(TARGET_STM32F103C8T6)
- led = 0; // turn LED on
- #else
- led = 1; // turn LED on
- #endif
- timer.start();
+ led = ON; // turn LED on
+ timer.start(); // start timer
#else
- #if defined(TARGET_STM32F103C8T6)
- led = 1; // turn LED off
- #else
- led = 0; // turn LED off
- #endif
+ led = OFF; // turn LED off
#endif
while(1) {
if(timer.read() >= 1.0) { // check for timeout
timer.stop(); // stop timer
- timer.reset(); // reset timer (to avaoid repeated send)
+ timer.reset(); // reset timer
counter++; // increment counter
+ ledState = led.read(); // get led state
txMsg.clear(); // clear Tx message storage
txMsg.id = TX_ID; // set ID
- txMsg << counter; // append first data item (make sure that CAN message total data lenght <= 8 bytes!)
- txMsg << led.read(); // append second data item (make sure that CAN message total data lenght <= 8 bytes!)
- can.write(txMsg); // transmit message
- printf("CAN message sent\r\n");
-
- #if defined(TARGET_STM32F103C8T6)
- led = 1; // turn LED off
- #else
- led = 0; // turn LED off
- #endif
+ txMsg << counter; // append first data item
+ txMsg << ledState; // append second data item (total data lenght must be <= 8 bytes!)
+ led = OFF; // turn LED off
+ if(can.write(txMsg)) // transmit message
+ printf("CAN message sent\r\n");
+ else
+ printf("Transmission error\r\n");
}
if(msgAvailable) {
msgAvailable = false; // reset flag for next use
@@ -115,13 +107,14 @@
printf(" Data =");
for(int i = 0; i < rxMsg.len; i++)
printf(" %x", rxMsg.data[i]);
- printf("\r\n");
- if(rxMsg.id == RX_ID) { // if ID matches
+ printf("\r\n");
+ // Filtering performed by software:
+ if(rxMsg.id == RX_ID) { // See comments in CAN.cpp for filtering performed by hadware
rxMsg >> counter; // extract first data item
- rxMsg >> ledReceived; // extract second data item
- led = ledReceived; // set LED
+ rxMsg >> ledState; // extract second data item
printf("counter = %d\r\n", counter);
- timer.start();
+ led = ledState; // set LED
+ timer.start(); // transmission lag
}
}
}
