Stm32 blue pill + gps + ledcontrol.h зависает

Тема в разделе "Arduino & Shields", создана пользователем santer, 4 апр 2020.

  1. santer

    santer Нерд

    Приветствую всех.
    Имею проблему с stm32f103c8t6 blue pill и black pill. Две платы ведут себя идентично.
    Подключаю к плате GPS модуль на 3й серийный порт. Подключаю к 5 вольтовой логике дисплей на MAX7219 вывожу время на дисплей и спустя некоторое время, причем время всегда разное контроллер виснет.
    вот код.
    Код (C++):
    #include <Adafruit_GPS.h>

    // what's the name of the hardware serial port?
    #define GPSSerial Serial3

    // Connect to the GPS on the hardware port
    Adafruit_GPS GPS(&GPSSerial);
       
    // Set GPSECHO to 'false' to turn off echoing the GPS data to the Serial console
    // Set to 'true' if you want to debug and listen to the raw GPS sentences
    #define GPSECHO false

    uint32_t timer = millis();

    /////////////////////////
    #include "LedControl.h"
    // Инициализация дисплеев
    // LedControl lc=LedControl(DIN,CLK,LOAD,количество модулей);
    LedControl lc=LedControl(PB9,PB7,PB8,3); //Din, clk, load
    // MAX7219 конец
    ////////////////////////

    void setup()
    {
      //while (!Serial);  // uncomment to have the sketch wait until Serial is ready

      // connect at 115200 so we can read the GPS fast enough and echo without dropping chars
      // also spit it out
      Serial.begin(115200);
      Serial.println("Adafruit GPS library basic test!");
       
      // 9600 NMEA is the default baud rate for Adafruit MTK GPS's- some use 4800
      GPS.begin(9600);
      // uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude
      GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
      // uncomment this line to turn on only the "minimum recommended" data
      //GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);
      // For parsing data, we don't suggest using anything but either RMC only or RMC+GGA since
      // the parser doesn't care about other sentences at this time
      // Set the update rate
      GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update rate
      // For the parsing code to work nicely and have time to sort thru the data, and
      // print it out we don't suggest using anything higher than 1 Hz
       
      // Request updates on antenna status, comment out to keep quiet
      GPS.sendCommand(PGCMD_ANTENNA);

      delay(1000);

      // Ask for firmware version
      GPSSerial.println(PMTK_Q_RELEASE);

        lc.shutdown(0,false);
      lc.shutdown(1,false);
      lc.shutdown(2,false);
    //  lc.shutdown(3,false);
      /* Set the brightness to a medium values */
      lc.setIntensity(0,1);
      lc.setIntensity(1,1);
      lc.setIntensity(2,1);
    //  lc.setIntensity(3,1);
    /* and clear the display */
      lc.clearDisplay(0);
      lc.clearDisplay(1);
      lc.clearDisplay(2);
    //  lc.clearDisplay(4);  
    }

    void loop() // run over and over again
    {
      // read data from the GPS in the 'main loop'
      char c = GPS.read();
      // if you want to debug, this is a good time to do it!
      if (GPSECHO)
        if (c) Serial.print(c);
      // if a sentence is received, we can check the checksum, parse it...
      if (GPS.newNMEAreceived()) {
        // a tricky thing here is if we print the NMEA sentence, or data
        // we end up not listening and catching other sentences!
        // so be very wary if using OUTPUT_ALLDATA and trytng to print out data
        Serial.println(GPS.lastNMEA()); // this also sets the newNMEAreceived() flag to false
        if (!GPS.parse(GPS.lastNMEA())) // this also sets the newNMEAreceived() flag to false
          return; // we can fail to parse a sentence in which case we should just wait for another
      }
      // if millis() or timer wraps around, we'll just reset it
      if (timer > millis()) timer = millis();
       
      // approximately every 2 seconds or so, print out the current stats
      if (millis() - timer > 2000) {
        timer = millis(); // reset the timer
        Serial.print("\nTime: ");
        Serial.print(GPS.hour, DEC); Serial.print(':');
        Serial.print(GPS.minute, DEC); Serial.print(':');
        Serial.print(GPS.seconds, DEC); Serial.print('.');
        Serial.println(GPS.milliseconds);
        Serial.print("Date: ");
        Serial.print(GPS.day, DEC); Serial.print('/');
        Serial.print(GPS.month, DEC); Serial.print("/20");
        Serial.println(GPS.year, DEC);
        Serial.print("Fix: "); Serial.print((int)GPS.fix);
        Serial.print(" quality: "); Serial.println((int)GPS.fixquality);
        if (GPS.fix) {
          Serial.print("Location: ");
          Serial.print(GPS.latitude, 4); Serial.print(GPS.lat);
          Serial.print(", ");
          Serial.print(GPS.longitude, 4); Serial.println(GPS.lon);
          Serial.print("Speed (knots): "); Serial.println(GPS.speed);
          Serial.print("Angle: "); Serial.println(GPS.angle);
          Serial.print("Altitude: "); Serial.println(GPS.altitude);
          Serial.print("Satellites: "); Serial.println((int)GPS.satellites);
        }
      }

        print_time (GPS.hour+3, 0, 7);  //выводим на третью строку время, часы
        print_time (GPS.minute, 0, 4);  //выводим на третью строку время, часы
        print_time (GPS.seconds, 0, 1);  //выводим на третью строку время, часы
     
        print_time (GPS.hour+3, 1, 7);  //выводим на вторую строку время, часы
        print_time (GPS.minute, 1, 4);  //выводим на вторую строку время, часы
        print_time (GPS.seconds, 1, 1);  //выводим на вторую строку время, часы

        print_time (GPS.hour+3, 2, 7);  //выводим на первую строку время, часы
        print_time (GPS.minute, 2, 4);  //выводим на первую строку время, часы
        print_time (GPS.seconds, 2, 1);  //выводим на первую строку время, часы


    }

    void print_time(int v, byte x, byte y) // переменная V, строка х 0..2, символ 0..7
    {
      lc.setScanLimit(x, 7);
      byte ones, tens;
      ones = v % 10;
      v = v / 10;
      tens = v % 10;
      lc.setDigit(x, y, tens, false);
      lc.setDigit(x, y - 1, ones, true);
    }
     
  2. b707

    b707 Гуру

    а как вы видите, что это именно МК "виснет"? - может просто GPS перестает принимать сигнал? - ведь в этом случае ваш код ничего выводить не будет
     
  3. santer

    santer Нерд

    Начинает мигать светодиод как при загрузке скетча. А сам модуль живой. Втыкаю его в ардуино нано и всё сутками пашет без проблем.
    Я бы сюда видео выложил, но разрешенные форматы файлов не позволяют этого сделать.
     
    Последнее редактирование: 4 апр 2020
  4. santer

    santer Нерд

    В общем. Проблема оказалась в самой библиотеке от Adafruit. Накатил библиотеку TinyGPS++ и все заработало.