pub

Dependencies:   CANnucleo mbed-dev

Fork of CANnucleo_Hello by Zoltan Hudak

Revision:
30:9ae558ec888c
Parent:
29:dde6c4aef759
--- a/main.cpp	Sat Mar 11 10:14:45 2017 +0000
+++ b/main.cpp	Tue Mar 14 14:38:37 2017 +0000
@@ -20,7 +20,7 @@
  */ 
 
 #define BOARD1                1     // comment out this line when compiling for board #2
-#define TARGET_STM32F103C8T6  1     // uncomment this line when using STM32F103C8T6 boards!                                    
+//#define TARGET_STM32F103C8T6  1     // uncomment this line when using STM32F103C8T6 boards!                                    
 
 #if defined(TARGET_STM32F103C8T6)
     #include "stm32f103c8t6.h"
@@ -50,13 +50,13 @@
 CANMessage      txMsg;
 DigitalOut      led(LED_PIN);
 Timer           timer;
-uint8_t         counter = 0;
+uint8_t         counter = 0;    // one byte
 AnalogIn        analogIn(A0);
-float           voltage;
+float           voltage;        // four bytes
 volatile bool   msgAvailable = false;
 
 /**
- * @brief   'CAN receive-complete' interrup handler.
+ * @brief   'CAN receive-complete' interrup service routine.
  * @note    Called on arrival of new CAN message.
  *          Keep it as short as possible.
  * @param   
@@ -67,7 +67,7 @@
 }
 
 /**
- * @brief   Prints CAN msg to PC's serial terminal
+ * @brief   Prints CAN msg to PC's serial terminal.
  * @note}
  * @param   CANMessage to print
  * @retval  none
@@ -91,17 +91,17 @@
  */
 int main() {
 #if defined(TARGET_STM32F103C8T6)
-    confSysClock();     //Configure system clock (72MHz HSE clock, 48MHz USB clock)
+    confSysClock();     //Configure the system clock (72MHz HSE clock, 48MHz USB clock)
 #endif
-    pc.baud(9600);                      // set Serial speed
+    pc.baud(9600);                      // set the Serial speed
 
     can = new CAN(PA_11, PA_12);        // CAN Rx pin name, CAN Tx pin name
-    can->frequency(1000000);            // set bit rate to 1Mbps
-    can->attach(&onMsgReceived);        // attach 'CAN receive-complete' interrupt handler
+    can->frequency(1000000);            // set the bit rate to 1Mbps
+    can->attach(&onMsgReceived);        // attach the 'CAN receive-complete' interrupt service routine (ISR)
     
 #if defined(BOARD1)
-    led = ON;       // turn LED on
-    timer.start();  // start timer
+    led = ON;       // turn the LED on
+    timer.start();  // start the timer
     pc.printf("CANnucleo_Hello board #1\r\n");
 #else
     led = OFF;      // turn LED off
@@ -110,15 +110,22 @@
 
     while(1) {
         if(timer.read_ms() >= 1000) {           // check for timeout
-            timer.stop();                       // stop timer
-            timer.reset();                      // reset timer
-            counter++;                          // increment counter
+            timer.stop();                       // stop the timer
+            timer.reset();                      // reset the timer
+            counter++;                          // increment the counter
             voltage = (analogIn * 3.3f)/4096.0f;// read the small drifting voltage from analog input
-            txMsg.clear();                      // clear Tx message storage
-            txMsg.id = TX_ID;                   // set ID
+            txMsg.clear();                      // clear the Tx message storage
+            txMsg.id = TX_ID;                   // set the message ID
+            // We are about to transmit two data items to the CAN bus.
+            //     counter: uint_8 (unsigned eight bits int) value (one byte).
+            //     voltage: floating point value (four bytes).
+            // So the total length of payload data is five bytes.
+            // We'll use the "<<" (append) operator to add data to the CAN message.
+            // The usage is same as of the similar C++ io-stream operators.
+            // NOTE: The data length of CAN message is automatically updated when using "<<" operators.  
             txMsg << counter << voltage;        // append data (total data length must be <= 8 bytes!)
-            if(can->write(txMsg)) {             // transmit message
-                led = OFF;                      // turn LED off
+            if(can->write(txMsg)) {             // transmit the CAN message
+                led = OFF;                      // turn the LED off
                 pc.printf("-------------------------------------\r\n");
                 pc.printf("CAN message sent\r\n");
                 printMsg(txMsg);
@@ -129,18 +136,18 @@
                 pc.printf("Transmission error\r\n");
         }
         if(msgAvailable) {
-            msgAvailable = false;               // reset the flag for next use the in interrupt service routine
-            can->read(rxMsg);                   // read message into Rx message storage
-            led = ON;                           // turn LED on
+            msgAvailable = false;               // reset the flag for next use in the interrupt service routine
+            can->read(rxMsg);                   // read the message into the Rx message storage
+            led = ON;                           // turn the LED on
             pc.printf("-------------------------------------\r\n");
             pc.printf("CAN message received\r\n");
             printMsg(rxMsg);
             // Filtering performed by software:           
-            if(rxMsg.id == RX_ID) {             // about filtering performed by hardware see comments in CANnucleo.cpp 
-                rxMsg >> counter >> voltage;    // extract data from the received CAN message
+            if(rxMsg.id == RX_ID) {             // about filtering performed by hardware see the comments in CANnucleo.cpp 
+                rxMsg >> counter >> voltage;    // extract data from the received CAN message (in same sequence as they were added)
                 pc.printf("  counter = %d\r\n", counter);
                 pc.printf("  voltage = %e V\r\n", voltage);
-                timer.start();                  // transmission lag
+                timer.start();                  // insert transmission lag
             }
         }
     }