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

[复制链接]
2080|11
 楼主| 万图 发表于 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:
  1. #include "stm32g4xx.h"

  2. void SystemClock_Config(void);
  3. void GPIO_Init(void);

  4. int main(void) {
  5.     HAL_Init();
  6.     SystemClock_Config();
  7.     GPIO_Init();

  8.     while (1) {
  9.         HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); // 切换 GPIO 状态
  10.         HAL_Delay(500); // 延迟 500ms
  11.     }
  12. }

  13. void SystemClock_Config(void) {
  14.     // 配置系统时钟,具体配置请根据实际应用调整
  15.     RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  16.     RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  17.     RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  18.     RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  19.     RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  20.     RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  21.     RCC_OscInitStruct.PLL.PLLM = 1;
  22.     RCC_OscInitStruct.PLL.PLLN = 8;
  23.     RCC_OscInitStruct.PLL.PLLR = 2;
  24.     HAL_RCC_OscConfig(&RCC_OscInitStruct);

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

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

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

  2. void SystemClock_Config(void);
  3. void PWM_Init(void);

  4. int main(void) {
  5.     HAL_Init();
  6.     SystemClock_Config();
  7.     PWM_Init();

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

  12. void SystemClock_Config(void) {
  13.     RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  14.     RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  15.     RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  16.     RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  17.     RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  18.     RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  19.     RCC_OscInitStruct.PLL.PLLM = 1;
  20.     RCC_OscInitStruct.PLL.PLLN = 8;
  21.     RCC_OscInitStruct.PLL.PLLR = 2;
  22.     HAL_RCC_OscConfig(&RCC_OscInitStruct);

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

  27. void PWM_Init(void) {
  28.     __HAL_RCC_TIM3_CLK_ENABLE(); // 启用 TIM3 时钟
  29.     __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 GPIOA 时钟

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

  37.     TIM_HandleTypeDef htim3 = {0};
  38.     TIM_OC_InitTypeDef sConfigOC = {0};

  39.     htim3.Instance = TIM3;
  40.     htim3.Init.Prescaler = 79;
  41.     htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  42.     htim3.Init.Period = 999;
  43.     htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  44.     HAL_TIM_PWM_Init(&htim3);

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

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

公羊子丹 发表于 2024-12-13 07:33 | 显示全部楼层
哇,这个 LED 的代码很实用,新手也能轻松学会!
周半梅 发表于 2024-12-13 07:33 | 显示全部楼层
一直没搞清 PWM 的配置,看完终于明白了,谢谢分享!
帛灿灿 发表于 2024-12-13 07:33 | 显示全部楼层
STM32G431 的性能确实很强,用它做电机控制简直完美!
童雨竹 发表于 2024-12-13 07:34 | 显示全部楼层
能不能再详细讲讲中断处理?我一直不太会用。
Wordsworth 发表于 2024-12-13 07:34 | 显示全部楼层
感觉 STM32 系列的开发还是得多动手练习,期待更多例子!
Bblythe 发表于 2024-12-13 07:34 | 显示全部楼层
想请教一下,如果用 ADC 和定时器一起配合,该怎么实现?
Pulitzer 发表于 2024-12-13 07:35 | 显示全部楼层
这个代码我试了,成功点亮了 LED,感谢分享!
Uriah 发表于 2024-12-13 07:35 | 显示全部楼层
有没有推荐的开发板,适合 STM32G431 入门的?
Clyde011 发表于 2024-12-13 07:36 | 显示全部楼层
系统时钟的配置有点复杂,有没有更简单的模板?
l63t89 发表于 2024-12-30 23:58 | 显示全部楼层
最大 512 KB 的 Flash 存储和 128 KB 的 SRAM,能够支持较大的程序和数据存储需求。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

179

主题

6271

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部