在嵌入式开发领域,STMicroelectronics(意法半导体)的STM32系列因其性能强大、外设丰富、功耗低而深受开发者青睐。STM32G071RB是一款基于Arm Cortex-M0+内核的MCU,主频为64 MHz,集成了丰富的外设功能和内置硬件加密单元,非常适合工业控制和物联网应用。本文将详细介绍STM32G071RB的特性,并通过一个UART串口通信的代码示例来展示它的实际应用。
一、STM32G071RB的核心特点- 性能与低功耗的平衡
作为Cortex-M0+系列的产品,STM32G071RB主频达到64 MHz,同时支持多种低功耗模式,适用于功耗敏感的设备。
- 丰富的外设接口
STM32G071RB集成了多种外设,包括I2C、SPI、UART、ADC、DAC和CAN接口,满足多样化需求。
- 增强的安全性
该MCU内置硬件AES加密单元和真随机数生成器,为物联网设备提供更高的安全性。
- 内置硬件分压器
支持VREF外部参考电压,提高ADC采样精度。
- 开发资源丰富
STM32G071RB兼容STM32CubeIDE和STM32CubeMX,提供易于使用的开发工具链和代码库。
二、开发环境准备- 硬件
- STM32G071RB Nucleo开发板
- USB数据线
- 调试工具(如ST-LINK V2)
- 软件
三、代码示例:UART通信实现以下代码实现了通过USART2接口发送和接收数据的功能,开发者可以连接PC进行测试。
#include "main.h"
// UART句柄定义
UART_HandleTypeDef huart2;
// 函数声明
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
int main(void)
{
uint8_t txData[] = "Hello, STM32G071RB!\r\n";
uint8_t rxData[10];
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
while (1)
{
// 发送数据
HAL_UART_Transmit(&huart2, txData, sizeof(txData) - 1, HAL_MAX_DELAY);
// 接收数据
HAL_UART_Receive(&huart2, rxData, sizeof(rxData), HAL_MAX_DELAY);
// 将接收到的数据回传
HAL_UART_Transmit(&huart2, rxData, sizeof(rxData), HAL_MAX_DELAY);
}
}
// 配置系统时钟
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.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
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.PLLP = RCC_PLLP_DIV7;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
{
Error_Handler();
}
}
// 初始化USART2
static void MX_USART2_UART_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
}
// 初始化GPIO
static void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
}
// 错误处理
void Error_Handler(void)
{
while (1)
{
}
}
四、代码解析- UART初始化
通过MX_USART2_UART_Init()函数配置USART2的波特率、数据位、停止位等参数。
- 数据收发流程
在主循环中,开发板会先发送“Hello, STM32G071RB!”字符串,然后等待接收数据并回传。
- 系统时钟配置
采用内部HSI时钟源,通过PLL配置主频为64 MHz。
五、总结STM32G071RB凭借其高性价比和丰富的功能,成为入门级嵌入式开发的优质选择。通过简单的UART通信示例,我们可以感受到其开发环境的便利和硬件功能的强大。未来可以结合ADC、CAN等外设开发更多高级应用。
|