STM32——点亮LED

一、点亮LED1

1. 引脚分析

我们查看引脚,LED1对应引脚位PC8,共阳极,需要低电平点亮,高电平熄灭。

PD2为控制锁存器,高电平将PC8~PC15端口状态传送至1Q~8Q;低电平左侧1Q~8Q端口状态锁定。当然,要让PD2高电平,使得LED点亮。

2. CubeMX 配置引脚属性

将PC8和PD2 引脚全部配置为 GPIO_Ouput,初始电平为高电平。

即PC8上电后LED1熄灭,PD2使得芯片两端导通。

3. 编写代码

需要的HAL库函数

配置引脚电平状态

cpp 复制代码
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  assert_param(IS_GPIO_PIN_ACTION(PinState));

  if (PinState != GPIO_PIN_RESET)
  {
    GPIOx->BSRR = (uint32_t)GPIO_Pin;
  }
  else
  {
    GPIOx->BRR = (uint32_t)GPIO_Pin;
  }
}

参数说明:

GPIOx:端口号 GPIOA,GPIOB,GPIOC

GPIO_Pin:引脚号 GPIO_PIN_0,GPIO_PIN_1,GPIO_PIN_2 ...

GPIO_PinState PinState:要配置的状态 GPIO_PIN_SET , GPIO_PIN_RESET

通过写入GPIO端口的BSRR或BRR寄存器,可以快速地设置或复位引脚状态。

反转引脚电平

cpp 复制代码
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
  uint32_t odr;

  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));

  /* get current Output Data Register value */
  odr = GPIOx->ODR;

  /* Set selected pins that were at low level, and reset ones that were high */
  GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin);
}

延时 Delay 毫秒

cpp 复制代码
void HAL_Delay(uint32_t Delay)

主函数

cpp 复制代码
/* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);//点亮LED1

			//HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);//翻转PCB8电平
			//HAL_Delay(1000);//延时1秒
		
  }
  /* USER CODE END 3 */

PC8也就是,GPIOC端口的8号引脚。

编译错误,有可能是编译器的版本问题。

二、控制所有LED

1. CubeMX 配置所有引脚

将PC9~PC15也配置为GPIO_Output,初始化为高电平。

2. 代码编写

查看引脚定义

cpp 复制代码
#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 */

这16个引脚,其实就是相邻的位进行左移得到的。

如果要控制多个LED,那么将多个LED所对应的十六进制数取或即可。

例如要点亮LD1和LD5

cpp 复制代码
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
//0001 0001
uint8_t ucled=0x11;

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	HAL_GPIO_WritePin(GPIOC,ucled<<8,GPIO_PIN_RESET);
  }
  /* USER CODE END 3 */
}

三、引脚冲突

当需要用到 LCD 时,PC8~PC15 就会发生冲突。

需要将 PD2 初始为低电平,使得锁存器两端不导通。

需要 LED 时,再将 PD2 置为高电平,将 PC8~PC15 端口状态传送到 1Q~8Q,再配置为低电平。

cpp 复制代码
void Led_Disp(uint8_t ucled)
{
	 HAL_GPIO_WritePin(GPIOC,0xFF<<8,GPIO_PIN_SET);

	 HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);	// PD2 
	 HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
	 
	 HAL_GPIO_WritePin(GPIOC,ucled<<8,GPIO_PIN_RESET);
	 HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	 HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
相关推荐
广药门徒1 小时前
破产计划:openmv烧写UVC.bin直接让openmv作为电脑免驱动摄像头
stm32·单片机·嵌入式硬件
SuperW2 小时前
舵机、震动传感器、超声波使用代码
单片机·嵌入式硬件
SlientICE3 小时前
ESP-IDF 开发框架:探索ESP32的强大底层世界
网络·stm32·单片机·嵌入式硬件·物联网
solomonzw15 小时前
FreeRTOS入门与工程实践-基于STM32F103(一)(单片机程序设计模式,FreeRTOS源码概述,内存管理,任务管理,同步互斥与通信,队列,信号量)
stm32·单片机·嵌入式硬件
菠萝地亚狂想曲18 小时前
STM32_HAL库提高中断执行效率
stm32·单片机·嵌入式硬件
xu_wenming19 小时前
FlashDB 在嵌入式系统中占用硬件资源
c语言·数据库·驱动开发·嵌入式硬件
努力创造奇迹19 小时前
STM32 HAL库 HC-05蓝牙通信实现
stm32·嵌入式硬件·struts
今天阳光明媚吗19 小时前
STM32HAL库笔记
笔记·stm32
矜辰所致20 小时前
STM32 低功耗模式下 RTC唤醒 和 PA0唤醒 的配合使用
stm32·低功耗·standby·rtc唤醒
傍晚冰川20 小时前
【STM32点灯大师】定时器实现非阻塞式程序-按键控制LED
笔记·stm32·单片机·嵌入式硬件·学习