STM32——利用STM32CubeMX来点亮GPIO口的led

GPIO口的 LED 点亮(以STM32F407IGTb芯片为例 )

  • 1、掌握的GPIO口的使用方法

  • 2、熟悉Keil uVision5工具软件的使用

    原理:
    只要是对硬件操作,就要首先查看原理图。
    查看外设是给模块的MCU的哪个引脚相连。
    FS-STM32F407开发平台上的LED的亮灭状态,与芯片上的引脚I/O输出电平有关。
    FS-STM32F407开发平台上LED的I/O扩展:

STM32——利用STM32CubeMX来点亮GPIO口的led_第1张图片

IO操作重要结构体:GPIO_InitTypeDef

typedef struct
{
    uint32_t Pin;               操作的管脚
	uint32_t Mode;   			模式选择
	uint32_t Pull;     			上拉下拉,或者都不加
	uint32_t Speed;    			速度选择
	uint32_t Alternate; 		管脚复用模式
} GPIO_InitTypeDef;

1、Mode

  • 输入(复位状态)/input(reset state)
  • 通用输出模式 / general purpose output mode
  • 复用功能模式 / alternate function mode
  • 模拟模式 / analog mode
 #define  GPIO_MODE_INPUT       ((uint32_t)0x00000000)   /*!< Input Floating Mode */
 #define  GPIO_MODE_OUTPUT_PP  	((uint32_t)0x00000001)   /*!< Output Push Pull Mode*/
 #define  GPIO_MODE_OUTPUT_OD   ((uint32_t)0x00000011)   /*!< Output Open Drain Mode*/
 #define  GPIO_MODE_AF_PP   	((uint32_t)0x00000002)   /*!< Alternate Function Push Pull Mode*/
 #define  GPIO_MODE_AF_OD    	((uint32_t)0x00000012)   /*!< Alternate Function Open Drain Mode*/

2、Speed

为了降低STM32处理器的功耗,可以依据实际的需求,选择合适的时钟速率,GPIO口支持的最大时钟速率越低,它产生的功耗也越低。

#define  GPIO_SPEED_LOW                           GPIO_SPEED_FREQ_LOW
#define  GPIO_SPEED_MEDIUM                        GPIO_SPEED_FREQ_MEDIUM
#define  GPIO_SPEED_FAST                          GPIO_SPEED_FREQ_HIGH
#define  GPIO_SPEED_HIGH                          GPIO_SPEED_FREQ_VERY_HIGH

3、初始化GPIO的代码

void MX_GPIO_Init(void)
{
 	 GPIO_InitTypeDef GPIO_InitStruct;
 
  __HAL_RCC_GPIOF_CLK_ENABLE();

  	GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9  |GPIO_PIN_10;
  	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  	GPIO_InitStruct.Pull = GPIO_NOPULL;
  	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  	HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
	
  	HAL_GPIO_WritePin(GPIOF,GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_SET);
}

调用的HAL函数解析: void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx , uint16_t GPIO_Pin, GPIO_PinState PinState);
该函数其实是对BSRR 寄存器进行操作,第一个参数传的是GPIO所在的组,第二个是操作第几个管脚,第三个是对管脚进行置位。

利用STM32CubeMX来架构程序

1、打开STM32CubeMX选择芯片
STM32——利用STM32CubeMX来点亮GPIO口的led_第2张图片
2、对管脚进行配置
STM32——利用STM32CubeMX来点亮GPIO口的led_第3张图片
3、点击CONFIGURATION
STM32——利用STM32CubeMX来点亮GPIO口的led_第4张图片
4、点击生成工程按钮
STM32——利用STM32CubeMX来点亮GPIO口的led_第5张图片

源代码:

(仅需要用户添加的代码)

/* USER CODE BEGIN 0 */
#define led1_port GPIOF
#define led1_pin 	GPIO_PIN_7
#define led2_port GPIOF
#define led2_pin 	GPIO_PIN_8
#define led3_port GPIOF
#define led3_pin 	GPIO_PIN_9
#define led4_port GPIOF
#define led4_pin 	GPIO_PIN_10

#define set_high(p,i) 	{p->BSRR = i;}					    //给高电平 熄灭
#define set_low(p,i) 	{p->BSRR = (uint32_t)i << 16U;}		//给低电平 点亮

#define led1_off 	set_high(led1_port,led1_pin)
#define led1_no 	set_low(led1_port,led1_pin)
#define led2_off 	set_high(led2_port,led2_pin)
#define led2_no 	set_low(led2_port,led2_pin)
#define led3_off 	set_high(led3_port,led3_pin)
#define led3_no 	set_low(led3_port,led3_pin)
#define led4_off 	set_high(led4_port,led4_pin)
#define led4_no 	set_low(led4_port,led4_pin)

void led_1234(void);
/* USER CODE END 0 */
.
.
.
/* USER CODE BEGIN 3 */
		led_1234();--------------------main函数中调用
  /* USER CODE END 3 */
  .
  .
  .
/* USER CODE BEGIN 4 */
void led_1234(void)
{
	led1_no;				//led1打开
	HAL_Delay(1000);		//延时1秒
	led1_off;				//led1关闭
	HAL_Delay(1000);		//延时1秒

	led2_no;				//led2打开
	HAL_Delay(1000);		//延时1秒
	led2_off;				//led2关闭
	HAL_Delay(1000);		//延时1秒
	
	led3_no;				//led3打开
	HAL_Delay(1000);		//延时1秒
	led3_off;				//led3关闭
	HAL_Delay(1000);		//延时1秒

	led4_no;				//led4打开
	HAL_Delay(1000);		//延时1秒
	led4_off;				//led4关闭
	HAL_Delay(1000);		//延时1秒
}
/* USER CODE END 4 */

编程要点:
1.使能GPIO端口时钟
2.初始化GPIO目标引脚为推挽输出
3.控制GPIO引脚输出高低电平

你可能感兴趣的:(STM32单片机)