stm32F030C8单片机串口利用USART_IT_IDLE接收完整的一帧

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寄存器,在使能中断之后就要立即清除一次中断否则会不停的进入中断


猜你喜欢

转载自blog.csdn.net/gmq_syy/article/details/79570266