Приветствую всех. Имею проблему с 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); }
а как вы видите, что это именно МК "виснет"? - может просто GPS перестает принимать сигнал? - ведь в этом случае ваш код ничего выводить не будет
Начинает мигать светодиод как при загрузке скетча. А сам модуль живой. Втыкаю его в ардуино нано и всё сутками пашет без проблем. Я бы сюда видео выложил, но разрешенные форматы файлов не позволяют этого сделать.
В общем. Проблема оказалась в самой библиотеке от Adafruit. Накатил библиотеку TinyGPS++ и все заработало.