controlador STM32: GPIO_SetBits no parece tener ningún efecto

0

Tengo algún problema con una MCU STM32F030F4P6. El circuito consta de la propia MCU, el riel de 3 V conectado a los pines VDD y VDDA, la tierra conectada a los pines GND y BOOT0 y un LED conectado a cada uno de los pines PA0-PA3. Aquí hay un diagrama del circuito (las líneas dibujadas cerca de los conectores SV1 y SV2 significan que los cables externos van a los pines LED / power / ground / SWCLK / SWDIO.

Aquíestámicódigo:

#include"stm32f0xx.h"
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_rcc.h"

const uint16_t PINS = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;

int main(void)
{
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    GPIO_InitTypeDef GPIOa;
    GPIO_StructInit(&GPIOa);

    GPIOa.GPIO_Mode = GPIO_Mode_OUT;
    GPIOa.GPIO_OType = GPIO_OType_PP;
    GPIOa.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIOa.GPIO_Pin = PINS;
    GPIOa.GPIO_Mode = GPIO_Speed_2MHz;
    GPIO_Init(GPIOA, &GPIOa);

    volatile uint32_t i;

    GPIO_SetBits(GPIOA, PINS);
    volatile uint8_t state = 1;
    while(1)
    {
        // Waste some time
        for (i = 0; i < 500000; i++) {};
        if (state == 1) {
            GPIO_ResetBits(GPIOA, PINS);
            state = 0;
        } else {
            GPIO_SetBits(GPIOA, PINS);
            state = 1;
        }
    }
}

El problema es que los LED conectados a los pines no se encienden. He conectado un voltímetro a los pines de salida y he depurado un programa y descubrí que el voltaje aumenta un poco (a aproximadamente 0,1 V) cada vez que hago GPIO_SetBits o GPIO_ResetBits , pero luego cae instantáneamente a cero. También para descartar los problemas de falta de corriente, cambié de GPIOa.GPIO_PuPd a GPIO_PuPd_UP y todos los LED se iluminan, pero no se encienden.

Utilizo la placa de descubrimiento STM32VLD como depurador e IDE de CooCoox.

Durante la depuración, puedo ver que los bits de registro de GPIOA_ODR están cambiando (y ya no cambian si elimino la primera línea de main() ), por lo que parece haber algún problema con la salida.

¿Alguien me puede dar algún consejo sobre lo que estoy haciendo mal?

    
pregunta Alexey Malev

1 respuesta

4

Aquí está el problema:

GPIOa.GPIO_Mode = GPIO_Speed_2MHz;

Debería ser

GPIOa.GPIO_Speed = GPIO_Speed_2MHz;

Muy tonto. 8 horas de vida desperdiciadas :(

    
respondido por el Alexey Malev

Lea otras preguntas en las etiquetas