STM32F103串口空闲中断接收数据

STM32F103

UART2

PA2---TX

PA3---RX

串口初始化:

//STM32f103使用USART2,
//PA2发送--TX,
//PA3接收--RX,
void init_hardware_usart2(u32 bound)
{
	GPIO_InitTypeDef 	GPIO_InitStructure;
	USART_InitTypeDef 	USART_InitStructure;
	NVIC_InitTypeDef 	NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
	USART_DeInit(USART2);  							//复位串口2
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;		//PA.2--TX
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;		//PA.3--RX
	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	USART_InitStructure.USART_BaudRate = bound;
	USART_InitStructure.USART_WordLength = USART_WordLength_9b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_Even;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//无硬件流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_Init(USART2, &USART_InitStructure);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);		//设置接收字节中断
	USART_ITConfig(USART2,USART_IT_IDLE, ENABLE);		//设置接收帧中断(串口空闲中断)
	
	USART_Cmd(USART2, ENABLE);
}  

串口中断函数

void USART2_IRQHandler(void)
{
	if(USART_GetITStatus(USART2,USART_IT_RXNE) == SET)	//USART_IT_RXNE=接收中断标志位,读操作会清零
		{rx_data[rx_n++] = USART_ReceiveData(USART2);}
	else if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)	//空闲帧中断
			{							
			clear =USART2->DR;  //先读取接收缓存中数据,目的是清空闲中断标志位 (USART_IT_IDLE=0)
			clear = USART2->SR;	
			FLAG=1;				//一帧数据接收结束标志
		    }	

}

主函数:

u8	rx_data[255]={0};		//接收数据
u8  rx_n=0;                 //接收字节个数
u8	FLAG=0;					//UART2接收帧结束标志位
u8	clear;

void	sendbuffer(u8 *p, u8 len)
{
	while(len--)	
	{
	USART_SendData(USART2, *(p++));
		while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);		//等待发送完成	
	}
}



int main(void) //主函数
 {    
		u16	i;
		init_hardware_usart2(9600);		//UART2初始化,波特率9600
	 while(1)
	 {
		 for(i=60000;i>0;i--);		//10000=2.5mS
		 for(i=60000;i>0;i--);		//10000=2.5mS
		 for(i=60000;i>0;i--);		//10000=2.5mS
		 //把收到的数据 再发送出去
		 if(FLAG)	{sendbuffer(rx_data, rx_n);   FLAG=0; rx_n=0;}
	 }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值