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

本文介绍了STM32微控制器中USART模块的配置方法,包括GPIO初始化、波特率设置及中断配置等,并详细解释了USART_IT_RXNE与USART_IT_IDLE中断的区别与应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值