我们基于之前的串口配置的那篇文章 来完成今天使用串口中断来控制led 灯的亮灭
首先我们要知道为什么要使用中断
使用中断 能高效的去执行程序,不会一直占用MCU的资源。
对于中断的介绍 可以看我之前关于中断的那篇文章
开始进入正题
我们如何配置串口中断
由于之前我们已经在user 这个文件夹下添加过这个文件了
所以我们直接在配置串口的那一个文件下 进行配置
首先 我们先配置 NVIC_InitTypeDef
这个结构体
uint8_t NVIC_IRQChannel; 中断分组
uint8_t NVIC_IRQChannelPreemptionPriority 抢占优先级
uint8_t NVIC_IRQChannelSubPriority; 子优先级
FunctionalState NVIC_IRQChannelCmd; 使能通道
NVIC_initstruct.NVIC_IRQChannel =USART1_IRQn;
NVIC_initstruct.NVIC_IRQChannelCmd = ENABLE;//!!!
NVIC_initstruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_initstruct.NVIC_IRQChannelSubPriority =1 ;
还要开启中断组
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
最后 初始化一下 就完成了
接下来就是对main 函数的编写
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
这里我们需要调用这两个函数去进行判断
第一个函数 主要是用于接收数据
第二个函数用来获取标志位
剩下的也判断也很简单 我就不细说了 直接上代码
void USART1_IRQHandler(void )
{
char buf;
if(USART_GetITStatus( USART1, USART_IT_RXNE)!=RESET);
{
buf =USART_ReceiveData(USART1);
if(buf == 'O')
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
USARTSend(USART1, " LED is ok");
}else if(buf == 'C')
{
GPIO_SetBits( GPIOC, GPIO_Pin_13);
USARTSend(USART1, " LED is down");
}
}
}
剩下就是使用我们的串口调试小助手就进行调试
文章里面可能会有一些错误 还望指出