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
Revision 16:a86f339d1c25, committed 2016-07-31
- Comitter:
- hudakz
- Date:
- Sun Jul 31 21:36:52 2016 +0000
- Parent:
- 15:6449443e2207
- Child:
- 17:18d4d0ff26a6
- Commit message:
- Reverted to use CANnucleo library and mbed rev. 120
; Tested with NUCLEO-F103RB and STM32F103C8T6 boards.
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CANnucleo.lib Sun Jul 31 21:36:52 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/hudakz/code/CANnucleo/#d51e1617975f
--- a/main.cpp Fri Jul 29 10:24:45 2016 +0000
+++ b/main.cpp Sun Jul 31 21:36:52 2016 +0000
@@ -1,35 +1,32 @@
/*
- * An example of using CAN bus with NUCLEO boards:
+ * An example showing how to use the CANnucleo library:
*
- * Two affordable (less than $3 on ebay) STM32F103C8T6 boards compatible with the NUCLEO-F103RB platform
+ * Two affordable (less than $4 on ebay) STM32F103C8T6 boards (20kB SRAM, 64kB Flash),
+ * compatible with the NUCLEO-F103RB platform (20kB SRAM, 128kB Flash),
* are connected to the same CAN bus via transceivers (MCP2551 or TJA1040, or etc.).
* 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/CANnucleo_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 boards comment out line 24
+ * 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 line 25 before compiling
+ * For board #2 comment out line 26 before compiling
*
* Once the binaries have been downloaded to the boards reset board #1.
*
*/
-
-#include "mbed.h"
-
//#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(TARGET_STM32F103C8T6)
- #define LED_PIN PC_13
+#if defined(TARGET_STM32F103C8T6)
+ #include "stm32f103c8t6.h"
const int OFF = 1;
const int ON = 0;
#else
- #define LED_PIN LED1
const int OFF = 0;
const int ON = 1;
#endif
@@ -42,35 +39,71 @@
const unsigned int TX_ID = 0x100;
#endif
-DigitalOut led(LED_PIN);
+#include "mbed.h"
+#include "CANnucleo.h"
+
+DigitalOut led(LED1);
+int ledState;
Timer timer;
-CAN can(PA_11, PA_12); // CAN RD pin name, CAN TD pin name
+CAN can(PA_11, PA_12); // CAN Rx pin name, CAN Tx pin name
CANMessage rxMsg;
-char counter = 0;
+CANMessage txMsg;
+int counter = 0;
+volatile bool msgAvailable = false;
-int main() {
+/**
+ * @brief 'CAN receive-complete' interrup handler.
+ * @note Called on arrival of new CAN message.
+ * Keep it as short as possible.
+ * @param
+ * @retval
+ */
+void onMsgReceived() {
+ msgAvailable = true;
+}
+
+/**
+ * @brief Main
+ * @note
+ * @param
+ * @retval
+ */
+int main() {
+#if defined(TARGET_STM32F103C8T6)
+ confSysClock();
+#endif
+ can.frequency(1000000); // set bit rate to 1Mbps
+ can.attach(&onMsgReceived); // attach 'CAN receive-complete' interrupt handler
+
#if defined(BOARD1)
led = ON; // turn LED on
timer.start(); // start timer
+ printf("CANnucleo_Hello board #1\r\n");
#else
led = OFF; // turn LED off
+ printf("CANnucleo_Hello board #2\r\n");
#endif
- can.frequency(1000000); // set bit rate to 1Mbps
-
while(1) {
- if(timer.read_ms() >= 1000) { // check for timeout
- timer.stop(); // stop timer
- timer.reset(); // reset timer
- counter++; // increment counter
- led = OFF; // turn LED off
- if(can.write(CANMessage(TX_ID, &counter, 1))) // transmit message
- printf("CAN message sent\r\n\r\n");
+ if(timer.read() >= 1.0) { // check for timeout
+ timer.stop(); // stop timer
+ 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
+ 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\r\n");
+ printf("Transmission error\r\n");
}
- if(can.read(rxMsg)) { // check for new message
- printf("CAN message received:\r\n"); // print message details
+ if(msgAvailable) {
+ msgAvailable = false; // reset flag for next use
+ can.read(rxMsg); // read message into Rx message storage
+ printf("CAN message received:\r\n");
printf(" ID = 0x%.3x\r\n", rxMsg.id);
printf(" Type = %d\r\n", rxMsg.type);
printf(" Format = %d\r\n", rxMsg.format);
@@ -79,12 +112,13 @@
for(int i = 0; i < rxMsg.len; i++)
printf(" 0x%.2x", rxMsg.data[i]);
printf("\r\n");
-
- if(rxMsg.id == RX_ID) {
- counter = rxMsg.data[0]; // set counter
- printf("counter = %d\r\n\r\n", counter); // print counter
- led = ON; // turn LED on
- timer.start(); // transmission lag
+ // Filtering performed by software:
+ if(rxMsg.id == RX_ID) { // See comments in CAN.cpp for filtering performed by hardware
+ rxMsg >> counter; // extract first data item
+ rxMsg >> ledState; // extract second data item
+ printf(" counter = %d\r\n", counter);
+ led = ON; // turn LED on
+ timer.start(); // transmission lag
}
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-STM32F103C8T6.lib Sun Jul 31 21:36:52 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/hudakz/code/mbed-STM32F103C8T6/#306609fe9dc8
--- a/mbed.bld Fri Jul 29 10:24:45 2016 +0000 +++ b/mbed.bld Sun Jul 31 21:36:52 2016 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/f9eeca106725 \ No newline at end of file +http://mbed.org/users/mbed_official/code/mbed/builds/7c328cabac7e \ No newline at end of file
