stm32串口通信控制led hal库
时间: 2025-02-08 11:19:10 浏览: 47
### STM32 HAL库实现串口通信控制LED
#### 利用HAL库配置UART接口
为了使STM32能够接收来自PC端的数据并据此操作外设,在初始化阶段需设置好相应的硬件参数。这包括但不限于波特率、字长、停止位等通讯属性,确保两端设备间的信息交换顺畅无阻。
```c
// 初始化 UART 接口
static void MX_USART2_UART_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200; // 设置波特率为115200bps
huart2.Init.WordLength = UART_WORDLENGTH_8B;// 字符长度为8位
huart2.Init.StopBits = UART_STOPBITS_1; // 停止位数为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();
}
}
```
#### 编写回调函数处理接收到的数据
当通过USART接收到新字符时会触发中断事件,此时可在对应的回调函数内对接收到的内容做进一步解析与响应动作。这里定义了一个简单的协议:发送`'A'`点亮LED;发送`'B'`熄灭LED[^1]。
```c
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE )!= RESET){
uint8_t temp=RxData;
switch(temp){
case 'A':
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13, GPIO_PIN_SET); // 点亮LED
break;
case 'B':
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13, GPIO_PIN_RESET);// 熄灭LED
break;
default :
break;
}
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
HAL_UART_Receive_IT(&huart2,(uint8_t *)&RxData,sizeof(RxData));// 继续等待下一个字符的到来
}
}
```
#### 主循环逻辑
主程序不需要频繁查询状态或执行复杂任务,只需保持运行即可让系统处于待命状态准备接受外部指令。实际工作中大部分时间都将花费在此处静候消息到来。
```c
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init(); // 配置IO口用于驱动LED
MX_USART2_UART_Init(); // 初始化串行通信模块
while (1)
{
// 循环体可以为空,因为所有的交互都由中断服务例程完成
}
}
```
阅读全文
相关推荐


















