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);
}
相关推荐
promising-w4 分钟前
【蓝桥杯单片机】客观题
单片机·蓝桥杯
小殷学长1 小时前
【单片机毕业设计14-基于stm32c8t6的智能宠物养护舱系统设计】
stm32·单片机·课程设计
charlie1145141911 小时前
从启动说起到单片机点灯发生了什么上——库层次
单片机·嵌入式硬件·arm汇编·初始化
W说编程2 小时前
在嵌入式Linux中实现高并发TCP服务器:从select到epoll的演进与实战
linux·服务器·c语言·嵌入式硬件·tcp/ip
美好的事情总会发生3 小时前
GMII(Gigabit Media Independent Interface)详解
linux·嵌入式硬件·硬件工程
【云轩】12 小时前
从零开始用STM32驱动DRV8301:无人机/机器人电机控制指南
stm32·机器人·无人机
【云轩】14 小时前
【零基础实战】STM32控制DRV8833电机驱动详解
stm32·单片机·嵌入式硬件
RFID舜识物联网16 小时前
RFID测温技术:电力设备安全监测的新利器
网络·人工智能·嵌入式硬件·物联网·安全
朝颜_祝余17 小时前
模电知识点总结(4)
单片机·嵌入式硬件
日记成书18 小时前
详细介绍STM32(32位单片机)外设应用
stm32·学习