STM32G0学习手册——点亮LED(GPIO用法HAL库)

22 篇文章 33 订阅
15 篇文章 3 订阅

新建CubeMX工程

这片文章中,我们使用芯片自带的HSI时钟,所以不需要配置时钟树,使用默认频率(16MHz),以便理解步骤。

  • 打开SWD调试接口
  • 在引脚视图中,点击PC6,选择"GPIO_Output"。在配置页中选择GPIO-PC6。(LED灯是接到PC6引脚的)

  • 配置引脚属性 

GPIO output level:默认输出电平。Hight和Low

GPIO mode :设置引脚输出模式。有推挽和开漏

GPIO Pull-up/Pull-down:设置上下拉。

Maximum output speed:设置引脚速度。有四个等级。

User Label:设置用户标签。相当于自己命名引脚。比如设置LED6,在MDK软件里LED6_Pin,就是这个引脚。自定义引脚格式为*_Pin。

  • 生成代码后,使用MDK软件工程,在魔术棒-debug选项卡中勾上"Rest and Run"。
  • 在Application/User目录下,打开main.c文件。找到while(1)函数,写入下面两句代码。
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3*/            //在BEGIN与END之间添加代码。重新生成工程就不会删掉
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_6);   //翻转IO引脚
		HAL_Delay(2000);                        //延时2秒
  }
  /* USER CODE END 3 */
  • 编译后,下载烧录到板子中。

有人想我不想有规律的闪动,或者常亮呢,该用什么命令呢?就用到一下命令。

GPIO HAL库函数

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);   //设置引脚函数

  •  GPIO_TypeDef *GPIOx:GPIOA,B,C...
  • uint16_t GPIO_Pin:GPIO_PIN_0~GPIO_PIN15
  • GPIO_PinState PinState:GPIO_PIN_RESET(低电平),GPIO_PIN_SET(高电平)
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_Delay(1000);
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_RESET);    //LED灯会亮两秒钟
		HAL_Delay(2000);
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_SET);      //LED灯会灭一秒钟
  }
  /* USER CODE END 3 */
}

GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);               //读取引脚电平

  •  GPIO_TypeDef *GPIOx:GPIOA,B,C...
  • uint16_t GPIO_Pin:GPIO_PIN_0~GPIO_PIN_15
  • GPIO_PinState返回值:GPIO_PIN_RESET=0代表低电平、GPIO_PIN_SET=1代表高电平

还有其他函数,大家在实际中运用吧。

                       void     HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);         //翻转IO引脚电平
HAL_StatusTypeDef    HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);            //锁定IO引脚电平

开发板链接:https://item.taobao.com/item.htm?ft=t&id=617799679179 

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于STM32G431微控制器的点亮LED灯的示例代码: ```c #include "stm32g4xx_hal.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 点亮LED灯 HAL_Delay(1000); // 延时1秒 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 关闭LED灯 HAL_Delay(1000); // 延时1秒 } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** 配置内部时钟源 */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLM = 1; RCC_OscInitStruct.PLL.PLLN = 10; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** 配置系统时钟 */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /** 配置GPIOA的引脚5为输出模式 */ __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } void Error_Handler(void) { __disable_irq(); while (1) { } } ``` 该示例代码将GPIOA的引脚5配置为输出模式,并在主循环中交替点亮和关闭LED灯。在主循环中使用HAL_Delay函数进行延时,以便肉眼可见的观察LED灯的闪烁效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值