Cómo usar CMSIS para configurar un puerto bidireccional en STM32F4

Me gustaría usar GPIO_TypeDef y GPIO_Init para crear un puerto bidireccional en el STM32F407, algunos pines de entrada, algunos pines de salida.

¿Simplemente ejecuto GPIO_Init dos veces, una para los pines de entrada y otra para los pines de salida, después de configurar la estructura GPIO_Typedef, o la segunda ejecución deshace todo lo que hizo la primera ejecución?

Sé (al menos estoy bastante seguro) que esto se puede codificar en el nivel de registro sin problemas, pero me gustaría la forma CMSIS de hacer las cosas.

Respuestas (1)

Siempre que especifique pines diferentes en la estructura GPIO_Typedef, puede ejecutar GPIO_Init tantas veces como desee sin deshacer los otros inicios. Puede agrupar todas las entradas (o salidas) juntas y bit a bit O las designaciones de pin (como GPIO_Pin_0 | GPIO_Pin_1), o puede hacerlo todo por separado, llamando a GPIO_Init para cada uno.

No olvide habilitar el reloj GPIO AHB usando: RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); antes de configurar los pines.

@ScottSeidman... Si aún no lo ha hecho, recomendaría descargar el código fuente de la Biblioteca de periféricos estándar. No solo puede ver cómo funcionan funciones como GPIO_Init(), sino que (curiosamente) incluyen instrucciones para configurar y usar los periféricos en los archivos de origen. Me parece que sería mejor que las instrucciones estuvieran en los archivos de cabecera, pero no es así.
Buen consejo. Revisé la sección "Cómo usar este controlador", pero eso no estaba claro en esta pregunta. Profundizando un poco más, está claro que GPIO_Init recorre los bits especificados en el campo GPIO_Pin y no toca nada más. Supongo que tengo que ser meticuloso con el mantenimiento de GPIO_InitStruct si no quiero hacer cosas accidentalmente (o simplemente usar dos llamadas de función separadas para configurarlo). ¿Hay una buena manera de despejar esa estructura?
@ScottSeidman ... No conozco una buena manera de despejar la estructura. Proporcionan GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct), pero eso solo completa la estructura con valores predeterminados, por lo que aún debe completar todo lo que es diferente y el valor predeterminado para GPIO_Pin es GPIO_Pin_All, por lo que debe tener cuidado con eso. Prefiero configurar explícitamente todos los valores de estructura inmediatamente antes de cada llamada a GPIO_Init().
@ScottSeidman ... Por supuesto, eso puede ser un poco tedioso si va a cambiar los puertos más de una vez, como cambiar las entradas a las salidas y viceversa. En ese caso, probablemente usaría estructuras precargadas.