STMicroelectronics 系列:STM32G0 系列_(1).STM32G0系列概述
STM32G0系列概述
1. 引言
STM32G0系列是STMicroelectronics推出的一款高性能、低功耗的32位微控制器系列。该系列基于Arm Cortex-M0+内核,提供了丰富的外设和强大的处理能力,适用于各种嵌入式应用,如消费电子、工业控制、智能家居等。本节将详细介绍STM32G0系列的基本特性、应用场景以及开发环境的搭建。

2. 基本特性
2.1 内核架构
STM32G0系列采用Arm Cortex-M0+内核,这是一种32位RISC架构,具有以下特点:
低功耗:Cortex-M0+内核在保持高性能的同时,功耗非常低,适合电池供电的设备。
高性能:虽然功耗低,但Cortex-M0+内核的处理能力仍然非常强大,能够运行复杂的嵌入式软件。
简单易用:Cortex-M0+内核的指令集简单且易于编程,适合初学者和经验丰富的开发者。
2.2 外设支持
STM32G0系列提供了丰富的外设支持,包括但不限于:
GPIO(通用输入输出):用于控制外部设备的输入和输出。
USART(通用同步异步收发传输器):用于串行通信,支持异步和同步模式。
SPI(串行外设接口):用于高速同步通信。
I2C(两线接口):用于低速同步通信。
ADC(模数转换器):用于将模拟信号转换为数字信号。
DAC(数模转换器):用于将数字信号转换为模拟信号。
RTC(实时时钟):用于提供精确的时间基准。
TIM(定时器):用于生成定时脉冲和捕获外部信号。
2.3 内存和存储
闪存:STM32G0系列提供128KB到512KB的闪存存储空间,用于存储程序代码。
SRAM:提供32KB到128KB的SRAM,用于数据存储和运行时变量。
EEPROM:部分型号支持内置EEPROM,用于存储非易失性数据。
2.4 电源管理
低功耗模式:支持多种低功耗模式,如睡眠模式、停止模式和待机模式,以延长电池寿命。
电源管理单元:内置电源管理单元,支持多种电源电压范围,确保在不同供电条件下稳定运行。
3. 应用场景
3.1 消费电子
智能家居:STM32G0系列可以用于智能灯泡、智能插座等设备,实现远程控制和自动化管理。
可穿戴设备:低功耗特性使其适合用于智能手环、智能手表等设备,提供长时间的电池续航。
3.2 工业控制
传感器节点:用于工业传感器节点,收集和处理各种传感器数据,如温度、湿度、压力等。
电机控制:支持多种定时器和PWM输出,适用于电机控制和驱动。
3.3 通信设备
无线模块:STM32G0系列可以与各种无线通信模块(如Wi-Fi、蓝牙)结合,实现无线数据传输。
有线通信:支持多种有线通信协议,如UART、SPI、I2C,适用于有线通信设备。
4. 开发环境搭建
4.1 硬件工具
STM32 Nucleo开发板:STMicroelectronics官方提供的开发板,集成了STM32G0系列微控制器,支持多种扩展板。
ST-Link调试器:用于下载程序和调试,支持SWD和JTAG接口。
4.2 软件工具
STM32CubeIDE:STMicroelectronics官方的集成开发环境,支持项目创建、代码编写、编译和调试。
STM32CubeMX:用于配置微控制器的外设和生成初始化代码,简化开发流程。
4.3 环境配置
4.3.1 安装STM32CubeIDE
-
访问STMicroelectronics官方网站,下载并安装STM32CubeIDE。
-
启动STM32CubeIDE,确保安装成功。
4.3.2 配置STM32CubeMX
-
下载并安装STM32CubeMX。
-
打开STM32CubeMX,选择STM32G0系列的微控制器。
-
配置所需的外设,如GPIO、USART、SPI等。
-
生成初始化代码,选择生成语言(C或C++)和编译器(如GCC)。
-
将生成的代码导入STM32CubeIDE中。
4.4 示例项目
4.4.1 GPIO控制LED
本示例将展示如何使用STM32G0系列微控制器通过GPIO控制一个LED的亮灭。
硬件连接
将LED的正极连接到STM32G0开发板的PA5引脚。
将LED的负极连接到地线(GND)。
代码示例
#include "stm32g0xx_hal.h"
// 定义LED使用的GPIO引脚
#define LED_PIN GPIO_PIN_5
#define LED_PORT GPIOA
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
// 初始化HAL库
HAL_Init();
// 配置系统时钟
SystemClock_Config();
// 初始化GPIO
MX_GPIO_Init();
while (1)
{
// 点亮LED
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);
// 延时500ms
HAL_Delay(500);
// 熄灭LED
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET);
// 延时500ms
HAL_Delay(500);
}
}
void SystemClock_Config(void)
{
// 配置系统时钟,这里使用默认的8MHz HSI振荡器
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// 初始化振荡器
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscInit(&RCC_OscInitStruct) != HAL_OK)
{
// 初始化失败
Error_Handler();
}
// 初始化时钟
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
// 时钟配置失败
Error_Handler();
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 启用GPIOA时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置PA5为输出模式
GPIO_InitStruct.Pin = LED_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);
}
void Error_Handler(void)
{
// 错误处理函数
while (1)
{
// 进入死循环
}
}
代码说明
-
包含头文件:
#include "stm32g0xx_hal.h"包含了STM32G0系列的HAL库头文件。 -
定义LED引脚:通过宏定义指定LED使用的GPIO引脚。
-
初始化HAL库:
HAL_Init()初始化HAL库,设置中断优先级分组和系统服务。 -
配置系统时钟:
SystemClock_Config()配置系统时钟,使用默认的8MHz HSI振荡器。 -
初始化GPIO:
MX_GPIO_Init()配置PA5引脚为输出模式。 -
主循环:在主循环中,使用
HAL_GPIO_WritePin()控制LED的亮灭,并使用HAL_Delay()实现500ms的延时。
4.4.2 USART串行通信
本示例将展示如何使用STM32G0系列微控制器通过USART实现串行通信。
硬件连接
将USART1的TX引脚连接到调试器的RX引脚。
将USART1的RX引脚连接到调试器的TX引脚。
代码示例
#include "stm32g0xx_hal.h"
// 定义USART1
#define USART1_CLK_ENABLE() __HAL_RCC_USART1_CLK_ENABLE()
#define USART1_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define USART1_TX_PIN GPIO_PIN_9
#define USART1_RX_PIN GPIO_PIN_10
#define USART1_TX_GPIO_PORT GPIOA
#define USART1_RX_GPIO_PORT GPIOA
#define USART1_TX_GPIO_AF GPIO_AF7_USART1
#define USART1_RX_GPIO_AF GPIO_AF7_USART1
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
int main(void)
{
// 初始化HAL库
HAL_Init();
// 配置系统时钟
SystemClock_Config();
// 初始化GPIO
MX_GPIO_Init();
// 初始化USART1
MX_USART1_UART_Init();
while (1)
{
// 发送字符串
char *message = "Hello, STM32G0!";
HAL_UART_Transmit(&huart1, (uint8_t *)message, strlen(message), HAL_MAX_DELAY);
// 延时1000ms
HAL_Delay(1000);
}
}
void SystemClock_Config(void)
{
// 配置系统时钟,这里使用默认的8MHz HSI振荡器
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// 初始化振荡器
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscInit(&RCC_OscInitStruct) != HAL_OK)
{
// 初始化失败
Error_Handler();
}
// 初始化时钟
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
// 时钟配置失败
Error_Handler();
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 启用GPIOA时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置PA9为USART1的TX引脚
GPIO_InitStruct.Pin = USART1_TX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = USART1_TX_GPIO_AF;
HAL_GPIO_Init(USART1_TX_GPIO_PORT, &GPIO_InitStruct);
// 配置PA10为USART1的RX引脚
GPIO_InitStruct.Pin = USART1_RX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = USART1_RX_GPIO_AF;
HAL_GPIO_Init(USART1_RX_GPIO_PORT, &GPIO_InitStruct);
}
static void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
// 初始化失败
Error_Handler();
}
}
void Error_Handler(void)
{
// 错误处理函数
while (1)
{
// 进入死循环
}
}
代码说明
-
包含头文件:
#include "stm32g0xx_hal.h"包含了STM32G0系列的HAL库头文件。 -
定义USART1引脚:通过宏定义指定USART1的TX和RX引脚。
-
初始化HAL库:
HAL_Init()初始化HAL库,设置中断优先级分组和系统服务。 -
配置系统时钟:
SystemClock_Config()配置系统时钟,使用默认的8MHz HSI振荡器。 -
初始化GPIO:
MX_GPIO_Init()配置PA9和PA10引脚为USART1的TX和RX引脚。 -
初始化USART1:
MX_USART1_UART_Init()配置USART1的波特率、数据位、停止位、校验位等参数。 -
主循环:在主循环中,使用
HAL_UART_Transmit()发送字符串,并使用HAL_Delay()实现1000ms的延时。
5. 性能测试
5.1 GPIO性能测试
5.1.1 测试环境
硬件:STM32G0开发板
软件:STM32CubeIDE
测试目标:测量GPIO引脚的切换速度
5.1.2 测试代码
#include "stm32g0xx_hal.h"
// 定义LED使用的GPIO引脚
#define LED_PIN GPIO_PIN_5
#define LED_PORT GPIOA
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
// 初始化HAL库
HAL_Init();
// 配置系统时钟
SystemClock_Config();
// 初始化GPIO
MX_GPIO_Init();
while (1)
{
// 点亮LED
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);
// 熄灭LED
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET);
}
}
void SystemClock_Config(void)
{
// 配置系统时钟,这里使用默认的8MHz HSI振荡器
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// 初始化振荡器
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscInit(&RCC_OscInitStruct) != HAL_OK)
{
// 初始化失败
Error_Handler();
}
// 初始化时钟
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
// 时钟配置失败
Error_Handler();
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 启用GPIOA时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置PA5为输出模式
GPIO_InitStruct.Pin = LED_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);
}
void Error_Handler(void)
{
// 错误处理函数
while (1)
{
// 进入死循环
}
}
代码说明
-
包含头文件:
#include "stm32g0xx_hal.h"包含了STM32G0系列的HAL库头文件。 -
定义LED引脚:通过宏定义指定LED使用的GPIO引脚。
-
初始化HAL库:
HAL_Init()初始化HAL库,设置中断优先级分组和系统服务。 -
配置系统时钟:
SystemClock_Config()配置系统时钟,使用默认的8MHz HSI振荡器。 -
初始化GPIO:
MX_GPIO_Init()配置PA5引脚为输出模式,并设置为高速模式。 -
主循环:在主循环中,快速切换LED的亮灭状态,以测试GPIO的性能。
5.2 ADC性能测试
5.2.1 测试环境
硬件:STM32G0开发板,连接一个模拟信号源(如电位器)
软件:STM32CubeIDE
测试目标:测量ADC的采样速度和精度
5.2.2 测试代码
#include "stm32g0xx_hal.h"
// 定义ADC使用的引脚
#define ADC_PIN GPIO_PIN_0
#define ADC_PORT GPIOA
#define ADC_CHANNEL ADC_CHANNEL_0
ADC_HandleTypeDef hadc;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC_Init(void);
int main(void)
{
// 初始化HAL库
HAL_Init();
// 配置系统时钟
SystemClock_Config();
// 初始化GPIO
MX_GPIO_Init();
// 初始化ADC
MX_ADC_Init();
while (1)
{
// 开始ADC采样
if (HAL_ADC_Start(&hadc) != HAL_OK)
{
// 采样启动失败
Error_Handler();
}
// 等待ADC采样完成
if (HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY) != HAL_OK)
{
// 采样完成失败
Error_Handler();
}
// 读取ADC值
uint32_t adc_value = HAL_ADC_GetValue(&hadc);
// 处理ADC值
// 例如,可以通过USART发送ADC值,或控制其他外设
// 为了简化示例,这里仅打印ADC值
__IO uint32_t *p = (uint32_t *)0xE000EDF8; // DWT控制寄存器
*p = 1; // 启用DWT
p = (uint32_t *)0xE000ED34; // DWT循环计数器
*p = 0; // 重置计数器
p = (uint32_t *)0xE000ED38; // DWT周期计数器
*p = 0; // 重置周期计数器
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET); // 点亮LED
HAL_Delay(100); // 延时100ms
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET); // 熄灭LED
uint32_t cycles = *(__IO uint32_t *)0xE000ED34; // 读取循环计数器
uint32_t ticks = *(__IO uint32_t *)0xE000ED38; // 读取周期计数器
// 打印采样次数和周期
char buffer[50];
sprintf(buffer, "ADC Value: %lu, Cycles: %lu, Ticks: %lu\r\n", adc_value, cycles, ticks);
HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY);
// 延时1000ms
HAL_Delay(1000);
}
}
void SystemClock_Config(void)
{
// 配置系统时钟,这里使用默认的8MHz HSI振荡器
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// 初始化振荡器
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscInit(&RCC_OscInitStruct) != HAL_OK)
{
// 初始化失败
Error_Handler();
}
// 初始化时钟
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
// 时钟配置失败
Error_Handler();
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 启用GPIOA时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置PA5为输出模式
GPIO_InitStruct.Pin = LED_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);
// 配置PA0为模拟输入模式
GPIO_InitStruct.Pin = ADC_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(ADC_PORT, &GPIO_InitStruct);
}
static void MX_ADC_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
// 配置ADC
hadc.Instance = ADC1;
hadc.Init.ScanConvMode = DISABLE;
hadc.Init.ContinuousConvMode = DISABLE;
hadc.Init.DiscontConvMode = DISABLE;
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc) != HAL_OK)
{
// 初始化失败
Error_Handler();
}
// 配置ADC通道
sConfig.Channel = ADC_CHANNEL;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES;
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
{
// 通道配置失败
Error_Handler();
}
}
void Error_Handler(void)
{
// 错误处理函数
while (1)
{
// 进入死循环
}
}
代码说明
-
包含头文件:
#include "stm32g0xx_hal.h"包含了STM32G0系列的HAL库头文件。 -
定义ADC引脚:通过宏定义指定ADC使用的GPIO引脚。
-
初始化HAL库:
HAL_Init()初始化HAL库,设置中断优先级分组和系统服务。 -
配置系统时钟:
SystemClock_Config()配置系统时钟,使用默认的8MHz HSI振荡器。 -
初始化GPIO:
MX_GPIO_Init()配置PA5引脚为输出模式,PA0引脚为模拟输入模式。 -
初始化ADC:
MX_ADC_Init()配置ADC1的参数,包括扫描模式、连续转换模式、外部触发转换等。 -
主循环:
-
启动ADC采样:
HAL_ADC_Start(&hadc). -
等待ADC采样完成:
HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY). -
读取ADC值:
HAL_ADC_GetValue(&hadc). -
使用DWT(Data Watchpoint and Trace)模块测量采样时间和周期。
-
点亮和熄灭LED,以模拟实际应用中的操作。
-
通过USART发送ADC值和采样时间信息。
5.3 低功耗模式测试
5.3.1 测试环境
硬件:STM32G0开发板,连接一个外部唤醒源(如按钮)
软件:STM32CubeIDE
测试目标:测量STM32G0系列在不同低功耗模式下的功耗
5.3.2 测试代码
#include "stm32g0xx_hal.h"
// 定义LED和按钮使用的GPIO引脚
#define LED_PIN GPIO_PIN_5
#define LED_PORT GPIOA
#define BUTTON_PIN GPIO_PIN_0
#define BUTTON_PORT GPIOA
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void EnterLowPowerMode(void);
int main(void)
{
// 初始化HAL库
HAL_Init();
// 配置系统时钟
SystemClock_Config();
// 初始化GPIO
MX_GPIO_Init();
while (1)
{
// 点亮LED
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);
// 检查按钮是否按下
if (HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN) == GPIO_PIN_RESET)
{
// 按下按钮,进入低功耗模式
EnterLowPowerMode();
}
// 延时1000ms
HAL_Delay(1000);
}
}
void SystemClock_Config(void)
{
// 配置系统时钟,这里使用默认的8MHz HSI振荡器
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// 初始化振荡器
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscInit(&RCC_OscInitStruct) != HAL_OK)
{
// 初始化失败
Error_Handler();
}
// 初始化时钟
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
// 时钟配置失败
Error_Handler();
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 启用GPIOA时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置PA5为输出模式
GPIO_InitStruct.Pin = LED_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);
// 配置PA0为输入模式
GPIO_InitStruct.Pin = BUTTON_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);
}
static void EnterLowPowerMode(void)
{
// 进入停止模式
HAL_SuspendTick(); // 暂停SysTick中断
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); // 清除唤醒标志
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 进入停止模式
// 恢复SysTick中断
HAL_ResumeTick();
}
void Error_Handler(void)
{
// 错误处理函数
while (1)
{
// 进入死循环
}
}
代码说明
-
包含头文件:
#include "stm32g0xx_hal.h"包含了STM32G0系列的HAL库头文件。 -
定义LED和按钮引脚:通过宏定义指定LED和按钮使用的GPIO引脚。
-
初始化HAL库:
HAL_Init()初始化HAL库,设置中断优先级分组和系统服务。 -
配置系统时钟:
SystemClock_Config()配置系统时钟,使用默认的8MHz HSI振荡器。 -
初始化GPIO:
MX_GPIO_Init()配置PA5引脚为输出模式,PA0引脚为输入模式。 -
主循环:
-
点亮LED。
-
检查按钮是否按下,如果按下则进入低功耗模式。
-
使用
HAL_Delay()实现1000ms的延时。 -
进入低功耗模式:
-
暂停SysTick中断:
HAL_SuspendTick(). -
清除唤醒标志:
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU). -
进入停止模式:
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI). -
恢复SysTick中断:
HAL_ResumeTick().
6. 总结
STM32G0系列微控制器凭借其低功耗、高性能和丰富的外设,适用于多种嵌入式应用场景。通过本篇文档,我们详细介绍了STM32G0系列的基本特性、应用场景以及开发环境的搭建。此外,还提供了GPIO控制LED、USART串行通信和低功耗模式测试的示例代码,帮助开发者快速上手并进行实际应用的开发。希望这些内容能对您的开发工作有所帮助。
作者:kkchenkx