#include "su03t.h" #include "main.h" extern UART_HandleTypeDef huart3; uint8_t Recive3; // 新增:在当前文件声明接收变量 void SU03T_Init(void) { // 使能UART3时钟 __HAL_RCC_USART3_CLK_ENABLE(); // 配置UART3引脚(GPIOB) GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOB_CLK_ENABLE(); // 配置RX引脚(PB11) GPIO_InitStruct.Pin = GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // 配置TX引脚(PB10) GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // 初始化LED灯 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_GPIO_Port, &GPIO_InitStr
时间: 2025-05-25 11:14:48 浏览: 17
### STM32 SU03T语音模块 UART3 初始化配置及LED控制代码示例
以下是一个针对STM32微控制器的SU03T语音模块初始化和LED控制的具体实现方案。代码分为两大部分:UART3初始化配置和LED控制逻辑。
#### 一、UART3初始化配置
在STM32中,通过HAL库可以方便地完成UART外设的初始化。以下是UART3的初始化代码示例:
```c
#include "stm32f1xx_hal.h"
// 定义全局变量用于保存接收数据
uint8_t rxBuffer[64];
volatile uint8_t isDataReceived = 0;
void UART3_Init(void) {
USART_HandleTypeDef huart3;
// 配置UART3参数
huart3.Instance = USART3; // 使用USART3实例
huart3.Init.BaudRate = 9600; // 设置波特率为9600bps
huart3.Init.WordLength = UART_WORDLENGTH_8B; // 字符长度为8位
huart3.Init.StopBits = UART_STOPBITS_1; // 停止位为1
huart3.Init.Parity = UART_PARITY_NONE; // 无校验
huart3.Init.Mode = UART_MODE_TX_RX; // 启用发送和接收模式
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; // 不启用硬件流控
huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; // 不启用高级特性
HAL_UART_Init(&huart3); // 调用HAL库函数初始化UART3
}
// 中断服务程序,当接收到数据时会进入此函数
void USART3_IRQHandler(void) {
if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE)) { // 检查是否接收到新数据
__HAL_UART_CLEAR_IT(&huart3, UART IT PE | UART IT FE | UART IT ORE | UART IT RXNE); // 清除中断标志
HAL_UART_Receive(&huart3, rxBuffer, 1, HAL_MAX_DELAY); // 接收单个字节到缓冲区
isDataReceived = 1; // 标记已接收到数据
}
}
```
上述代码实现了UART3的基本初始化,并设置了中断回调函数以实时捕获来自SU03T模块的数据[^1]。
---
#### 二、LED控制逻辑
对于LED的控制,可以通过GPIO端口来实现开关操作。以下是具体的代码实现:
```c
#define LED_PIN GPIO_PIN_5
#define LED_PORT GPIOC
void LED_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 启用GPIOC时钟
__HAL_RCC_GPIOC_CLK_ENABLE();
// 配置LED引脚为推挽输出模式
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);
// 默认关闭LED
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET);
}
void Toggle_LED(uint8_t state) {
if (state == 1) {
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET); // 打开LED
} else {
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET); // 关闭LED
}
}
```
在此部分中,`LED_Init()` 函数负责初始化指定的GPIO引脚作为输出端口,而 `Toggle_LED()` 则提供了简单的接口用于切换LED的状态[^2]。
---
#### 综合应用示例
下面展示了一个综合的应用场景,其中包含了UART3接收数据后的处理逻辑以及对应的LED控制动作:
```c
int main(void) {
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟
UART3_Init(); // 初始化UART3
LED_Init(); // 初始化LED
while (1) {
if (isDataReceived) { // 如果有新的数据到来
isDataReceived = 0; // 清除标记
if (rxBuffer[0] == '1') { // 若接收到字符'1'
Toggle_LED(1); // 打开LED
} else if (rxBuffer[0] == '0') { // 若接收到字符'0'
Toggle_LED(0); // 关闭LED
}
// 将接收到的内容回传给SU03T模块(可选)
HAL_UART_Transmit(&huart3, rxBuffer, 1, HAL_MAX_DELAY);
}
}
}
```
在这个主循环里,程序不断监听是否有来自SU03T的新消息;一旦发现有效信号,则按照预定义规则调整LED的工作状态[^3]。
---
###
阅读全文
相关推荐


















