Skip to main content
Graduate II
July 16, 2025
Solved

PORT D Read errors.

  • July 16, 2025
  • 4 replies
  • 710 views

I have an STM32CubeIDE project using HAL for a STM32G071RBT6

I have Port D bits 0 to 6 set up for GPIO Input, with pull-up enabled.

Screenshot 2025-07-16 at 16.20.46.png

Screenshot 2025-07-16 at 16.20.13.png

In hardware these are connected to an 8-WAY dip switch, which when each switch is "on" connects the respective pin to GND. (PB3[STOPBITS] is connected to the 8th switch)

 

The issue is that when I read the port using

id = (GPIOD->IDR & 0x7F); /* Lowest 7-bits are from PORT D0-D6 */

Bits 0 and 2 are always stuck at 0.

With the board powerd off I have tested the board connctions to the chip and the dip switch, all seems OK. There is no short to GND on bits 0 and 2.

I checked the resistance on all the bits of port D and bits 0 and 2 have about 500KΩ to ground, whereas the rest of port D has about 7 MΩ

I have checked through the rest of my code and it's not doing anything else to PORT D, and the alternate-function registers (PORTD->AFR) read all zero immediately before reading from the IDR.

I have five of these boards, all made by JLCPCB (including assembly) and they all do the same thing.

What's causing the bits 0 and 2 to be stuck at 0? Does PULL UP not work on those bits? I could try hand-soldering some stronger pullups on, but it works for the other bits in port d, and it's the same on all boards!

    This topic has been closed for replies.
    Best answer by Andrew Neil

    @KMill did you see my PS?

     

    AndrewNeil_0-1752682338541.png

     

    4 replies

    Super User
    July 16, 2025

    If you measure the voltage at the STM32 pins, are they going high?

    KMillAuthor
    Graduate II
    July 16, 2025

    Thanks @Andrew Neil 

    The 2 stuck pins are reading 0.24v and the rest are reading 3.26v with the swicthes open.

    Super User
    July 16, 2025

    So the port is actually reading correctly - those bits really are at zero.

    The question becomes: why are they not being pulled-up.

    As a test, can they be pulled-up with an external resistor?

     

    PS:

    AndrewNeil_0-1752681760567.png

    https://www.st.com/resource/en/datasheet/stm32g071rb.pdf#page=48

    KMillAuthor
    Graduate II
    July 16, 2025

    With a 4K7 pull up they are reading as expected (1 when switchopen, 2 when closed) but the voltage on the pins is only getting pulled up to 1.65 V (VCC is 3.3 V)

     

    So yip, I agree, the quesion is what has happened to the pull ups?

    Let me go read the PUDR register...

    Graduate II
    July 16, 2025

    Which board do you use?

    In DS12232 section Pinouts... PD0 and PD2 are said to have an IO structure of "FT_c" where the _c means "USB Type-C PD capable" and they have an additional function of UCPD2_CC1 resp. UCPD2_CC2.

    Does your board have an USB port connected to them?

    Super User
    July 16, 2025

    @KMill did you see my PS?

     

    AndrewNeil_0-1752682338541.png

     

    KMillAuthor
    Graduate II
    July 16, 2025

    AHA! A smoking gun!

    Thank you - that sounds like exactly the sort of thing that would cause this. I'll try strobing that bit and see what happens.

    KMillAuthor
    Graduate II
    July 16, 2025

    @Andrew Neil Thank you!

    The STOBE Bit was the issue.

    I set the appropriate bit in SYSCFG1 and now it all works as expected.

    You have saved me a lot of grief! Who would have thought the Pull-Downs would be enabled when the UCPD Device is disabled?

    Screenshot 2025-07-16 at 17.29.40.png

    Super User
    July 16, 2025

    @KMill wrote:

    The STOBE Bit was the issue.


    Great - please mark the solution.

     


    @KMill wrote:

    Who would have thought the Pull-Downs would be enabled when the UCPD Device is disabled?


    Always good to check those little footnotes on the the pinout table - there's a few gotchas!