关于STM32串口中断方式接收数据

xiaogang0809 2012-11-18 07:28:07
网上有如下中断方式接收数据的程序:
void USART1_IRQHandler(void) //串口1中断
{
char RX_dat; //定义字符变量
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断发生接收中断
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志
GPIO_WriteBit(GPIOB, GPIO_Pin_10, (BitAction)0x01); //开始传输
RX_dat=USART_ReceiveData(USART1) & 0x7F; //接收数据,整理除去前两位

//**************使用RX_dat进行一些处理操作,这里省略了较复杂的处理过程....********

USART_SendData(USART1, RX_dat); //发送数据
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}
//等待发送结束
}
}
问题一:上面的注释部分,“接收数据,整理除去前两位”应该是“接收数据,整理除去前一位”吧?
问题二:当执行“RX_dat=USART_ReceiveData(USART1) & 0x7F;"后,RXNE标志应该成为了RESET”状态,即接 收数据寄存器变为“空”状态,那么这时后续数据就会由移位寄存器转到接收数据寄存器,转换完成后RXNE被SET,这时候又会进入中断处理函数。如果在中断处理函数中读取数据后要对数据进行处理的时间较长,那么后续数据的进入会打断前一数据的处理过程,所以达不到接收一个字节数据,然后处理完,再接收一个字节数据,然后再处理完的这样的整个的过程。也就是说上面程序中的将接收到的数据输出的过程可能会被由于后续数据的进入而引发的中断而中断。不知道我说的这个对不对?
问题三:如果问题二中我说的过程不正确,即后续数据的接收不会打断前面数据的中断处理过程,那么是因为调用了“USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志”?难道清除中断标志位可以让RXNE只有在退出中断处理函数的时候才可以被SET?
问题四:用中断方式接收数据,中断处理函数的编写是否是如下规律?1、禁能中断。2、清除中断标志位,使得中断标志位可以准确的反映后续的中断状态。3、接收数据,并进行数据处理。4、使能中断。
...全文
1267 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaozilan_ly 2012-11-23
  • 打赏
  • 举报
回复
1、清中断标志可以放在后面。 2、发送数据最好不要放到接受中断中。 3、中断时有嵌套的,(同优先级) 4、可以再处理中断时先判断是否是溢出中断,在去接受处理数据。
zc850463390zc 2012-11-23
  • 打赏
  • 举报
回复
第一:接受数据直接调用USART_ReceiveData(USART1)就行,不要进行处理。 第二:相同优先级的中断使不能嵌套的。所以肯定要等这个中断函数执行完毕才会再一次进入中断(如果触发了的话) 第四:中断编写的过程如下: 1,判断中断标志(即判断是由于什么引起的中断,是接受中断,还是发送中断), 2,调用USART_ReceiveData(USART1)函数接受数据,然后进行你对数据的操作 3,清楚中断标志位。 其中2,3可互换。

27,383

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧