La publicación explica cómo usar pines stm32 como entrada usando keil y stmcubemx ide. Se realiza un sencillo tutorial de encendido/apagado con un botón como entrada para explicar la codificación y el funcionamiento. Cuando se presiona un botón, el LED se enciende y cuando se suelta el botón, el LED se apaga. El proyecto es bastante simple. Antes de comenzar el tutorial, recomiendo hacer el tutorial de cómo empezar con el microcontrolador stm32f103, keil ide y la inicialización del código stumcubemx. Esto presentará cómo inicializar/configurar y alinear stmcubemx y keil ide para comenzar a trabajar con los microcontroladores stm32f103. No entenderás este proyecto si no tienes una introducción a stmcubemx y keil ide.
- Comenzando con stm32f103, keil y stmcubemx
El circuito del proyecto es bastante simple. Conecté el led al pin#pc-13 del stm32f103c8t6 y el botón al pin#pa-10.
|
Declaración de led Stm32f103 y pines de botón en stmcubemx
|
stm32f103 gpios como configuración de resistencia de entrada/salida y pull-up/pull-down
El pin LED Pc-13 se declara como salida y el botón Pa-10 como entrada. Pin Pa-10 como resistencia pull-up interna. Activé y conecté mi botón directamente a tierra. En la imagen superior puede ver que GPIO PA10 está en modo de entrada y PC-13 está en modo Push Pull de salida. El nivel de salida inicial en el pin LED PC-13 se declara alto. Frecuencia de salida para pin Led configurada en promedio. Si no entiende nada en este nivel, siga el tutorial mencionado anteriormente. Explica todo esto en profundidad.
|
|
El microcontrolador Stm32f103 admite fuentes de reloj internas y externas. Internamente dispone de 2 osciladores RC HSI (alta velocidad interna) y LSI (baja velocidad interna). La velocidad alta interna tiene una frecuencia de 8 Mhz y la velocidad baja interna es de 40 khz. Externamente, stm32f103 admite HSE (alta velocidad externa) y LSE (baja velocidad externa). El externo de alta velocidad admite un reloj de entrada máximo de 16 MHz y el externo de baja velocidad admite un reloj de entrada máximo de 1000 kHz. Stm32f103 tiene un circuito PLL interno desde el cual podemos generar una señal de reloj de 72Mhz. Podemos superar los 72 MHz, pero como el stm32 funciona con un reloj máximo de 72 MHz, superamos los 72 MHz. En este tutorial estoy usando una fuente de reloj interno de 8 Mhz de alta velocidad. La configuración para HSI (alta velocidad interna) se muestra a continuación.
|
stm32f103 led con diagrama de circuito de botón
|

Después de generar el código de inicialización stmcubemx es momento de escribir nuestra lógica deseada “Led encendido/apagado con pulsador”. Es un código simple si lo escribimos en c o c++, pero en keil todo depende de la sintaxis soportada por el compilador y los controladores/bibliotecas que estemos usando. Estoy trabajando con controladores Hal publicados por stmicroelectronics. Estos controladores Hal se instalan directamente en nuestra PC cuando descargamos el paquete de software stmcubemx. Cuando generamos código desde stmcubemx a keil, los controladores y bibliotecas hal necesarios se copian directamente a la carpeta del proyecto.
El bucle while(1) en la función principal es donde escribimos nuestro código. Escribo el siguiente código para nuestra lógica y funciona perfectamente y según el resultado deseado.
if(HAL_GPIO_ReadPin(Ibutton_GPIO_Port, Ibutton_Pin)==GPIO_PIN_RESET) //Comprueba si se presionó el botón
HAL_GPIO_WritePin(Led_GPIO_Port, Led_Pin, GPIO_PIN_SET); //Si se presiona el LED se enciende
otro
HAL_GPIO_WritePin(Led_GPIO_Port, Led_Pin, GPIO_PIN_RESET); //De lo contrario LED apagado
La función HAL_GPIO_ReadPin lee el estado del pin y devuelve el estado. Se necesitan 2 parámetros para funcionar, uno en el puerto del pin y el segundo en el número del pin. En nuestro caso, el puerto es Ibutton_GPIO_Port y el número de pin es Ibutton_Pin.
HAL_GPIO_WritePin escribe en el pin especificado. Hazlo alto o bajo. Necesita 3 parámetros de puerto, pin y datos. En nuestro caso, el puerto es Led_GPIO_Port, el pin es Led_Pin y los datos son SET/RESET.
- GPIO_PIN_RESET: escribe 0 en el pin, hace que el pin esté bajo
- GPIO_PIN_SET: escribe 1 en el pin, hace que el pin sea alto


