pub
Dependencies: CANnucleo mbed-dev
Fork of CANnucleo_Hello by
Diff: main.cpp
- Revision:
- 30:9ae558ec888c
- Parent:
- 29:dde6c4aef759
diff -r dde6c4aef759 -r 9ae558ec888c main.cpp --- 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 } } }