使用中断接收发送方式,可随时响应串口的接收发送请求,提高串口响应时间;
在程序上 *** 作步骤如下:
首先:在void RCC_Configuration(void)中配置好串口时钟;及在void GPIO_Configuration(void)配置好管脚;
RCC_PCLK2Config(RCC_HCLK_Div1); //串口波特率的确定
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA||RCC_APB2Periph_USART1, ENABLE);
/ Configure USART1 RTS (PA12) and USART1 Tx (PA9) as alternate function push-pull 根据资料可查得各管脚对应/
GPIO_InitStructureGPIO_Pin =GPIO_Pin_9;
GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructureGPIO_Mode = GPIO_Mode_AF_PP; //推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
其次:在 void NVIC_Configuration(void)函数中使能串口中断;
/ Enable the USART1 Interrupt /
NVIC_InitStructureNVIC_IRQChannel = USART1_IRQChannel; //通道设置为串口1中断(故后面应选择在“void USART1_IRQHandler(void)”开中断)
NVIC_InitStructureNVIC_IRQChannelPreemptionPriority = 0; //中断占先等级0
NVIC_InitStructureNVIC_IRQChannelSubPriority = 0; //中断响应优先级0
NVIC_InitStructureNVIC_IRQChannelCmd = ENABLE; //打开中断
NVIC_Init(&NVIC_InitStructure);
其次。配置好串口,并开中断
/ Enable the USART1 Interrupt /
NVIC_InitStructureNVIC_IRQChannel = USART1_IRQChannel; //通道设置为串口1中断(故后面应选择在“void USART1_IRQHandler(void)”开中断)
NVIC_InitStructureNVIC_IRQChannelPreemptionPriority = 0; //中断占先等级0
NVIC_InitStructureNVIC_IRQChannelSubPriority = 0; //中断响应优先级0
NVIC_InitStructureNVIC_IRQChannelCmd = ENABLE; //打开中断
NVIC_Init(&NVIC_InitStructure);
最后,可在stm32f10x_itc中的void USART1_IRQHandler(void)函数里写上串口中断发生时中断服务函数即可;
u8 RX_dat; //定义字符变量
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断发生接收中断
{
RX_dat=(USART_ReceiveData(USART1) & 0x7F); //接收数据,整理除去前两位
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){}//等待接收结束
// USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); //关中断
USART_SendData(USART1,RX_dat); //发送数据
}
程序实现功能:当有数据通过串口发送过来时,程序进入串口中断服务程序,在中断服务程序中发送接收到的数据;
void USART3_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//½ÓÊÕµ½Êý¾Ý
{
res =USART_ReceiveData(USART3);
if((USART3_RX_STA&(1<<15))==0)//½ÓÊÕÍêµÄÒ»ÅúÊý¾Ý,»¹Ã»Óб»´¦Àí,Ôò²»ÔÙ½ÓÊÕÆäËûÊý¾Ý
{
if(USART3_RX_STA<USART3_MAX_RECV_LEN) //»¹¿ÉÒÔ½ÓÊÕÊý¾Ý
{
TIM_SetCounter(TIM7,0);//¼ÆÊýÆ÷Çå¿Õ //¼ÆÊýÆ÷Çå¿Õ
if(USART3_RX_STA==0) //ʹÄܶ¨Ê±Æ÷7µÄÖжÏ
{
TIM_Cmd(TIM7,ENABLE);//ʹÄܶ¨Ê±Æ÷7
}
USART3_RX_BUF[USART3_RX_STA++]=res; //¼Ç¼½ÓÊÕµ½µÄÖµ
}else
{
USART3_RX_STA|=1<<15; //Ç¿ÖƱê¼Ç½ÓÊÕÍê³É
}
}
}
}
可以,事实现在,现在任何一款单片机,只要是普通的UART,不是485方式的,都是全双工通信的,所谓全双工通信,就是既能接受,同时也能发送,所以,你没有必要担心这个问题,当然,如果你外接了485芯片,那就不行了,因为485芯片是半双工的。
以上就是关于stm32 串口中断发送和接收怎么回事,就是串口的中断方式和查询方式有什么区别全部的内容,包括:stm32 串口中断发送和接收怎么回事,就是串口的中断方式和查询方式有什么区别、stm32 串口接收字符串 中断程序怎么写、stm32同一个串口可以同时接收和发送吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)