STM32 enciende las luces LED (versión mejorada)

Prefacio

A través del análisis del capítulo anterior, el LED se puede encender, pero el programa es difícil de entender y escribir.Este capítulo utiliza la biblioteca de firmware para mejorar el contenido del capítulo anterior.

1. Utilice la definición de macro para simplificar el programa

Las ventajas
de la definición de macro: La definición de macro sin parámetros se utiliza en esta etapa:
1) El programa es fácil de entender y las macros complejas se pueden redefinir como simples;
2) Fácil de modificar. Cuando una macro se usa para múltiples propósitos, sólo se modifica un valor de modificación Puede

Dos, comprensión de la biblioteca de firmware STM32

1. Abordar la comprensión

Clasifiquemos el valor de la definición de macro de registro utilizada por el LED.
En el manual, la dirección base del registro es 0x4000 0000. Inserte la descripción de la imagen aquí
Al definir la macro, primero defina la dirección base, y las direcciones de otros periféricos son Desplazamiento de acuerdo con la dirección base.
En la biblioteca de firmware,

外设基地址
#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */

#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
;APB2地址
...
#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)
;GPIOB地址,在APB2基础上增加了0x0C00,在存储器映射中可以查找到

;//gpiox 每组寄存器 
typedef struct
{
    
    
  __IO uint32_t CRL;//偏移地址: 0x00
  __IO uint32_t CRH;//偏移地址: 0x04
  __IO uint32_t IDR;//偏移地址: 0x08
  __IO uint32_t ODR;//偏移地址: 0x0C
  __IO uint32_t BSRR;//偏移地址: 0x10
  __IO uint32_t BRR;//偏移地址: 0x14
  __IO uint32_t LCKR;//偏移地址: 0x18
} GPIO_TypeDef;

<font size=3>GPIO理解
;//进行GPIO_TypeDef*转换,可以直接使用GPIOB->CRL,...
#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)

2. Comprensión relacionada con GPIO

CPIO relacionado en stm32f10x_gpio.c stm32f10x_gpio.h

;GPIO引脚定义,对应ODR,IDR制定具体哪一位
#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */
#define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */
#define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */
#define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected */
#define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected */
#define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< Pin 8 selected */
#define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!< Pin 9 selected */
#define GPIO_Pin_10                ((uint16_t)0x0400)  /*!< Pin 10 selected */
#define GPIO_Pin_11                ((uint16_t)0x0800)  /*!< Pin 11 selected */
#define GPIO_Pin_12                ((uint16_t)0x1000)  /*!< Pin 12 selected */
#define GPIO_Pin_13                ((uint16_t)0x2000)  /*!< Pin 13 selected */
#define GPIO_Pin_14                ((uint16_t)0x4000)  /*!< Pin 14 selected */
#define GPIO_Pin_15                ((uint16_t)0x8000)  /*!< Pin 15 selected */
#define GPIO_Pin_All               ((uint16_t)0xFFFF)  /*!< All pins selected */
;//gpio 速度 GPIOx_CRL/H下的MODEy
typedef enum
{
    
     
  GPIO_Speed_10MHz = 1,
  GPIO_Speed_2MHz, 
  GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
;//模式 GPIOx_CRL/H 下的CNFy
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;
;//GPIOx控制结构体,CRL/H
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;

;//GPIO还提供了一系列函数,将参数传进即可
/**
  * @brief  Initializes the GPIOx peripheral according to the specified
  *         parameters in the GPIO_InitStruct.
  * @param  GPIOx: where x can be (A..G) to select the GPIO peripheral.
  * @param  GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that
  *         contains the configuration information for the specified GPIO peripheral.
  * @retval None
  */
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
    
    
...
}

La definición de GPIO_ResetBits en la biblioteca de firmware

/**
  * @brief  Clears the selected data port bits.
  * @param  GPIOx: where x can be (A..G) to select the GPIO peripheral.
  * @param  GPIO_Pin: specifies the port bits to be written.
  *   This parameter can be any combination of GPIO_Pin_x where x can be (0..15).
  * @retval None
  */
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
    
    
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  
  GPIOx->BRR = GPIO_Pin;
}

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

3. Comprensión relacionada con RCC

RCC relacionado en stm32f10x_rcc.c stm32f10x_rcc.h

#define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)
#define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)
#define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)
#define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)
#define RCC_APB2Periph_GPIOD             ((uint32_t)0x00000020)
#define RCC_APB2Periph_GPIOE             ((uint32_t)0x00000040)
#define RCC_APB2Periph_GPIOF             ((uint32_t)0x00000080)
#define RCC_APB2Periph_GPIOG             ((uint32_t)0x00000100)
#define RCC_APB2Periph_ADC1              ((uint32_t)0x00000200)
#define RCC_APB2Periph_ADC2              ((uint32_t)0x00000400)
#define RCC_APB2Periph_TIM1              ((uint32_t)0x00000800)
#define RCC_APB2Periph_SPI1              ((uint32_t)0x00001000)
#define RCC_APB2Periph_TIM8              ((uint32_t)0x00002000)
#define RCC_APB2Periph_USART1            ((uint32_t)0x00004000)
#define RCC_APB2Periph_ADC3              ((uint32_t)0x00008000)
#define RCC_APB2Periph_TIM15             ((uint32_t)0x00010000)
#define RCC_APB2Periph_TIM16             ((uint32_t)0x00020000)
#define RCC_APB2Periph_TIM17             ((uint32_t)0x00040000)
#define RCC_APB2Periph_TIM9              ((uint32_t)0x00080000)
#define RCC_APB2Periph_TIM10             ((uint32_t)0x00100000)
#define RCC_APB2Periph_TIM11             ((uint32_t)0x00200000)
/**
  * @brief  Enables or disables the High Speed APB (APB2) peripheral clock.
  * @param  RCC_APB2Periph: specifies the APB2 peripheral to gates its clock.
  *   This parameter can be any combination of the following values:
  *     @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
  *          RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
  *          RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
  *          RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
  *          RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
  *          RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
  *          RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11     
  * @param  NewState: new state of the specified peripheral clock.
  *   This parameter can be: ENABLE or DISABLE.
  * @retval None
  */
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
{
    
    
}

Como se puede ver en los comentarios de la función, los parámetros pueden ser muchos periféricos; GPIOA a G; USART; TIM; AFIO; ADC, etc .; es el reloj que el diagrama de bloques del sistema cuelga debajo de APB2. Inserte la descripción de la imagen aquí
El archivo de la biblioteca también presenta muchos módulos. Este artículo solo analiza las definiciones relacionadas con los LED. Un ejemplo del uso de la función de la biblioteca de firmware oficial para encender el LED es el siguiente:

Tres, realización del programa

bsp_led.h

#define LED_GPIO_PORT    	GPIOB	//端口		              
#define LED_GPIO_CLK 	    RCC_APB2Periph_GPIOB//时钟参数		
#define LED_GPIO_PIN		GPIO_Pin_5//			        

bsp_led.c

#include "bsp_led.h"   
void LED_GPIO_Config(void)
{
    
    		
		/*定义GPIO结构体*/
		GPIO_InitTypeDef GPIO_InitStructure;

		/*开GPIOB时钟,APB2*/
		RCC_APB2PeriphClockCmd( LED_GPIO_CLK, ENABLE);
		/*具体是哪个引脚pin5*/
		GPIO_InitStructure.GPIO_Pin = LED_GPIO_PIN;	
		/*GPIO模式*/
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
		/*GPIO速率 */   
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
		/*初始化GPIOB*/
		GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure);	
					
}

C Principal

int main(void)
{
    
    	
	LED_GPIO_Config();//配置GPIO	 	  
	GPIO_ResetBits(LED_GPIO_PORT,LED_GPIO_PIN);// 点亮LED
}

Supongo que te gusta

Origin blog.csdn.net/WANGYONGZIXUE/article/details/115045819
Recomendado
Clasificación