STM32f103keil5通过串口传输中断来控制led灯的亮灭代码
时间: 2024-10-16 17:20:48 浏览: 14
STM32F103系列微控制器通过USART(通用异步收发器)实现串口通信,并利用串口中断来控制LED灯的亮灭。以下是一个简单的示例代码,它演示了如何配置USART、设置串口中断以及控制LED灯:
```c
#include "stm32f1xx.h"
// 定义LED和USART外设
GPIO_TypeDef *gpio_led = GPIOA;
GPIO_Pin_TypeDef led_pin = GPIO_PIN_0; // LED连接到PA0
USART_TypeDef *usart = USART1;
// LED状态枚举
enum LedState {LED_OFF, LED_ON};
// USART初始化函数
void USART_Init(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 启动USART时钟
USART_InitTypeDef usart_config;
usart_config.USART_BaudRate = 9600; // 设置波特率
usart_config.USART_WordLength = USART_WordLength_8b;
usart_config.USART_StopBits = USART_StopBits_1;
usart_config.USART_Parity = USART_Parity_No;
usart_config.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(usart, &usart_config);
USART_Cmd(usart, ENABLE); // 开启USART
}
// 串口中断处理函数
void EXTI0_IRQHandler() {
static enum LedState prev_state = LED_OFF; // 上次LED状态
if (USART_GetITStatus(usart, USART_IT_RXNE)) { // 检查接收到的数据
uint8_t data = USART_ReceiveData(usart); // 读取数据
switch (data) {
case '0':
gpio_led->ODR &= ~(1 << led_pin); // 关闭LED
break;
case '1':
gpio_led->ODR |= (1 << led_pin); // 打开LED
break;
default:
// 处理非法数据...
}
if (prev_state != data) {
GPIO_SetBits(gpio_led, led_pin); // 切换LED状态
prev_state = data;
}
}
}
int main(void) {
USART_Init();
NVIC_EnableIRQ(USART1_IRQn); // 开启USART接收中断
NVIC_EnableIRQ(EXTI0_IRQn); // 开启EXTI0引脚(串口RX引脚)中断
while (1) {
// 主循环...
}
}
阅读全文