STM32 Dev Board (MBED) - AnalogIn voltage errors

Im using PIO with target platform STM32L4R5ZIT6 and have been testing some of the example code from the mbed website, specifically an analog loop (https://os.mbed.com/teams/ST/code/Nucleo_analog_loop/)

I have tested the online mbed compiler with this example, and exported the code directly to the bootloader. The analog input reads the analog output with high accuracy

When I transfer this code to PIO and compile the analog input is not correct, as shown in this output:

(out:0.5000) - (in:0.4840) = (0.0160) OK
ā›[1A(out:0.6000) - (in:0.4842) = (0.1158) FAIL
(out:0.7000) - (in:0.4842) = (0.2158) FAIL
(out:0.8000) - (in:0.4842) = (0.3158) FAIL
(out:0.9000) - (in:0.4842) = (0.4158) FAIL
(out:1.0000) - (in:0.4842) = (0.5158) FAIL
(out:0.0000) - (in:0.4835) = (0.4835) FAIL
(out:0.1000) - (in:0.4840) = (0.3840) FAIL
(out:0.2000) - (in:0.4840) = (0.2840) FAIL
(out:0.3000) - (in:0.4840) = (0.1840) FAIL
(out:0.4000) - (in:0.4840) = (0.0840) FAIL

I have measured the analog output with a scope and a voltmeter to confirm that it is outputting the correct voltages - this is fine. The analog input does not seem to be configured correctly.
Even if the analog input is connected to GND the voltage is floating.

Here is my PIO config:

[env:nucleo_l4r5zi]
platform = https://github.com/platformio/platform-ststm32.git
board = nucleo_l4r5zi
framework = mbed
upload_protocol = mbed
board_build.mcu = stm32l4r5zit6

I have tried this with the standard platform as well, same error.

Here is the code:

    #include "mbed.h"

    AnalogIn in(A0);

    #if !DEVICE_ANALOGOUT
    #error You cannot use this example as the AnalogOut is not supported on this device.
    #else
    AnalogOut out(PA_4);
    #endif

    DigitalOut led(LED1);

    int main()
    {
        printf("\nAnalog loop example\n");
        printf("*** Connect A0 and PA_4 pins together ***\n");
        while(1) {
            for (float out_value = 0.0f; out_value < 1.1f; out_value += 0.1f) {
                // Output value using DAC
                out.write(out_value);
                wait(0.5);
                // Read ADC input
                float in_value = in.read();
                // Display difference between two values
                float diff = fabs(out_value - in_value);
                printf("(out:%.4f) - (in:%.4f) = (%.4f) ", out_value, in_value, diff);
                if (diff > 0.05f) {
                    printf("FAIL\n");
                } else {
                    printf("OK\n");
                    printf("\033[1A"); // Moves cursor up of 1 line
                }
                led = !led;
            }
        }
    }

And here is the compilation output log:

Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/ststm32/nucleo_l4r5zi.html
PLATFORM: ST STM32 > ST Nucleo L4R5ZI
HARDWARE: STM32L4R5ZIT6 120MHz 640KB RAM (2MB Flash)
DEBUG: CURRENT(stlink) ON-BOARD(stlink) EXTERNAL(blackmagic, jlink)
Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF MODES: FINDER(chain) COMPATIBILITY(soft)
Collected 8 compatible libraries
Scanning dependencies...
No dependencies
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/cmsis/TARGET_CORTEX_M/TOOLCHAIN_GCC/except.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/cmsis/TARGET_CORTEX_M/mbed_fault_handler.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/cmsis/TARGET_CORTEX_M/mbed_tz_context.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/AnalogIn.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/BusIn.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/BusInOut.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/BusOut.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/CAN.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/Ethernet.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/FlashIAP.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/I2C.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/I2CSlave.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/InterruptIn.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/InterruptManager.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/MbedCRC.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/QSPI.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/RawSerial.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/SPI.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/SPISlave.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/Serial.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/SerialBase.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/TableCRC.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/Ticker.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/Timeout.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/Timer.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/TimerEvent.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/drivers/UARTSerial.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/events/EventQueue.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/events/equeue/equeue.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/events/equeue/equeue_mbed.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/events/equeue/equeue_posix.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/events/mbed_shared_queues.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/hal/LowPowerTickerWrapper.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/hal/mbed_critical_section_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/hal/mbed_flash_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/hal/mbed_gpio.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/hal/mbed_itm_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/hal/mbed_lp_ticker_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/hal/mbed_lp_ticker_wrapper.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/hal/mbed_pinmap_common.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/hal/mbed_ticker_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/hal/mbed_us_ticker_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/hal/mpu/mbed_mpu_v7m.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/hal/mpu/mbed_mpu_v8m.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/ATCmdParser.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/CThunkBase.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/CallChain.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/FileBase.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/FileHandle.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/FilePath.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/FileSystemHandle.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/LocalFileSystem.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/Stream.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_alloc_wrappers.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_application.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_assert.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_board.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_critical.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_error.o
/Users/nic/.platformio/packages/framework-mbed/platform/mbed_board.c: In function 'mbed_error_vprintf':
/Users/nic/.platformio/packages/framework-mbed/platform/mbed_board.c:67:9: warning: implicit declaration of function 'memcpy'; did you mean 'fmemopen'? [-Wimplicit-function-declaration]
memcpy(&buffer[sizeof buffer - sizeof ellipsis], ellipsis, sizeof ellipsis);
^~~~~~
fmemopen
/Users/nic/.platformio/packages/framework-mbed/platform/mbed_board.c: In function 'mbed_error_puts':
/Users/nic/.platformio/packages/framework-mbed/platform/mbed_board.c:88:31: warning: implicit declaration of function 'strlen'; did you mean 'stdin'? [-Wimplicit-function-declaration]
write(STDERR_FILENO, str, strlen(str));
^~~~~~
stdin
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_error_hist.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_interface.o
/Users/nic/.platformio/packages/framework-mbed/platform/mbed_error.c:434:20: warning: 'name_or_unnamed' defined but not used [-Wunused-function]
static const char *name_or_unnamed(const char *name)
^~~~~~~~~~~~~~~
/Users/nic/.platformio/packages/framework-mbed/platform/mbed_error.c:70:21: warning: 'compute_crc32' defined but not used [-Wunused-function]
static unsigned int compute_crc32(const void *data, int datalen)
^~~~~~~~~~~~~
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_mem_trace.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_mktime.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_mpu_mgmt.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_poll.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_retarget.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_rtc_time.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_sdk_boot.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_semihost_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_sleep_manager.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_stats.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_wait_api_no_rtos.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/platform/mbed_wait_api_rtos.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L4R5xI/TARGET_NUCLEO_L4R5ZI/PeripheralPins.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L4R5xI/TARGET_NUCLEO_L4R5ZI/system_clock.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/TARGET_STM32L4R5xI/device/TOOLCHAIN_GCC_ARM/startup_stm32l4r5xx.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/analogin_device.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/analogout_device.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_adc.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_adc_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_can.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_can_legacy.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_comp.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_cortex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_crc.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_crc_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_cryp.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_cryp_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_dac.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_dac_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_dcmi.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_dfsdm.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_dfsdm_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_dma.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_dma2d.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_dma_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_dsi.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_firewall.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_flash.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_flash_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_flash_ramfunc.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_gfxmmu.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_gpio.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_hash.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_hash_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_hcd.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_i2c.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_i2c_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_irda.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_iwdg.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_lcd.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_lptim.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_ltdc.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_ltdc_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_nand.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_nor.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_opamp.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_opamp_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_ospi.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_pcd.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_pcd_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_pwr.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_pwr_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_qspi.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_rcc.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_rcc_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_rng.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_rtc.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_rtc_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_sai.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_sai_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_sd.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_sd_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_smartcard.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_smartcard_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_smbus.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_spi.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_spi_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_sram.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_swpmi.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_tim.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_tim_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_tsc.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_uart.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_uart_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_usart.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_usart_ex.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_hal_wwdg.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_adc.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_comp.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_crc.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_crs.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_dac.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_dma.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_dma2d.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_exti.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_fmc.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_gpio.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_i2c.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_lptim.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_lpuart.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_opamp.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_pwr.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_rcc.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_rng.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_rtc.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_sdmmc.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_spi.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_swpmi.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_tim.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_usart.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_usb.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/stm32l4xx_ll_utils.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/device/system_stm32l4xx.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/flash_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/gpio_irq_device.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/l4_retarget.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/pwmout_device.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/serial_device.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/TARGET_STM32L4/spi_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/analogin_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/analogout_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/can_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/gpio_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/gpio_irq_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/hal_tick_overrides.o
/Users/nic/.platformio/packages/framework-mbed/targets/TARGET_STM/can_api.c: In function 'can_frequency':
/Users/nic/.platformio/packages/framework-mbed/targets/TARGET_STM/can_api.c:746:38: warning: format '%x' expects argument of type 'unsigned int', but argument 2 has type 'long unsigned int' [-Wformat=]
error("can ESR  0x%04x.%04x + timeout status %d", (can->ESR & 0xFFFF0000) >> 16, (can->ESR & 0xFFFF), status);
~~~^                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%04lx
/Users/nic/.platformio/packages/framework-mbed/targets/TARGET_STM/can_api.c:746:43: warning: format '%x' expects argument of type 'unsigned int', but argument 3 has type 'long unsigned int' [-Wformat=]
error("can ESR  0x%04x.%04x + timeout status %d", (can->ESR & 0xFFFF0000) >> 16, (can->ESR & 0xFFFF), status);
~~~^                                                      ~~~~~~~~~~~~~~~~~~~
%04lx
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/i2c_api.o
/Users/nic/.platformio/packages/framework-mbed/targets/TARGET_STM/gpio_irq_api.c: In function 'handle_interrupt_in':
/Users/nic/.platformio/packages/framework-mbed/targets/TARGET_STM/gpio_irq_api.c:125:50: warning: format '%d' expects argument of type 'int', but argument 2 has type 'uint32_t {aka long unsigned int}' [-Wformat=]
error("Unexpected Spurious interrupt, index %d\r\n", irq_index);
~^
%ld
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/lp_ticker.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/mbed_crc_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/mbed_overrides.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/pinmap.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/port_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/pwmout_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/qspi_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/rtc_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/serial_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/sleep.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/stm_spi_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/trng_api.o
Compiling .pioenvs/nucleo_l4r5zi/FrameworkMbed/targets/TARGET_STM/us_ticker.o
Compiling .pioenvs/nucleo_l4r5zi/src/main.o
Generating LD script .pioenvs/nucleo_l4r5zi/stm32l4r5xx.ld.link_script.ld
Linking .pioenvs/nucleo_l4r5zi/firmware.elf
Building .pioenvs/nucleo_l4r5zi/firmware.bin
Checking size .pioenvs/nucleo_l4r5zi/firmware.elf
Memory Usage -> http://bit.ly/pio-memory-usage
DATA:    [          ]   0.7% (used 4488 bytes from 655360 bytes)
PROGRAM: [          ]   2.5% (used 52604 bytes from 2097152 bytes)
Configuring upload protocol...
AVAILABLE: blackmagic, jlink, mbed, stlink
CURRENT: upload_protocol = mbed
Looking for upload disk...
Auto-detected: /Volumes/NODE_L4R5ZI
Uploading .pioenvs/nucleo_l4r5zi/firmware.bin
Firmware has been successfully uploaded.
(Some boards may require manual hard reset)
========================================================================================== [SUCCESS] Took 38.03 seconds =========================================================================================

Terminal will be reused by tasks, press any key to close it.

Any suggestions on what could be going wrong?

I have uninstalled and reinstalled PIO, and made sure to delete the .platformio folder. I have also tried to replace the target folder with the one provided within mbed os on github - still nothing.

Can you verify the general function of this ADC pin and other pins by reading out its ADC value in a loop and have it connected to a potentiometer?

Iā€™ve tested each of the ADC inputs using the online mbed compiler, and have switched between the most upto date mbed library available and a previous version - the pins functioned as expected.

I have also tried mbed studio, the desktop IDE - this also presents the same issues as PlatformIO, the ADC input will sit at 1.6V when connected to ground or a DAC output.

From what I have read this was a problem that was rectified mbed v5.10.x, mbed forum post.

If the problem has been solved in 5.10.3 (and upwards) as the forum posts say there should be no problem because PlatformIO is currently at 5.11.4. Can you revert your changes to the framework-mbed folder and pio platform update and re-build (pio run -t clean && pio run -t upload)

Does the same code show the correct ADC values when compiled with PlatformIO?

Transferring the code directly into main.cpp produces the error when compiled within PIO.
This is a very strange problem, as I have the latest version of the stm32 platform (5.1.0), and have tried a clean install of PIO today.

I will try your suggestion and get back to you.

Here is the output after updating:

Updating tool-scons @ 2.20501.7 [Up-to-date]
Updating tool-unity @ 1.20403.0 [Up-to-date]
Updating contrib-pysite @ 2.27.181225 [Up-to-date]
Updating contrib-piohome @ 2.0.0 [Up-to-date]
Updating tool-pioplus @ 2.1.0 [Up-to-date]

Platform Manager

Platform ST STM32

Updating ststm32 @ 5.1.0 [Up-to-date]
Updating framework-mbed @ 5.51104.190222 [Up-to-date]
Updating toolchain-gccarmnoneeabi @ 1.80201.181220 [Up-to-date]


I have cleaned the project and tried compilation again, still the same issue. DAC output voltage is fine, ADC input incorrect.

I have tested pins A0, A1 and A2.
A0 is stuck at 1.6V
A1 and A2 are about input voltage - 300mV, and read 1.6V when grounded.

Iā€™ll try and see if the code is generally broken with my Nucleo L152RE, since I donā€™t have your board-type here.

I canā€™t reproduce this on my board.

#include <mbed.h>

Serial pc(USBTX, USBRX, "debug", 115200);
AnalogIn anIn(A0);

int main() {
	printf("Firmware start. Running mbed-os %d.%d.%d\n",
			MBED_MAJOR_VERSION,
			MBED_MINOR_VERSION,
			MBED_PATCH_VERSION);
	while(1) {
		float val = anIn.read() * 3.3f;
		printf("ADC: %.4f\n", val);
		wait_ms(100);
	}
	return 0;
}

When connected to GND shows 0.0, when connected to 3V3 shows 3.3.

Firmware start. Running mbed-os 5.11.4
ADC: 3.3000
...

platformio.ini:

[env:nucleo_l152re]
platform = ststm32
board = nucleo_l152re
framework = mbed
build_flags = -D PIO_FRAMEWORK_MBED_RTOS_PRESENT
monitor_speed = 115200

And this firmware shows 1.6 for you when you cannect A0 to GND? Which mbed version does it print?

Ah, my device also has a 2-channel DAC on even the same pin! :slight_smile:

I tested your firmware and it runs without problems.

Analog loop example
*** Connect A0 and PA_4 pins together ***
(out:0.0000) - (in:0.0188) = (0.0188) OK
(out:0.1000) - (in:0.1077) = (0.0077) OK
(out:0.2000) - (in:0.2005) = (0.0005) OK
(out:0.3000) - (in:0.3060) = (0.0060) OK
(out:0.4000) - (in:0.4071) = (0.0071) OK
(out:0.5000) - (in:0.5043) = (0.0043) OK
(out:0.6000) - (in:0.6032) = (0.0032) OK
(out:0.7000) - (in:0.7035) = (0.0035) OK
(out:0.8000) - (in:0.8037) = (0.0037) OK
(out:0.9000) - (in:0.9077) = (0.0077) OK

Now this is working for me because either I have the correct mbed-os version running or there is a bug that only affects your board and not mineā€¦

Hm, thatā€™s interesting. As far as I know, the main difference between PlatformIO and the mbed online compiler is that we use different compilers under the hood (GCC and ARMCC). Could you please try to compile your project using the mbed-cli tool and GCC compiler?

I will give this a go in the morning and report back. Thanks for your time kind helpers.

1 Like

An update on what I have found so far.

It seems as if issues are with the compiler optimisations for this board. I have compiled and tested the same code using mbed-cli and the GCC v8 toolchain - it causes the same issues. I have been trying to get it to compile with an older version of the toolchain (v7 and v6) but mbed-cli is giving me trouble.

Anway, I assume that PIO has a default build flag for GCC compiler optimisations (-0s perhaps?)
I have edited the platformio.ini with the following, and my code now works!

PlatformIO Project Configuration File:

[env:release]
platform = ststm32
board = nucleo_l4r5zi
framework = mbed
build_unflags = -Os
build_flags = -O0

The output from the analog loop example code is now:

[1A(out:0.0000) - (in:0.0125) = (0.0125) CORRECT
[1A(out:0.1000) - (in:0.1001) = (0.0001) CORRECT
[1A(out:0.2000) - (in:0.2002) = (0.0002) CORRECT
[1A(out:0.3000) - (in:0.2999) = (0.0001) CORRECT
[1A(out:0.4000) - (in:0.4002) = (0.0002) CORRECT
[1A(out:0.5000) - (in:0.4999) = (0.0001) CORRECT
[1A(out:0.6000) - (in:0.6005) = (0.0005) CORRECT
[1A(out:0.7000) - (in:0.6999) = (0.0001) CORRECT
[1A(out:0.8000) - (in:0.8002) = (0.0002) CORRECT
[1A(out:0.9000) - (in:0.9004) = (0.0004) CORRECT
[1A(out:1.0000) - (in:0.9915) = (0.0085) CORRECT

What is the default optimisation level in PIO?

One final question, is there a way to change the debug build optimisation level? because it is defaulting to -O0, and i would like to understand why -Os is causing problems.

Still seems weird because I didnā€™t need to adapt the compiler optimization flags. Standard is -Os for compilation actually. Please remove all the build_flags and build_unflags option and run pio run -v to get the verbose output. Copy one gcc command into a texteditor and search for the -O optimizatino flags. Should be -Os. BTW. youā€™re already changing the optimization level one possible correct way. Other one would be via build profiles, see Mbed ā€” PlatformIO latest documentation.

No -o is the output file. Look further to the right.

Yes youā€™re correct, it seems to be -Os:
"fomit-frame-pointer -Os -g1 -mcpu=cortex-m4 -mthumb"

I should point out that the problem is still present when removing the optimisation build flag.

Is there a way to force the optimisation level in PIO debugger, Iā€™d like to check the ADC registers.

Weird, since -O0 is the default since when no flag is specified. Are you sure -Os is gone when you build_unflags = -Os?

According to the compilation log it seems there is no optimisation flag at all with build_unflags = -Os

I hope build_flags and build_unflags still apply when pio does a recompile in debug mode. Did you try it? :thinking:
Oh and also -g3 -ggdb wouldnā€™t be bad in the build_flags.

Here is the log from the debugger terminal:

gcc version 8.2.1 20181213 (release) [gcc-8-branch revision 267074] (GNU Tools for Arm Embedded Processors 8-2018-q4-major)

COLLECT_GCC_OPTIONS='-o' '.pioenvs/release/src/main.o' '-c' '-std=gnu++98' '-fno-rtti' '-Wvla' '-g3' '-ggdb' '-v' '-Og' '-g3' '-ggdb3'

With the following platformio.ini:

[env:release]
platform = ststm32
board = nucleo_l4r5zi
framework = mbed
build_flags = -Os -g3 -ggdb -v

So it does seem to carry over the build flags except for the optimisation level which is set to -Og, do I need to set the env to debug to force the optimisation level?

Also, it seems STM are aware of this issue as noted here STM32L4 ADC bug