Closed cantonfoshan closed 10 months ago
what is the microcontroller board
also please provide
I have this same exact issue, using MacOS, with the itsy bitsy m4, using platformIO, this happens with every time I try to define the object Adafruit_FlashTransport_QSPI
and the error is
/Users/ricardo/.platformio/packages/toolchain-gccarmnoneeabi/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/bin/ld: .pio/build/adafruit_itsybitsy_m4/src/main.cpp.o: in function `_GLOBAL__sub_I_flashTransport':
main.cpp:(.text.startup._GLOBAL__sub_I_flashTransport+0x8): undefined reference to `Adafruit_FlashTransport_QSPI::Adafruit_FlashTransport_QSPI()'
collect2: error: ld returned 1 exit status
*** [.pio/build/adafruit_itsybitsy_m4/firmware.elf] Error 1
can you try to compile to see if it compile with Arduino IDE instead of PIO ?
Sure, but it's the same compiler and same code so it shouldn't make a difference.
weird, it compiles in Arduino IDE
we agree... but the CI test works great here https://github.com/adafruit/Adafruit_SPIFlash/actions so there is evidence that it works in arduino and not in PIO cc @ivankravets
@ricardo192 PIO parser may or may not pick up the same CFlags as Arduino, which does affect the compiling process. So you need to check if PIO parser does it job, and/or need to manual add config if needed.
Hi @ricardo192! It's strange, but I cannot reproduce the issue. Could you please provide a minimal but complete PlatformIO project to reproduce the issue?
teststuf copy.zip @valeros
@ricardo192 In a nutshell, PlatformIO supports many types of libraries, including Arduino ones. For some reason you decided to manually add the Adafruit SPIFlash
library to the lib
folder of your project instead of specifying it as dependency in your platformio.ini
. At the same time, you also changed the structure of the library (moved the source files from the src
folder to the root of the library). This change you made forced PlatformIO to handle the flash
library in your project as a generic library and hence omit special compilation logic required for the Arduino libraries.
To fix the problem you can either specify the library as a dependency, for example as a Git repository with a specific tag:
[env:adafruit_itsybitsy_m4]
platform = atmelsam
framework = arduino
board = adafruit_itsybitsy_m4
lib_deps =
https://github.com/adafruit/Adafruit_SPIFlash#3.11.0
or just move the library sources to the src
folder, e.g. lib/flash/src/Adafruit_SPIFlash.cpp
@valeros My bad! I have been doing this for a long while now (for at least like 20 Arduino libraries) and not have had a single issue with it until just now. also. I only just now got it to compile when I used the library manager. and doing it in the lib folder 'properly' still doesn't work for some reason. thanks for the help!
closed, this is caused by pio config rather than the library itself
when I try to run the example flash_info, the same error happens while linking
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/ststm32/genericSTM32H750VB.html
PLATFORM: ST STM32 (17.4.0) > STM32H750VBT6 (1024k RAM. 128k Flash)
HARDWARE: STM32H750VBT6 480MHz, 1MB RAM, 128KB Flash
DEBUG: Current (stlink) External (blackmagic, jlink, stlink)
PACKAGES:
- framework-arduinoststm32 @ 4.20701.0 (2.7.1)
- framework-cmsis @ 2.50900.0 (5.9.0)
- toolchain-gccarmnoneeabi @ 1.120301.0 (12.3.1)
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 15 compatible libraries
Scanning dependencies...
Dependency Graph
|-- Adafruit SPIFlash @ 4.3.4+sha.160b5ff
|-- SdFat - Adafruit Fork @ 2.2.3
|-- SPI @ 1.1.0
Building in release mode
Compiling .pio\build\genericSTM32H750VB\src\main.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\FatLib\FatName.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\FatLib\FatPartition.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\FatLib\FatVolume.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\FreeStack.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\FsLib\FsFile.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\FsLib\FsNew.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\FsLib\FsVolume.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\MinimumSerial.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SdCard\SdCardInfo.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SdCard\SdSpiCard.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SdCard\SdioTeensy.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SpiDriver\SdSpiArtemis.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SpiDriver\SdSpiChipSelect.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SpiDriver\SdSpiDue.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SpiDriver\SdSpiESP.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SpiDriver\SdSpiParticle.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SpiDriver\SdSpiSTM32.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SpiDriver\SdSpiSTM32Core.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SpiDriver\SdSpiTeensy3.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\common\FmtNumber.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\common\FsCache.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\common\FsDateTime.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\common\FsName.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\common\FsStructs.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\common\FsUtf.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\common\PrintBasic.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\common\upcase.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\iostream\StdioStream.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\iostream\StreamBaseClass.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\iostream\istream.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\iostream\ostream.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib40a\Adafruit SPIFlash\Adafruit_FlashCache.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib40a\Adafruit SPIFlash\Adafruit_SPIFlash.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib40a\Adafruit SPIFlash\Adafruit_SPIFlashBase.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib40a\Adafruit SPIFlash\esp32\Adafruit_FlashTransport_ESP32.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib40a\Adafruit SPIFlash\qspi\Adafruit_FlashTransport_QSPI_NRF.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib40a\Adafruit SPIFlash\qspi\Adafruit_FlashTransport_QSPI_SAMD.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib40a\Adafruit SPIFlash\rp2040\Adafruit_FlashTransport_RP2040.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib40a\Adafruit SPIFlash\spi\Adafruit_FlashTransport_SPI.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\HardwareSerial.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\IPAddress.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\Print.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\RingBuffer.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\Stream.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\Tone.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\USBSerial.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\VirtIOSerial.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\WInterrupts.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\WMath.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\WSerial.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\WString.cpp.o
Archiving .pio\build\genericSTM32H750VB\lib7c6\libSdFat - Adafruit Fork.a
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\abi.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\avr\dtostrf.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\board.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\core_debug.c.o
Archiving .pio\build\genericSTM32H750VB\lib40a\libAdafruit SPIFlash.a
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\hooks.c.o
Indexing .pio\build\genericSTM32H750VB\lib7c6\libSdFat - Adafruit Fork.a
Indexing .pio\build\genericSTM32H750VB\lib40a\libAdafruit SPIFlash.a
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\itoa.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\main.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\pins_arduino.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\device.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\generic\condition.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\generic\cortexm\sys.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\generic\generic_device.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\generic\generic_init.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\generic\generic_io.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\generic\generic_shmem.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\generic\time.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\init.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\io.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\log.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\shmem.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\mbox_ipcc.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\open-amp\remoteproc\remoteproc_virtio.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\open-amp\rpmsg\rpmsg.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\open-amp\rpmsg\rpmsg_virtio.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\openamp.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\rsc_table.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\virt_uart.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\virtio\virtio.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\virtio\virtqueue.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\virtio_buffer.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\virtio_log.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\startup_stm32yyxx.S.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\cdc\cdc_queue.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\cdc\usbd_cdc.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\cdc\usbd_cdc_if.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\hid\usbd_hid_composite.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\hid\usbd_hid_composite_if.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\usb_device_core.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\usb_device_ctlreq.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\usb_device_ioreq.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\usbd_conf.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\usbd_desc.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\usbd_ep_conf.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\usbd_if.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\wiring_analog.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\wiring_digital.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\wiring_pulse.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\wiring_shift.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\wiring_time.c.o
Archiving .pio\build\genericSTM32H750VB\libFrameworkArduino.a
Indexing .pio\build\genericSTM32H750VB\libFrameworkArduino.a
Linking .pio\build\genericSTM32H750VB\firmware.elf
c:/users/11405/.platformio/packages/toolchain-gccarmnoneeabi/bin/../lib/gcc/arm-none-eabi/12.3.1/../../../../arm-none-eabi/bin/ld.exe: warning: .pio/build/genericSTM32H750VB/firmware.elf has a LOAD segment with RWX permissions
c:/users/11405/.platformio/packages/toolchain-gccarmnoneeabi/bin/../lib/gcc/arm-none-eabi/12.3.1/../../../../arm-none-eabi/bin/ld.exe: .pio/build/genericSTM32H750VB/src/main.cpp.o: in function `_GLOBAL__sub_I_flashTransport':
main.cpp:(.text.startup._GLOBAL__sub_I_flashTransport+0x2): undefined reference to `Adafruit_FlashTransport_QSPI::Adafruit_FlashTransport_QSPI()'
collect2.exe: error: ld returned 1 exit status
*** [.pio\build\genericSTM32H750VB\firmware.elf] Error 1
======================================================= [FAILED] Took 18.32 seconds =======================================================
* The terminal process "C:\Users\11405\.platformio\penv\Scripts\platformio.exe 'run'" terminated with exit code: 1.
* Terminal will be reused by tasks, press any key to close it
here are the files I complie header file
#ifndef FLASH_CONFIG_H_
#define FLASH_CONFIG_H_
// Un-comment to run example with custom SPI and SS e.g with FRAM breakout
// #define CUSTOM_CS A5
// #define CUSTOM_SPI SPI
#if defined(CUSTOM_CS) && defined(CUSTOM_SPI)
Adafruit_FlashTransport_SPI flashTransport(CUSTOM_CS, CUSTOM_SPI);
#elif defined(ARDUINO_ARCH_ESP32)
// ESP32 use same flash device that store code for file system.
// SPIFlash will parse partition.cvs to detect FATFS partition to use
Adafruit_FlashTransport_ESP32 flashTransport;
#elif defined(ARDUINO_ARCH_RP2040)
// RP2040 use same flash device that store code for file system. Therefore we
// only need to specify start address and size (no need SPI or SS)
// By default (start=0, size=0), values that match file system setting in
// 'Tools->Flash Size' menu selection will be used.
Adafruit_FlashTransport_RP2040 flashTransport;
// To be compatible with CircuitPython partition scheme (start_address = 1 MB,
// size = total flash - 1 MB) use const value (CPY_START_ADDR, CPY_SIZE) or
// subclass Adafruit_FlashTransport_RP2040_CPY. Un-comment either of the
// following line:
// Adafruit_FlashTransport_RP2040
// flashTransport(Adafruit_FlashTransport_RP2040::CPY_START_ADDR,
// Adafruit_FlashTransport_RP2040::CPY_SIZE);
// Adafruit_FlashTransport_RP2040_CPY flashTransport;
#else
// On-board external flash (QSPI or SPI) macros should already
// defined in your board variant if supported
// - EXTERNAL_FLASH_USE_QSPI
// - EXTERNAL_FLASH_USE_CS/EXTERNAL_FLASH_USE_SPI
#define EXTERNAL_FLASH_USE_QSPI
#if defined(EXTERNAL_FLASH_USE_QSPI)
Adafruit_FlashTransport_QSPI flashTransport;
#elif defined(EXTERNAL_FLASH_USE_SPI)
Adafruit_FlashTransport_SPI flashTransport(EXTERNAL_FLASH_USE_CS,
EXTERNAL_FLASH_USE_SPI);
#elif defined(__AVR__) || defined(ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS)
// Circuit Playground Express built with Arduino SAMD instead of Adafruit SAMD
// core or AVR core Use stand SPI/SS for avr port. Note: For AVR, cache will be
// disable due to lack of memory.
Adafruit_FlashTransport_SPI flashTransport(SS, SPI);
#else
#error No (Q)SPI flash are defined for your board !
#endif
#endif
#endif
and source file
#include <Arduino.h>
#include <SPI.h>
#include <SdFat.h>
#include <Adafruit_SPIFlash.h>
// for flashTransport definition
#include "flash_config.h"
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println("Hello World! stm32duino is working!");
}
here is my pio config file
[platformio]
[env:genericSTM32H750VB]
platform = ststm32
board = genericSTM32H750VB
framework = arduino
debug_tool = stlink
upload_protocol = stlink
lib_deps =
https://github.com/adafruit/Adafruit_SPIFlash.git
@ricardo192 PIO parser may or may not pick up the same CFlags as Arduino, which does affect the compiling process. So you need to check if PIO parser does it job, and/or need to manual add config if needed. My apologies for the interruption. I am new to using PIO and was wondering what configuration I should add to make a manual call.
Operating System
MacOS
IDE version
1.8.13
Board
AdaFruit e-ink sd card
BSP version
2.13
SPIFlash Library version
1.5.1
Sketch as attached file if not stock example
Adafruit_FlashTransport_QSPI flashTransport; Adafruit_SPIFlash flash(&flashTransport); FatFileSystem fatfs;
What happened ?
it gives this error
undefined reference to `Adafruit_FlashTransport_QSPI::Adafruit_FlashTransport_QSPI()'
When the class is already there
public: Adafruit_FlashTransport_QSPI(int8_t pinSCK, int8_t pinCS, int8_t pinIO0, int8_t pinIO1, int8_t pinIO2, int8_t pinIO3); Adafruit_FlashTransport_QSPI(void);
virtual void begin(void); virtual void end(void);
virtual bool supportQuadMode(void) { return true; }
virtual void setClockSpeed(uint32_t write_hz, uint32_t read_hz);
virtual bool runCommand(uint8_t command); virtual bool readCommand(uint8_t command, uint8_t response, uint32_t len); virtual bool writeCommand(uint8_t command, uint8_t const data, uint32_t len);
virtual bool eraseCommand(uint8_t command, uint32_t address); virtual bool readMemory(uint32_t addr, uint8_t data, uint32_t len); virtual bool writeMemory(uint32_t addr, uint8_t const data, uint32_t len); };
How to reproduce ?
Try to compile this code
Adafruit_FlashTransport_QSPI flashTransport; Adafruit_SPIFlash flash(&flashTransport); FatFileSystem fatfs;
Debug Log as attached txt file
No response
Screenshots
No response