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 提供了强大的功能和灵活的配置选项,可以胜任多种应用场景。通过本文的实例代码,相信大家可以更快地上手开发。在实际应用中,还需要根据需求调整外设配置和优化代码性能,以充分发挥其潜力。
|