Cuenta pública de WeChat: Xiaofan Study está
preocupado por el aprendizaje común, preguntas o sugerencias, ¡por favor deje un mensaje en la cuenta pública!
Como programador, en el aprendizaje inicial de la programación, uno de los ejemplos básicos de nivel básico "Hello World" es inevitable. Entonces, ¿cuál es el ejemplo de entrada más básico cuando se aprende MCU? Así es, "encender una luz LED" lo llevará a través de un programa clásico de marquesina para llevar a todos a comenzar el viaje de STM32F4. A través de este estudio, comprenderá el puerto IO de STM32F4 como el método de salida .
Controlaremos los dos LED en la placa de desarrollo STM32F4 a través del código: DS0 y DS1 parpadean alternativamente para lograr un efecto similar al de una marquesina.
Conexión de hardware
Método de trabajo GPIO
-
4 modos de entrada:
entrada flotante
entrada pull-up
input pull-down
entrada analógica -
4 modos de salida:
salida de drenaje abierto (con pull-up o pull-down)
función de multiplexación de drenaje abierto (con pull-up o pull-down)
salida de push-pull (con pull-up o pull-down)
función de multiplexación de push-pull (con pull-up o pull-down ) -
4 tipos de velocidad de salida máxima:
-2MHZ
-25MHz
-50MHz
-100MHz
Diseño de software
led.c
# include " led.h " /////////////////////////////////////////// ////////////////////////////////////// / // initialize PF10 puerto de salida y PF9. y estos dos puertos para permitir reloj // el LED inicializar el IO vacío LED_Init ( void ) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOF, la habilitación); // permite el reloj GPIOF // GPIOF9, la configuración de inicialización F10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; // LED0 y LED1 corresponden al puerto IO GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // Modo de salida general GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;// salida push-pull GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; // 100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // tirón GPIO_Init (GPIOF, y GPIO_InitStructure); // inicializar el GPIO GPIO_SetBits (GPIOF, GPIO_Pin_9 | GPIO_Pin_10); // GPIOF9, siempre que el F10 alta, fuera }
Este código contiene una función void LED_Init (void). La función de esta función es configurar PF9 y PF10 como salida push-pull. Cabe señalar aquí que al configurar el periférico STM32, ¡el reloj del periférico debe estar habilitado en todo momento! GPIO es un periférico montado en el bus AHB1. El reloj periférico montado en el bus AHB1 en la biblioteca de firmware está habilitado por la función RCC_AHB1PeriphClockCmd ().
Después de configurar el reloj, LED_Init llama a la función GPIO_Init para completar la configuración inicial de PF9 y PF10, y luego llama a la función GPIO_SetBits para controlar la salida 1 de LED0 y LED1 (LED apagado). En este punto, la inicialización de los dos LED está completa. Esto completa la inicialización de estos dos puertos IO.
led.h
#ifndef __LED_H #define __LED_H #include " sys.h " ////////////////////////////////////// //////////////////////////////////////////// / ///// //////////////////////////////////////////////////// ////////////////////////// / // el puerto LED definición #define LED0 PFout (. 9) // el DS0 #define Ledl PFout (10) / / DS1 void LED_Init ( void ); // Inicializar # endif
Aquí, las operaciones de banda de bits se utilizan para operar un bit de un puerto IO.
Escriba el siguiente código en la función principal:
#include " sys.h " #include " delay.h " #include " usart.h " #include " led.h " // Marquee experiment-library version version int main ( void ) { delay_init ( 168 ); // Función de retraso de inicialización LED_Init (); // Inicializa el puerto de LED mientras que ( 1 ) { LED0 = 0 ; // LED0 enciende LED1 = 1 ; // LED1 apagado delay_ms ( 500 ); LED0 = 1 ; // LED0 apagado LED1 = 0 ; // LED1 encendido delay_ms ( 500 ); } }
El código incluye la oración #include "led.h", para que se pueda invocar LED0, LED1, LED_Init, etc. en la función main (). Aquí debemos reiterar que en la biblioteca de firmware, el sistema llamará a la función SystemInit () en system_stm32f4xx.c para inicializar el reloj del sistema cuando se inicie, y llamará a la función main () después de que se complete la inicialización del reloj. Entonces ya no necesitamos llamar a la función SystemInit () en la función main (). Por supuesto, si necesita reiniciar el sistema del reloj, puede escribir su propio código de configuración del reloj. SystemInit () simplemente inicializa el sistema del reloj al estado predeterminado. La función main () es muy simple, primero llame delay_init () para inicializar el retraso, luego llame a LED_Init () para inicializar GPIOF.9 y GPIOF.10 como salida. Finalmente, LED0 y LED1 parpadean alternativamente en un bucle infinito a intervalos de 500 ms.
Luego presione
Compila el proyecto
Puede ver que no hay errores ni advertencias. A partir de la información de compilación, podemos ver que nuestro código ocupa un tamaño FLASH: 5672 bytes (5248 + 424), y el tamaño SRAM utilizado es: 1880 bytes (1832 + 48). Aquí explicamos el significado de varios datos en el resultado de la compilación: Código: indica el tamaño de FLASH ocupado por el programa (FLASH). Datos de RO: datos de solo lectura, que representan la constante definida por el programa (FLASH). Datos RW: Leer datos de escritura, lo que significa la variable inicializada (SRAM) Datos ZI: Cero datos iniciales, lo que significa la variable no inicializada (SRAM) Con esto, puede conocer el flash actual y El tamaño del sram es grande, por lo que es importante tener en cuenta que el tamaño del programa no es el tamaño del archivo .hex, sino la suma del código compilado y los datos de RO.
Descargar verificación
Después de la descarga, LED0 y LED1 parpadean cíclicamente