打印
[STM32G4]

深入解析 STM32G431 微控制器及其应用开发

[复制链接]
151|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
万图|  楼主 | 2024-12-13 07:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32G431 是 STMicroelectronics 推出的一款性能优越的微控制器,凭借其高效的内核、丰富的外设以及低功耗特点,被广泛应用于工业自动化、电机控制和物联网等领域。本文将详细介绍 STM32G431 的核心特性,并通过示例代码展示如何进行基本的 GPIO 配置和 PWM 控制。
STM32G431 的主要特性STM32G431 基于 Arm Cortex-M4 内核,主频高达 170 MHz,同时支持浮点运算 (FPU) 和 DSP 指令。这使其非常适合实时控制和数字信号处理应用。以下是它的一些关键参数:
  • 内存:最高 512 KB 的 Flash 和 128 KB 的 SRAM
  • 电源管理:支持 1.8V 至 3.6V 的电压输入
  • 丰富外设:包含 ADC、DAC、UART、SPI、I2C、CAN 等接口
  • 高精度定时器:集成高级控制定时器 (HRTIM) 和多种标准定时器
实例代码:GPIO 基本配置下面的代码展示了如何在 STM32G431 上配置一个 GPIO 引脚为输出模式,并通过循环点亮和熄灭一个 LED:
#include "stm32g4xx.h"

void SystemClock_Config(void);
void GPIO_Init(void);

int main(void) {
    HAL_Init();
    SystemClock_Config();
    GPIO_Init();

    while (1) {
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); // 切换 GPIO 状态
        HAL_Delay(500); // 延迟 500ms
    }
}

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.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
    RCC_OscInitStruct.PLL.PLLM = 1;
    RCC_OscInitStruct.PLL.PLLN = 8;
    RCC_OscInitStruct.PLL.PLLR = 2;
    HAL_RCC_OscConfig(&RCC_OscInitStruct);

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
}

void GPIO_Init(void) {
    __HAL_RCC_GPIOB_CLK_ENABLE(); // 启用 GPIOB 时钟

    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
实例代码:PWM 控制在许多应用中,例如电机控制和 LED 调光,PWM 信号是一个关键功能。以下代码展示了如何通过 STM32G431 的定时器生成一个 PWM 信号:
#include "stm32g4xx.h"

void SystemClock_Config(void);
void PWM_Init(void);

int main(void) {
    HAL_Init();
    SystemClock_Config();
    PWM_Init();

    while (1) {
        // 可通过 HAL_TIM_PWM_Start/Stop 控制 PWM 的启动和停止
    }
}

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.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
    RCC_OscInitStruct.PLL.PLLM = 1;
    RCC_OscInitStruct.PLL.PLLN = 8;
    RCC_OscInitStruct.PLL.PLLR = 2;
    HAL_RCC_OscConfig(&RCC_OscInitStruct);

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
}

void PWM_Init(void) {
    __HAL_RCC_TIM3_CLK_ENABLE(); // 启用 TIM3 时钟
    __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 时钟

    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用功能
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    TIM_HandleTypeDef htim3 = {0};
    TIM_OC_InitTypeDef sConfigOC = {0};

    htim3.Instance = TIM3;
    htim3.Init.Prescaler = 79;
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim3.Init.Period = 999;
    htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&htim3);

    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 500; // 占空比 50%
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);

    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
}
总结STM32G431 提供了强大的功能和灵活的配置选项,可以胜任多种应用场景。通过本文的实例代码,相信大家可以更快地上手开发。在实际应用中,还需要根据需求调整外设配置和优化代码性能,以充分发挥其潜力。

使用特权

评论回复
沙发
公羊子丹| | 2024-12-13 07:33 | 只看该作者
哇,这个 LED 的代码很实用,新手也能轻松学会!

使用特权

评论回复
板凳
周半梅| | 2024-12-13 07:33 | 只看该作者
一直没搞清 PWM 的配置,看完终于明白了,谢谢分享!

使用特权

评论回复
地板
帛灿灿| | 2024-12-13 07:33 | 只看该作者
STM32G431 的性能确实很强,用它做电机控制简直完美!

使用特权

评论回复
5
童雨竹| | 2024-12-13 07:34 | 只看该作者
能不能再详细讲讲中断处理?我一直不太会用。

使用特权

评论回复
6
Wordsworth| | 2024-12-13 07:34 | 只看该作者
感觉 STM32 系列的开发还是得多动手练习,期待更多例子!

使用特权

评论回复
7
Bblythe| | 2024-12-13 07:34 | 只看该作者
想请教一下,如果用 ADC 和定时器一起配合,该怎么实现?

使用特权

评论回复
8
Pulitzer| | 2024-12-13 07:35 | 只看该作者
这个代码我试了,成功点亮了 LED,感谢分享!

使用特权

评论回复
9
Uriah| | 2024-12-13 07:35 | 只看该作者
有没有推荐的开发板,适合 STM32G431 入门的?

使用特权

评论回复
10
Clyde011| | 2024-12-13 07:36 | 只看该作者
系统时钟的配置有点复杂,有没有更简单的模板?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

3765

帖子

0

粉丝