STM32F4-Discovery GPIO Always High
Make sure you configure the pins properly

&gt; {
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_0 |
                            GPIO_Pin_1 |
                            GPIO_Pin_2 |
                            GPIO_Pin_3 |
                            GPIO_Pin_4 |
                            GPIO_Pin_5 |
                            GPIO_Pin_6 |
                            GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
}


Source: Using I/O ports on STM32

Then write to the port. You could have also burned the pin out or ESD'ed the pin, try a few different ports\pins. 

The STM32F's usually configure their ports as high-Z on wakeup/reset, with a high impedance meter its possible to measure anything without setting the pin to a determined output. If you put an external 20k pulldown to ground and still measured 3.3V then I'd believe your meter.