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);
}
相关推荐
Aczone2828 分钟前
硬件(五) 存储、ARM 架构与指令系统
arm开发·嵌入式硬件·架构
LS·Cui1 小时前
单片机按键示例功能
单片机
【ql君】qlexcel1 小时前
MCU上电到运行的全过程
单片机·嵌入式硬件·mcu·启动过程
搞一搞汽车电子1 小时前
S32K3平台eMIOS 应用说明
开发语言·驱动开发·笔记·单片机·嵌入式硬件·汽车
pQAQqa2 小时前
FreeRTOS项目(2)摇杆按键检测
stm32·单片机·嵌入式硬件·freertos
小莞尔3 小时前
【51单片机】【protues仿真】基于51单片机停车场的车位管理系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
一川月白7094 小时前
51单片机---硬件学习(跑马灯、数码管、外部中断、按键、蜂鸣器)
单片机·学习·51单片机·外部中断·蜂鸣器·数码管·跑马灯
月阳羊4 小时前
【硬件-笔试面试题-69】硬件/电子工程师,笔试面试题(知识点:电机驱动电路的反馈电路)
java·经验分享·嵌入式硬件·面试
weixin_468466857 小时前
树莓派32位与64位系统安装teamviewer远程软件
linux·单片机·自动化·树莓派·远程控制·vnc·teamviewer
沐欣工作室_lvyiyi7 小时前
2025-2026单片机物联网毕业设计题目推荐(定稿付款)
单片机·物联网·课程设计