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
    1. 访问STMicroelectronics官方网站,下载并安装STM32CubeIDE。

    2. 启动STM32CubeIDE,确保安装成功。

    4.3.2 配置STM32CubeMX
    1. 下载并安装STM32CubeMX。

    2. 打开STM32CubeMX,选择STM32G0系列的微控制器。

    3. 配置所需的外设,如GPIO、USART、SPI等。

    4. 生成初始化代码,选择生成语言(C或C++)和编译器(如GCC)。

    5. 将生成的代码导入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)
    
        {
    
            // 进入死循环
    
        }
    
    }
    
    
    代码说明
    1. 包含头文件#include "stm32g0xx_hal.h" 包含了STM32G0系列的HAL库头文件。

    2. 定义LED引脚:通过宏定义指定LED使用的GPIO引脚。

    3. 初始化HAL库HAL_Init() 初始化HAL库,设置中断优先级分组和系统服务。

    4. 配置系统时钟SystemClock_Config() 配置系统时钟,使用默认的8MHz HSI振荡器。

    5. 初始化GPIOMX_GPIO_Init() 配置PA5引脚为输出模式。

    6. 主循环:在主循环中,使用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)
    
        {
    
            // 进入死循环
    
        }
    
    }
    
    
    代码说明
    1. 包含头文件#include "stm32g0xx_hal.h" 包含了STM32G0系列的HAL库头文件。

    2. 定义USART1引脚:通过宏定义指定USART1的TX和RX引脚。

    3. 初始化HAL库HAL_Init() 初始化HAL库,设置中断优先级分组和系统服务。

    4. 配置系统时钟SystemClock_Config() 配置系统时钟,使用默认的8MHz HSI振荡器。

    5. 初始化GPIOMX_GPIO_Init() 配置PA9和PA10引脚为USART1的TX和RX引脚。

    6. 初始化USART1MX_USART1_UART_Init() 配置USART1的波特率、数据位、停止位、校验位等参数。

    7. 主循环:在主循环中,使用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)
    
        {
    
            // 进入死循环
    
        }
    
    }
    
    
    代码说明
    1. 包含头文件#include "stm32g0xx_hal.h" 包含了STM32G0系列的HAL库头文件。

    2. 定义LED引脚:通过宏定义指定LED使用的GPIO引脚。

    3. 初始化HAL库HAL_Init() 初始化HAL库,设置中断优先级分组和系统服务。

    4. 配置系统时钟SystemClock_Config() 配置系统时钟,使用默认的8MHz HSI振荡器。

    5. 初始化GPIOMX_GPIO_Init() 配置PA5引脚为输出模式,并设置为高速模式。

    6. 主循环:在主循环中,快速切换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)
    
        {
    
            // 进入死循环
    
        }
    
    }
    
    
    代码说明
    1. 包含头文件#include "stm32g0xx_hal.h" 包含了STM32G0系列的HAL库头文件。

    2. 定义ADC引脚:通过宏定义指定ADC使用的GPIO引脚。

    3. 初始化HAL库HAL_Init() 初始化HAL库,设置中断优先级分组和系统服务。

    4. 配置系统时钟SystemClock_Config() 配置系统时钟,使用默认的8MHz HSI振荡器。

    5. 初始化GPIOMX_GPIO_Init() 配置PA5引脚为输出模式,PA0引脚为模拟输入模式。

    6. 初始化ADCMX_ADC_Init() 配置ADC1的参数,包括扫描模式、连续转换模式、外部触发转换等。

    7. 主循环

    8. 启动ADC采样:HAL_ADC_Start(&hadc).

    9. 等待ADC采样完成:HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY).

    10. 读取ADC值:HAL_ADC_GetValue(&hadc).

    11. 使用DWT(Data Watchpoint and Trace)模块测量采样时间和周期。

    12. 点亮和熄灭LED,以模拟实际应用中的操作。

    13. 通过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)
    
        {
    
            // 进入死循环
    
        }
    
    }
    
    
    代码说明
    1. 包含头文件#include "stm32g0xx_hal.h" 包含了STM32G0系列的HAL库头文件。

    2. 定义LED和按钮引脚:通过宏定义指定LED和按钮使用的GPIO引脚。

    3. 初始化HAL库HAL_Init() 初始化HAL库,设置中断优先级分组和系统服务。

    4. 配置系统时钟SystemClock_Config() 配置系统时钟,使用默认的8MHz HSI振荡器。

    5. 初始化GPIOMX_GPIO_Init() 配置PA5引脚为输出模式,PA0引脚为输入模式。

    6. 主循环

    7. 点亮LED。

    8. 检查按钮是否按下,如果按下则进入低功耗模式。

    9. 使用HAL_Delay() 实现1000ms的延时。

    10. 进入低功耗模式

    11. 暂停SysTick中断:HAL_SuspendTick().

    12. 清除唤醒标志:__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU).

    13. 进入停止模式:HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI).

    14. 恢复SysTick中断:HAL_ResumeTick().

    6. 总结

    STM32G0系列微控制器凭借其低功耗、高性能和丰富的外设,适用于多种嵌入式应用场景。通过本篇文档,我们详细介绍了STM32G0系列的基本特性、应用场景以及开发环境的搭建。此外,还提供了GPIO控制LED、USART串行通信和低功耗模式测试的示例代码,帮助开发者快速上手并进行实际应用的开发。希望这些内容能对您的开发工作有所帮助。

    作者:kkchenkx

    物联沃分享整理
    物联沃-IOTWORD物联网 » STMicroelectronics 系列:STM32G0 系列_(1).STM32G0系列概述

    发表回复