Re: stm32 desde cero (1, 32, el primer programa, enciende la luz led)

鸽了这么久终于又想起了CSDN的密码
Hoy, todos aprenderán stm32 juntos. Ya hay muchos ejemplos en Internet sobre cómo construir 32 proyectos, incluidos muchos archivos. Si lo necesita, puede encontrar el número de grupo al final del artículo. Lo compartiré en el archivo de grupo, así que no perderé mi lengua aquí.

32 Para 51 microcomputadoras de un solo chip, tanto los puertos de E / S como los registros tienen cambios muy grandes. Un ejemplo muy simple: 51 E / S de un solo chip generalmente no necesitan configurarse, mientras que 32 puertos de E / S necesitan Para habilitar, debe seleccionar el modo. (Entrada analógica, entrada flotante, entrada pull-up y pull-down, salida de drenaje abierto, salida push-pull, salida multiplexada de drenaje abierto / push-pull, hay ocho modos en total). Por lo tanto, si desea Aprenda 32 bien, debe comprender la definición de 32 funciones de biblioteca.

typedef struct
{
    
    
  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
                                      This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;

Esta es una estructura inicializada de GPIO, la estructura sigue siendo una estructura, como el modo

typedef enum
{
    
     GPIO_Mode_AIN = 0x0,
  GPIO_Mode_IN_FLOATING = 0x04,
  GPIO_Mode_IPD = 0x28,
  GPIO_Mode_IPU = 0x48,
  GPIO_Mode_Out_OD = 0x14,
  GPIO_Mode_Out_PP = 0x10,
  GPIO_Mode_AF_OD = 0x1C,
  GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;

La función de inicialización real es

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

Creo que ya está confundido cuando ve esto. ¿Cómo se puede inicializar? ¿Cómo puede ser tan problemático un puerto de E / S?

No frito pollo, escúchame explicar a todos

En primer lugar, cuando vea los dos primeros cuadros de función, es probable que todos comprendan que casi la mitad de las 32 funciones de la biblioteca son estructuras, por lo que todos deben tener habilidades sólidas en el lenguaje C. Escribimos MCU que no son tan complicadas y profundas como los programas , pero las habilidades básicas no deben perderse.

Todos ven que los parámetros de entrada son en realidad dos. GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct
Echemos un vistazo GPIO_TypeDef* GPIOx. Por el nombre, podemos ver que esto es para el puerto de E / S, que es el mismo que el microordenador de un solo chip 51. Por ejemplo, 51 se llama P1, luego 32 se llama GPIOA y el segundo. Inicializa el puerto de E / S, hagamos clic derecho e ingresemos la definición para ver

typedef struct
{
    
    
  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
                                      This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;

Aquí está el párrafo de ahora, podemos ver que hay tres cosas en esta estructura

uint16_t GPIO_Pin;   GPIOSpeed_TypeDef GPIO_Speed;  GPIOMode_TypeDef GPIO_Mode;

Mire las notas a continuación, puede saber uint16_t GPIO_Pin;que el pin está definido, que es el mismo que P1 ^ 1 en 51

GPIOSpeed_TypeDef GPIO_Speed;Esto es para definir la frecuencia del puerto de E / S, hagamos clic derecho para ver

typedef enum
{
    
     
  GPIO_Speed_10MHz = 1,
  GPIO_Speed_2MHz, 
  GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;

Aquí tenemos tres opciones: 10 2 50, decida
usted mismo según sus necesidades. Veamos la siguiente.

GPIOMode_TypeDef GPIO_Mode;Esta es la elección del modo de puerto IO, continúe haciendo clic derecho

typedef enum
{
    
     GPIO_Mode_AIN = 0x0,
  GPIO_Mode_IN_FLOATING = 0x04,
  GPIO_Mode_IPD = 0x28,
  GPIO_Mode_IPU = 0x48,
  GPIO_Mode_Out_OD = 0x14,
  GPIO_Mode_Out_PP = 0x10,
  GPIO_Mode_AF_OD = 0x1C,
  GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;

Puede ver que aquí están los ocho modos que mencioné al principio.
Después de entenderlos, comencemos el primer paso, inicialicemos un puerto de E / S, luego, debido a que mi LED está en B5 y E5, entonces usaré estos dos One I El puerto / O es un ejemplo.

void LED_Init(void)
{
    
    
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);	 //使能PB,PE端口时钟
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 //LED0-->PB.5 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.5
 GPIO_SetBits(GPIOB,GPIO_Pin_5);						 //PB.5 输出高

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	    		 //LED1-->PE.5 端口配置, 推挽输出
 GPIO_Init(GPIOE, &GPIO_InitStructure);	  				 //推挽输出 ,IO口速度为50MHz
 GPIO_SetBits(GPIOE,GPIO_Pin_5); 						 //PE.5 输出高 
}

Sé que todos están confundidos nuevamente, déjeme responderle
uno por uno. P: ¿Cuál es la primera línea de?
R: La primera línea equivale a definir una estructura GPIO_InitStructure para inicializar el puerto de E / S

P: ¿Qué es RCC_APB2PeriphClockCmd?
R: Esta es la función para habilitar los dos puertos de E / S de BE. Debido a que GPIOB y BPIOE están en el bus APB2 (puede encontrar otros buses GPIO en el manual de referencia chino, los hay en el grupo), por lo que debemos usar esta función, solo recuerde.

Las siguientes tres líneas son un método de uso de estructura estandarizado, que se ingresa en secuencia de acuerdo con los datos de la definición. Luego, como queremos iluminar, usamos la salida push-pull. Luego GPIO_Init inicializa GPIOB de acuerdo con los parámetros.

GPIO_SetBits es una función de salida de alto nivel, y el método de uso se puede entender mirando mi rutina.
Aquí para agregar: el nivel bajo esGPIO_ResetBits

P: ¿Por qué solo configura los parámetros Pin para GPIOE, pero no otros parámetros?
R: Debido a que los otros son iguales a GPIOB, tienen salida push-pull y 50MHz, por lo que no hay necesidad de configuraciones adicionales.

Después de escribir LED_Init, podemos escribir la función principal

int main(void)
{
    
    
	delay_init();
	LED_Init();
	while(1)
	{
    
    
		LED0 = 0;
		LED1 = 1;
		delay_ms(300);
		LED0 = 1;
		LED1 = 0;
		delay_ms(300);
	}
}

Los estudiantes que hayan estudiado 51 deberían poder entenderlo, ¿verdad?
Pero aun tengo que explicar

delay_init();Esta función delay.hya se ha definido en el interior, por lo que no es necesario que la escriba usted mismo. (Hay archivos de proyecto en el grupo)
LED0 y LED1 deben ser definidos por nosotros mismos en el archivo de encabezado led.h

#define LED0 PBout(5)
#define LED1 PEout(5)

¡Date prisa e intenta compilar el código en la placa de desarrollo stm32!

En el próximo artículo, actualizaré el PWM de STC51, y luego actualizaré el PWM de STC12, para prepararme para actualizar el PWM de STM32

Número de grupo de intercambio: 1033131250

Supongo que te gusta

Origin blog.csdn.net/qq_18242623/article/details/115348384
Recomendado
Clasificación