stm32串口通信控制led灯
时间: 2023-09-09 12:10:24 浏览: 91
首先,你需要连接一个 LED 灯到 STM32 的一个 GPIO 引脚上。然后,你需要在代码中初始化串口并将其连接到相应的引脚上。
以下是一个示例代码,假设你的 LED 连接到 PA5 引脚,串口连接到 PA2/PA3 引脚:
```c
#include "stm32f4xx.h"
void USART2_Init(void);
void LED_Init(void);
int main(void)
{
USART2_Init(); // 初始化 USART2 串口
LED_Init(); // 初始化 LED 灯
while (1) {
// 等待接收串口数据
while (!(USART2->SR & USART_SR_RXNE));
char ch = USART2->DR;
// 根据接收到的字符控制 LED 灯
if (ch == '1') {
GPIOA->BSRR = GPIO_BSRR_BS5; // 点亮 LED
} else if (ch == '0') {
GPIOA->BSRR = GPIO_BSRR_BR5; // 熄灭 LED
}
}
return 0;
}
void USART2_Init(void)
{
RCC->APB1ENR |= RCC_APB1ENR_USART2EN; // 使能 USART2 时钟
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // 使能 GPIOA 时钟
// 配置 PA2/PA3 为复用功能
GPIOA->MODER &= ~(GPIO_MODER_MODE2 | GPIO_MODER_MODE3);
GPIOA->MODER |= (GPIO_MODER_MODE2_1 | GPIO_MODER_MODE3_1);
// 配置 PA2/PA3 的复用功能为 USART2_TX/RX
GPIOA->AFR[0] |= (GPIO_AFRL_AFSEL2_0 | GPIO_AFRL_AFSEL2_1 |
GPIO_AFRL_AFSEL2_2 | GPIO_AFRL_AFSEL3_0 |
GPIO_AFRL_AFSEL3_1 | GPIO_AFRL_AFSEL3_2);
// 配置 USART2 的波特率和工作模式
USART2->BRR = 84000000 / 115200; // 波特率为 115200
USART2->CR1 |= (USART_CR1_RE | USART_CR1_TE | USART_CR1_UE);
}
void LED_Init(void)
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // 使能 GPIOA 时钟
// 配置 PA5 为推挽输出
GPIOA->MODER &= ~GPIO_MODER_MODE5;
GPIOA->MODER |= GPIO_MODER_MODE5_0;
GPIOA->OTYPER &= ~GPIO_OTYPER_OT5;
// 配置 PA5 输出速度为高速
GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEED5;
// 关闭 LED
GPIOA->BSRR = GPIO_BSRR_BR5;
}
```
在上面的代码中,我们使用了 USART2 串口和 PA5 引脚,你需要根据你的实际硬件连接情况进行相应的修改。串口接收到字符时,我们根据接收到的字符控制 LED 灯的状态。如果接收到 '1' 字符,则点亮 LED,如果接收到 '0' 字符,则熄灭 LED。
阅读全文