Test CAN bus on Stm32F746nG
Dependencies: F746_GUI mbed CANMsg
Diff: main.cpp
- Revision:
- 0:77e62347e7c9
- Child:
- 1:68083f9dd39d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Aug 06 14:21:20 2020 +0000 @@ -0,0 +1,539 @@ +/* +programme test sur carte stm32F746ng-discovery + +update 30/07/2019 : display datas on lcd ok +update 29/07/2020 : send can ok ( after received), receive can ok +update 29/07/2020 : remove touch screen +update 28/07/2020 : add serial and CAN +update 21/07/2020 : test buttons +update 20/07/2020 : display buttons +update 17/07/2020 GC : change colors +*/ + +#include "mbed.h" +#include "stm32746g_discovery_lcd.h" +#include "stm32746g_discovery_ts.h" +#include <string> +#include "CANMsg.h" +#include <stdio.h> +#include <errno.h> + +// serial port sur connecteur arduino (D0,D1)-------------------- +Serial serial2(PC_6, PC_7); // TX, RX for udp bridge +Serial pc(USBTX, USBRX); // serial on usb connector +// CAN ------------------------------------------------------------ +CAN can(PB_8, PB_9); // CAN Rx pin name, CAN Tx pin name +CANMsg rxMsg; +CANMsg txMsg; + +uint8_t counter = 0; +float voltage; +Timer timer; +volatile bool msgAvailable = false; +AnalogIn analogIn(A0); +CircularBuffer<char, 1024> rxbuf; // PC receiving Buffer +uint8_t text2[30]; + char s2; + char buffer[128]; +#define LED_PIN PC_13 +DigitalOut led(LED_PIN); + +//#define TARGET_STM32F103C8T6 1 // uncomment this line to use STM32F103C8T6 boards +#define BOARD1 1 // comment out this line when compiling for board #2 +#if defined(BOARD1) + const unsigned int RX_ID = 0x100; + const unsigned int TX_ID = 0x101; +#else + const unsigned int RX_ID = 0x101; + const unsigned int TX_ID = 0x100; +#endif + +/** + * @brief Prints CAN message to PC's serial terminal + * @param CANMessage to print + */ +void printMsg(CANMessage& msg, int dir) +{ if (dir ==0) + { BSP_LCD_DisplayStringAt(0, LINE(6), (uint8_t *)"Message sent ", LEFT_MODE); + } + else + { BSP_LCD_DisplayStringAt(0, LINE(6), (uint8_t *)"Message received", LEFT_MODE); + } + pc.printf(" ID = 0x%.3x\r\n", msg.id); + pc.printf(" Type = %d\r\n", msg.type); + pc.printf(" Format = %d\r\n", msg.format); + pc.printf(" Length = %d\r\n", msg.len); + pc.printf(" Data ="); + for(int i = 0; i < msg.len; i++) + pc.printf(" 0x%.2X", msg.data[i]); + pc.printf("\r\n"); + + sprintf((char*)text2, "ID: %d", msg.id); + BSP_LCD_DisplayStringAt(2, LINE(7), (uint8_t *)&text2, LEFT_MODE); + sprintf((char*)text2, "Type: %d", msg.type); + BSP_LCD_DisplayStringAt(2, LINE(8), (uint8_t *)&text2, LEFT_MODE); + sprintf((char*)text2, "Format: %d", msg.format); + BSP_LCD_DisplayStringAt(2, LINE(9), (uint8_t *)&text2, LEFT_MODE); + sprintf((char*)text2, "Length: %d", msg.len); + BSP_LCD_DisplayStringAt(2, LINE(10), (uint8_t *)&text2, LEFT_MODE); + sprintf((char*)text2, "Data: %d", msg.data[0]); + BSP_LCD_DisplayStringAt(2, LINE(11), (uint8_t *)&text2, LEFT_MODE); +} + +/** + * @brief Handles received CAN messages + * @note Called on 'CAN message received' interrupt. + */ +void onCanReceived(void) +{ can.read(rxMsg); + pc.printf("-------------------------------------\r\n"); + pc.printf("CAN message received\r\n"); + serial2.printf("CAN message received\r\n"); + BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"Can msg rec", CENTER_MODE); + //BSP_LCD_DisplayStringAt(0, LINE(3), (uint8_t *)"-----------", CENTER_MODE); + printMsg(rxMsg,1); + //serial2.printf("%d\n",rxMsg); + //serial2.printf("ID: "); + serial2.printf("ID: 0x%.3x ", rxMsg.id); + serial2.printf("D: "); + for(int i = 0; i < rxMsg.len; i++) + serial2.printf(" 0x%.2X", rxMsg.data[i]); + serial2.printf("\r\n"); + if (rxMsg.id == RX_ID) { + // extract data from the received CAN message + // in the same order as it was added on the transmitter side + rxMsg >> counter; + rxMsg >> voltage; + pc.printf(" counter = %d\r\n", counter); + pc.printf(" voltage = %e V\r\n", voltage); + } + timer.start(); // to transmit next message in main +} + + // ------------------------------------------------------------------------------------------------------ +int main() +{ TS_StateTypeDef TS_State; + uint16_t x, y; + uint8_t text[30]; + uint8_t status; + uint8_t idx; + uint8_t cleared = 0; + uint8_t menu_level = 0; + uint8_t prev_nb_touches = 0; + uint8_t touche_appuyee = 99; + string touche_appuyee_s = "%"; + string text_display1 ("Memorisation Touches "); + char buffer_touche[50]; + // set serial speed + pc.baud(57600); + serial2.baud(57600); + // config can -------------------------------------- + //jpa can = new CAN(PB_8, PB_9); // CAN Rx pin name, CAN Tx pin name + can.frequency(125000); // set CAN bit rate to 125 kbps + //can.filter(RX_ID, 0xFFF, CANStandard, 0); // set filter #0 to accept only standard messages with ID == RX_ID + can.attach(onCanReceived); // attach ISR to handle received messages + //can->attach(&onMsgReceived); //msgAvailable = true; // attach the 'CAN receive-complete' interrupt service routine (ISR) +#if defined(BOARD1) + timer.start(); // start timer + pc.printf("CAN_Hello board #1\r\n"); +#else + pc.printf("CAN_Hello board #2\r\n"); +#endif + pc.printf("\nStart Prog\n"); + serial2.printf("\nStart Prog\n"); + BSP_LCD_Init(); + BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER, LCD_FB_START_ADDRESS); + BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER); + //BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN DEMO", CENTER_MODE); + //HAL_Delay(1000); + status = BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize()); + if (status != TS_OK) { + BSP_LCD_Clear(LCD_COLOR_RED); + BSP_LCD_SetBackColor(LCD_COLOR_RED); + BSP_LCD_SetTextColor(LCD_COLOR_WHITE); + BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT FAIL", CENTER_MODE); + } else { + BSP_LCD_Clear(LCD_COLOR_BLUE); + BSP_LCD_SetBackColor(LCD_COLOR_BLUE); + BSP_LCD_SetTextColor(LCD_COLOR_WHITE); + BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"TOUCHSCREEN INIT OK", CENTER_MODE); + } + pc.printf("\nInit Display\n"); + HAL_Delay(1000); + BSP_LCD_Clear(LCD_COLOR_BLUE); + BSP_LCD_SetBackColor(LCD_COLOR_BLUE); + BSP_LCD_SetTextColor(LCD_COLOR_WHITE); + BSP_LCD_DisplayStringAt(0, LINE(2), (uint8_t *)"STM32F746 Disco Appli", CENTER_MODE); + BSP_LCD_SetTextColor(LCD_COLOR_RED); + BSP_LCD_DrawRect(10, 100, 200, 50); + BSP_LCD_DrawRect(10, 180, 200, 50); + BSP_LCD_SetTextColor(LCD_COLOR_YELLOW); + BSP_LCD_DisplayStringAt(25, LINE(5), (uint8_t *)"Setup", LEFT_MODE); + BSP_LCD_DisplayStringAt(25, 200, (uint8_t *)"Run", LEFT_MODE); + BSP_LCD_SetFont(&Font12); + + BSP_LCD_Clear(LCD_COLOR_BLUE); + BSP_LCD_SetBackColor(LCD_COLOR_BLUE); + BSP_LCD_SetTextColor(LCD_COLOR_WHITE); + BSP_LCD_SetFont(&Font16); + BSP_LCD_DisplayStringAt(0, LINE(2), (uint8_t *)"Mode Run", CENTER_MODE); + + + //HAL_Delay(1000); + BSP_LCD_SetFont(&Font12); + BSP_LCD_SetBackColor(LCD_COLOR_BLUE); + BSP_LCD_SetTextColor(LCD_COLOR_WHITE); + + while(1) //menu_level == 1) + { // timer send can + if(timer.read_ms() >= 1000) // check for timeout + { 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 the Tx message storage + //txMsg.id = TX_ID; // set ID + txMsg.id = 0x18881001;//TX_ID; // set the message ID + txMsg.format = CANExtended ; //extended + // 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 + { //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,0); + pc.printf(" counter = %d\r\n", counter); + pc.printf(" voltage = %e V\r\n", voltage); + BSP_LCD_DisplayStringAt(0, LINE(3), (uint8_t *)"TX CAN OK", CENTER_MODE); + BSP_LCD_DisplayStringAt(0, LINE(4), (uint8_t *)"--------", CENTER_MODE); + } + else + { pc.printf("Transmission error\r\n"); + BSP_LCD_DisplayStringAt(0, LINE(4), (uint8_t *)"TX CAN Fail", CENTER_MODE); + BSP_LCD_DisplayStringAt(0, LINE(3), (uint8_t *)"-----------", CENTER_MODE); + } + //timer.start(); // insert transmission lag + } // end if timer + // read serial port + // get serial 2 + //serial2.gets(buffer, 4); + //pc.printf("I got '%s'\n", buffer); + char c = pc.getc(); + + if((c == 's') ) + { // send trame CAN + if(can.write(txMsg)) // transmit message + { //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,0); + pc.printf(" counter = %d\r\n", counter); + pc.printf(" voltage = %e V\r\n", voltage); + BSP_LCD_DisplayStringAt(0, LINE(3), (uint8_t *)"TX CAN OK", CENTER_MODE); + BSP_LCD_DisplayStringAt(0, LINE(4), (uint8_t *)"--------", CENTER_MODE); + } + else + { pc.printf("Transmission error\r\n"); + BSP_LCD_DisplayStringAt(0, LINE(4), (uint8_t *)"TX CAN Fail", CENTER_MODE); + BSP_LCD_DisplayStringAt(0, LINE(3), (uint8_t *)"-----------", CENTER_MODE); + } + } + + char ser2 = serial2.getc(); + if( (ser2 = 's') ) + { // send trame CAN + if(can.write(txMsg)) // transmit message + { //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,0); + pc.printf(" counter = %d\r\n", counter); + pc.printf(" voltage = %e V\r\n", voltage); + BSP_LCD_DisplayStringAt(0, LINE(3), (uint8_t *)"TX CAN OK", CENTER_MODE); + BSP_LCD_DisplayStringAt(0, LINE(4), (uint8_t *)"--------", CENTER_MODE); + } + else + { pc.printf("Transmission error\r\n"); + BSP_LCD_DisplayStringAt(0, LINE(4), (uint8_t *)"TX CAN Fail", CENTER_MODE); + BSP_LCD_DisplayStringAt(0, LINE(3), (uint8_t *)"-----------", CENTER_MODE); + } + } + + // gestion touches appuyees + BSP_TS_GetState(&TS_State); + if (TS_State.touchDetected) { + // Clear lines corresponding to old touches coordinates + if (TS_State.touchDetected < prev_nb_touches) { + for (idx = (TS_State.touchDetected + 1); idx <= 5; idx++) { + BSP_LCD_ClearStringLine(idx); + } + } + prev_nb_touches = TS_State.touchDetected; + cleared = 0; + sprintf((char*)text, "Touches: %d", TS_State.touchDetected); + BSP_LCD_DisplayStringAt(2, LINE(1), (uint8_t *)&text, LEFT_MODE); + + for (idx = 0; idx < TS_State.touchDetected; idx++) { + x = TS_State.touchX[idx]; + y = TS_State.touchY[idx]; + sprintf((char*)text, "Touch %d: x=%d y=%d ", idx+1, x, y); + BSP_LCD_DisplayStringAt(2, LINE(idx+1), (uint8_t *)&text, LEFT_MODE); + } + BSP_LCD_DrawPixel(TS_State.touchX[0], TS_State.touchY[0], LCD_COLOR_ORANGE); + + // rajouter test touche appuyée + if ((y>100)& (y<150)) + { // touches 0 a 5 appuyées + if ((x>10)&(x<60)) + { // touche 0 appuyée) + sprintf((char*)text, "Touche 0 appuyée"); + BSP_LCD_DisplayStringAt(2, LINE(idx+1), (uint8_t *)&text, LEFT_MODE); + touche_appuyee = 0;touche_appuyee_s = "0"; + } + if ((x>90)&(x<130)) + { // touche 1 appuyée) + sprintf((char*)text, "Touche 1 appuyée"); + BSP_LCD_DisplayStringAt(2, LINE(idx+1), (uint8_t *)&text, LEFT_MODE); + touche_appuyee = 1;touche_appuyee_s = "1"; + } + if ((x>180)&(x<230)) + { // touche 2 appuyée) + sprintf((char*)text, "Touche 2 appuyée"); + BSP_LCD_DisplayStringAt(2, LINE(idx+1), (uint8_t *)&text, LEFT_MODE); + touche_appuyee = 2;touche_appuyee_s = "2"; + } + if ((x>260)&(x<310)) + { // touche 3 appuyée) + sprintf((char*)text, "Touche 3 appuyée"); + BSP_LCD_DisplayStringAt(2, LINE(idx+1), (uint8_t *)&text, LEFT_MODE); + touche_appuyee = 3;touche_appuyee_s = "3"; + } + if ((x>340)&(x<390)) + { // touche 4 appuyée) + sprintf((char*)text, "Touche 4 appuyée"); + BSP_LCD_DisplayStringAt(2, LINE(idx+1), (uint8_t *)&text, LEFT_MODE); + touche_appuyee = 4;touche_appuyee_s = "4"; + } + if ((x>420)&(x<470)) + { // touche 5 appuyée) + sprintf((char*)text, "Touche 5 appuyée"); + BSP_LCD_DisplayStringAt(2, LINE(idx+1), (uint8_t *)&text, LEFT_MODE); + touche_appuyee = 5;touche_appuyee_s = "5"; + } + text_display1 = text_display1 + touche_appuyee_s; + sprintf(buffer_touche, "text_display1 %d", touche_appuyee); + BSP_LCD_DisplayStringAt(2, 3, (uint8_t *)&buffer_touche, LEFT_MODE); + } + + } else { + if (!cleared) + { //BSP_LCD_Clear(LCD_COLOR_BLUE); + // sprintf((char*)text, "Touches: 0"); + // BSP_LCD_DisplayStringAt(2, LINE(2), (uint8_t *)&text, LEFT_MODE); + cleared = 1; + } + } + } +} + +//int main() { +// pc.printf("Hello World!\n\r"); +// while(1) { +// pc.putc(pc.getc() + 1); // echo input back to terminal +// }// +//} +/* +int main() { + while(1) { + if(pc.readable()) { + device.putc(pc.getc()); + } + if(device.readable()) { + pc.putc(device.getc()); + } + } +} +*/ +/* +#include "mbed.h" + +Serial pc(USBTX, USBRX); // tx, rx +PwmOut led(LED1); + +float brightness = 0.0; + +int main() { + pc.printf("Press 'u' to turn LED1 brightness up, 'd' to turn it down\n"); + + while(1) { + char c = pc.getc(); + if((c == 'u') && (brightness < 0.5)) { + brightness += 0.01; + led = brightness; + } + if((c == 'd') && (brightness > 0.0)) { + brightness -= 0.01; + led = brightness; + } + + } +} +*/ +/* +#include "mbed.h" + +Serial pc(USBTX, USBRX); +Serial uart(p28, p27); + +DigitalOut pc_activity(LED1); +DigitalOut uart_activity(LED2); + +int main() { + while(1) { + if(pc.readable()) { + uart.putc(pc.getc()); + pc_activity = !pc_activity; + } + if(uart.readable()) { + pc.putc(uart.getc()); + uart_activity = !uart_activity; + } + } +} +*/ +/* +#include "mbed.h" + +DigitalOut myled(LED1); +Serial pc(USBTX, USBRX); + +int main() { + char c; + char buffer[128]; + + pc.gets(buffer, 4); + + pc.printf("I got '%s'\n", buffer); +} +*/ +/* +sd card filesystem +/* Example file of using SD/MMC Block device Library for MBED-OS + * Copyright 2017 Roy Krikke + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + +#include "mbed.h" +#include "FATFileSystem.h" +#include "SDBlockDeviceDISCOF746NG.h" +#include <stdio.h> +#include <errno.h> + +DigitalOut led (LED1); + +// Instantiate the Block Device for sd card on DISCO-F746NG +SDBlockDeviceDISCOF746NG bd; +FATFileSystem fs ("fs"); + +void +return_error (int ret_val) +{ if(ret_val) + printf ("Failure. %d\r\n", ret_val); + else + printf ("done.\r\n"); +} + +void +errno_error (void* ret_val) +{ if(ret_val == NULL) + printf (" Failure. %d \r\n", errno); + else + printf (" done.\r\n"); +} + +int +main () +{ + Serial pc (SERIAL_TX, SERIAL_RX); + pc.baud(115200); + printf("Start\n"); + + int error = 0; + printf("Welcome to the filesystem example.\r\n" + "Formatting a FAT, RAM-backed filesystem. "); + error = FATFileSystem::format(&bd); + return_error(error); + + printf("Mounting the filesystem on \"/fs\". "); + error = fs.mount(&bd); + return_error(error); + + printf("Opening a new file, numbers.txt."); + FILE* fd = fopen("/fs/numbers.txt", "w"); + errno_error(fd); + + for (int i = 0; i < 20; i++) { + printf("Writing decimal numbers to a file (%d/20)\r", i); + fprintf(fd, "%d\r\n", i); + } + printf("Writing decimal numbers to a file (20/20) done.\r\n"); + + printf("Closing file."); + fclose(fd); + printf(" done.\r\n"); + + printf("Re-opening file read-only."); + fd = fopen("/fs/numbers.txt", "r"); + errno_error(fd); + + printf("Dumping file to screen.\r\n"); + char buff[16] = { 0 }; + while(!feof (fd)) { + int size = fread(&buff[0], 1, 15, fd); + fwrite(&buff[0], 1, size, stdout); + } + printf("EOF.\r\n"); + + printf("Closing file."); + fclose(fd); + printf(" done.\r\n"); + + printf("Opening root directory."); + DIR* dir = opendir("/fs/"); + errno_error(fd); + + struct dirent* de; + printf("Printing all filenames:\r\n"); + while((de = readdir (dir)) != NULL) { + printf(" %s\r\n", &(de->d_name)[0]); + } + + printf("Closeing root directory. "); + error = closedir(dir); + return_error(error); + printf("Filesystem Demo complete.\r\n"); + + // Blink led with 2 Hz + while(true) { + led = !led; + wait (0.5); + } +} + */ \ No newline at end of file