一、点亮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);
}