El pin de entrada STM32F4xx lee el estado incorrecto la primera vez que se ejecuta pero no después

0

Estoy trabajando en un programa que lee el estado de un pin en el inicio para determinar un modo operativo. Cuando ejecuto el código en el primer encendido, se lee incorrectamente, pero los reinicios subsiguientes sin la lectura del ciclo de energía son correctos. Parece que no puedo encontrar una respuesta a por qué podría ser esto y yo también estoy un poco perdido. Me imagino que hay algún tipo de problema de tiempo que está ocurriendo y es por eso que las lecturas posteriores están bien, pero no estoy seguro de cómo modificar mi código para lidiar con eso. El circuito está PI6 conectado a 3.3V o GND , según la configuración deseada. Aquí está el código relevante:

#define DEVICE_HOST_MODE_PIN                GPIO_PIN_6
#define DEVICE_HOST_MODE_PORT               GPIOI
#define DEVICE_HOST_MODE_CLK_ENABLE()       __GPIOI_CLK_ENABLE()
#define DEVICE_HOST_MODE_CLK_DISABLE()      __GPIOI_CLK_DISABLE()

int main(void) {

    /* MCU Configuration----------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* Configure the system clock */
    SystemClock_Config();

    /* System interrupt init*/
    /* Sets the priority grouping field */
    HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

    BSP_InitializeMode();
    /* Remaining application code */
}

void BSP_InitializeMode(void) {
    /*Configure MODE signal line */
    GPIO_InitTypeDef GPIO_InitStruct;
    DEVICE_HOST_MODE_CLK_ENABLE();
    GPIO_InitStruct.Pin = DEVICE_HOST_MODE_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLDOWN;
    GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
    HAL_GPIO_Init(DEVICE_HOST_MODE_PORT, &GPIO_InitStruct);
    GPIO_PinState state = HAL_GPIO_ReadPin(HOST_READY_PORT, DEVICE_HOST_MODE_PIN);
    isDevice = (state == GPIO_PIN_RESET);
}

El método SystemClock_Config() es el generado por el cubo STM. Actualmente estoy compilando con las banderas -O0 y -g3 .

EDIT 1

Alguna información adicional que he descubierto: parece más específicamente que no puedo leer que un pin está alto ( 3.3V ). Intenté agregar otro pin y configurar ambos como pull-up, luego conectando a tierra el que quiero, y ambos simplemente leen a tierra.

EDIT 2

Según lo solicitado, la definición de isDevice se publica a continuación. Esto está en un archivo de encabezado mode.h

#ifndef MODE_H_
#define MODE_H_

#include <stdbool.h>

extern bool isDevice;

#endif /* MODE_H_ */

Y la implementación real está en el mismo archivo que el código original, en la parte superior:

bool isDevice = true;

Además, descubrí un error tipográfico. Sin embargo, arreglarlo no parece haber solucionado el problema de raíz. Estaba leyendo el número de pin GPIO incorrecto. Se ha corregido anteriormente. Nuevamente, cambiar esto al número de pin correcto no ha resuelto el problema y aún presenta dos pines. He intentado configurarlos sin tirar, tirar hacia arriba y hacia abajo, y en ninguna circunstancia parece cambiar el resultado. Siempre se leen a tierra, sin importar qué señal se les aplique.

    
pregunta Jared

1 respuesta

1

Resulta que esto fue un simple error de copiar y copiar de mi parte que, debido a las macros con nombres similares en las funciones adyacentes, mis ojos se volvieron vidriosos. Estaba inicializando un puerto, mientras leía otro. Mi función anterior debería haber leído:

void BSP_InitializeMode(void) {
    /*Configure MODE signal line */
    GPIO_InitTypeDef GPIO_InitStruct;
    DEVICE_HOST_MODE_CLK_ENABLE();
    GPIO_InitStruct.Pin = DEVICE_HOST_MODE_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLDOWN;
    GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
    HAL_GPIO_Init(DEVICE_HOST_MODE_PORT, &GPIO_InitStruct);
    GPIO_PinState state = HAL_GPIO_ReadPin(DEVICE_HOST_MODE_PORT, DEVICE_HOST_MODE_PIN);
    isDevice = (state == GPIO_PIN_RESET);
}
    
respondido por el Jared

Lea otras preguntas en las etiquetas