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);
}
相关推荐
piaoyiren12 分钟前
普中A6 STC8A 动态数码管显示讲解
嵌入式硬件·51单片机·c
阿拉斯攀登2 小时前
内核模块开发:module_init 与模块机制详解
linux·网络·嵌入式硬件·linux驱动
ICGOODFIND12 小时前
2026物联网模组选型指南:U-BLOX定位模组+SIMCOM芯讯通主流蜂窝通信模组参数与场景适配
嵌入式硬件·物联网·硬件工程·iot
阿拉斯攀登3 小时前
嵌入式 Linux 驱动概述:分类、内核模块、开发环境
linux·嵌入式硬件·linux内核·嵌入式·linux驱动
2401_854151554 小时前
STM32 位带操作——像 51 一样操作 GPIO
单片机·嵌入式硬件
zlinear数据采集卡13 小时前
从0到1硬核拆解:工业级数据采集卡的隔离设计与Modbus通信实战
arm开发·单片机·嵌入式硬件·fpga开发·开源
FreakStudio18 小时前
WIZnet 开源方案分享:W55MH32 开发板 + 小智 AI实现以太网版本的小智机器人
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
科芯创展18 小时前
XZ61N,N-channel open drain输出电压检测芯片
单片机·嵌入式硬件
省四收割者21 小时前
一文详解信号完整性(3)--规避SI问题的具体实现方法
嵌入式硬件·硬件架构·信号处理·智能硬件·pcb工艺·altium designer