USART_IT_RXNE寄存器是在没接收到一个字节时产生中断,而USART_IT_IDLE寄存器是在接收到完整一帧后产生中断,即接收完一个字节在一个字节的时间内再无接收的话就会产生中断
下面是源码:
void USART1_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure; //定义串口初始化结构体
NVIC_InitTypeDef NVIC_InitStruct;
RCC_AHBPeriphClockCmd(USART1_GPIO_RCC, ENABLE); //使能GPIOA的时钟
RCC_APB2PeriphClockCmd(USART1_RCC, ENABLE);//使能USART的时钟
GPIO_PinAFConfig(USART1_GPIO_PORT, USART1_TX_GPIO_PinSource, GPIO_AF_1);//配置PA9成第二功能引脚 TX
GPIO_PinAFConfig(USART1_GPIO_PORT, USART1_RX_GPIO_PinSource, GPIO_AF_1);//配置PA10成第二功能引脚 RX
/*USART1_TX ->PA9 USART1_RX ->PA10*/
GPIO_InitStructure.GPIO_Pin = USART1_TX|USART1_RX; //选中串口默认输出管脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //定义输出最大速率
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//定义管脚9的模式
GPIO_Init(USART1_GPIO_PORT, &GPIO_InitStructure); //调用函数,把结构体参数输入进行初始化
/*串口通讯参数设置*/
USART_InitStructure.USART_BaudRate = UART1_BaudRate;//9600; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位1位
USART_InitStructure.USART_Parity = USART_Parity_No; //校验位 无
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //使能接收和发送引脚
USART_Init(USART1, &USART_InitStructure);
//USART_ClearFlag(USART1,USART_FLAG_TC);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
USART1->ICR |= 1<<4; //必须先清除IDLE中断,否则会一直进IDLE中断
USART_Cmd(USART1, ENABLE);
/* USART1的NVIC中断配置 */
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 0x02;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
/**
* @file USART1_IRQHandler
* @brief USART1中断处理
* @param 无
* @retval 无
*/
void USART1_IRQHandler(void)
{
uint32_t temp = 0;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
//USART_SendData(USART1,USART_ReceiveData(USART1));
if (uart_recv[UART_1].count < UART_BUF_LEN)
{
//uart_recv_flag = 1;
uart_recv[UART_1].recv_buf[uart_recv[UART_1].count] = USART_ReceiveData(USART1);
uart_recv[UART_1].count++;
}
while (USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
}
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
{
USART1->ICR |= 1<<4;
uart_recv_flag = 1;
UART_send(USART1, "hello", sizeof("hello"));
}
}
注意F0芯片的清除中断的方法是用ICR寄存器,在使能中断之后就要立即清除一次中断否则会不停的进入中断
上一篇:stm32 USART接收总线空闲中断--USART_IT_IDLE
下一篇:STM32F系列USART的IDLE中断要注意了
推荐阅读最新更新时间:2024-03-16 16:19
设计资源 培训 开发板 精华推荐
- 好书共读 | 《控制之美(卷2)——最优化控制MPC与卡尔曼滤波器》
- 有奖直播:英飞凌 MERUS™ D 类音频放大器的多电平技术及其优势
- 看是德科技利用校准降低仪器测量不确定度、提高测试精度 直播享好礼!
- 福禄克首款热成像万用表Fluke-279FC等你来尝鲜!晒心得享好礼喽!
- 点评下载资料,参加幸运抽奖,让我们迈开技术交流分享的步伐!!
- 购买TI store MSP432P401R LaunchPad 晒单就送礼!
- ADI 新一期《模拟对话》上线,免费下载ing!
- ADI有奖直播:储能系统助力电动汽车快充站的建设 8月31日上午10:00-11:30 为您揭晓!
- 年终大冲关!第二期光荣榜活动震撼登场!