嵌入式赛道主控为STM32G431RBT6,实验开发板为国信长天的CT117E-M4,STM32CubeMX 是用于 32 位 ARM Cortex STM32微控制器的图形工具。

一.LED指示灯介绍

该开发板上LED并非与芯片引脚直接相连,而是通过锁存器SN74HC573ADWR连在一起的,芯片PD2口与锁存器LE使能端相连,PC8-PC15分别与LD1-LD8对应相连。

当锁存使能(LE)输入为高电平时,Q 输出响应数据(D)输入,锁存器处于透明模式,输出会随输入数据的变化而变化;当 LE 为低电平时,锁存器将存储 D 输入上的信息,输出保持不变,直到下一次 LE 变为高电平。

由电路图可知,LED阳极接高电平,阴极接芯片引脚。当芯片引脚置低电平时,LED两端构成通路,被点亮;当芯片引脚置高电平时,LED两端均为高电平,两端无法构成通路,LED熄灭。

二.STM32CubeMX中配置

Step1:从MCU创建工程

Step2:选择芯片型号STM32G431RBT6并开始工程

Step3:配置RCC

Step4:配置SYS

Step5:配置GPIO

Step6:配置时钟

Step7:配置工程

Step7:配置Code Generator,并生成项目

二.Keil配置

Step1

Step2

三.相关函数介绍

1.相关函数所在位置

2.常用函数介绍

·写电平函数

HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
/**
  * @brief  设置或清除选定的数据端口位。
  *
  * @note   此函数使用 GPIOx_BSRR 和 GPIOx_BRR 寄存器来实现原子的读/修改访问。
  *         这样一来,在读取和修改访问之间就不会有中断请求(IRQ)发生的风险。
  *
  * @param  GPIOx:其中 x 可以是 (A..G),用于为 STM32G4xx 系列选择 GPIO 外设。
  * @param  GPIO_Pin:指定要写入的端口位。
  *         该参数可以是 GPIO_PIN_x 的任意组合,其中 x 可以是 (0..15)。
  * @param  PinState:指定要写入到选定端口位的值。
  *         该参数可以是 GPIO_PinState 枚举类型的值之一:
  *            @arg GPIO_PIN_RESET:清除端口引脚
  *            @arg GPIO_PIN_SET:设置端口引脚
  * @retval 无
  */
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;
  }
}

使用示例:

HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);
//将GPIOC组的PIN8脚设置为低电平

·读电平函数

HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
/**
  * @brief  读取指定的输入端口引脚。
  * @param  GPIOx:其中 x 可以是 (A..G),用于为 STM32G4xx 系列选择 GPIO 外设。
  * @param  GPIO_Pin:指定要读取的端口位。
  *         该参数可以是 GPIO_PIN_x 的任意组合,其中 x 可以是 (0..15)。
  * @retval 输入端口引脚的值。
  */
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
  GPIO_PinState bitstatus;

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

  if ((GPIOx->IDR & GPIO_Pin) != 0x00U)
  {
    bitstatus = GPIO_PIN_SET;
  }
  else
  {
    bitstatus = GPIO_PIN_RESET;
  }
  return bitstatus;
}

使用示例:

 HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_8);
//读取GPIOC组的PIN8引脚的电平状态

·反转电平函数

HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
/**
  * @brief  翻转指定的 GPIO 引脚。
  * @param  GPIOx:其中 x 可以是 (A..G),用于为 STM32G4xx 系列选择 GPIO 外设。
  * @param  GPIO_Pin:指定要翻转的引脚。
  *         该参数可以是 GPIO_PIN_x 的任意组合,其中 x 可以是 (0..15)。
  * @retval 无
  */
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);
}

使用示例:

HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_11);
//反转GPIOC组PIN11的电平状态

四.代码实现

1.将GPIODPIN2引脚置高电平,使能锁存器(这样才能操作LED);

2.将GPIOCPIN8,9引脚置低电平,即点亮LED1,LED2;

2.使GPIOCPIN11闪烁。

...
...
...
  /* USER CODE BEGIN 2 */
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//将GPIODPIN2引脚置高电平,使能锁存器
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);//将GPIOCPIN8引脚置低电平,即点亮LED1
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);//将GPIOCPIN9引脚置低电平,即点亮LED2
	HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_11);//将GPIOCPIN11引脚反转,即使GPIOCPIN11引脚闪烁
	HAL_Delay(500);//延时函数,延时500ms		
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
...
...
...

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐