关于中断方式发送的问题
看了TXC位的定义我想到,如果允许发送,允许产生发送结束中断,全局中断使能,此时程序会不会不停的进入发送中断服务程序?http://cache.amobbs.com/bbs_upload782111/files_16/ourdev_455926.jpg(原文件名:QQ截图未命名.jpg) /**//*发送单个字符*/
void put_c(char c)
...{
while (tx_counter == TX_BUFFER_SIZE); //发送数据队列中还有数据没有发送完,等待
cli();
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0)) //若发送数据队列有数据或者数据寄存器UDR非空时执行(因为队列先进先出的原因,所以,c要放进非空的发送数据队列里面)
...{
tx_buffer=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
}
else
UDR=c;
sei();
}
//发送中断
ISR(USART_TXC_vect)
{
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer;
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
}
这段程序我觉得会使得程序总是在进入接收中断的服务子程序,因为一出中断TXC就置1了,就又进入中断。。不解,是不是我什么地方理解错了 so easy,
空闲中断中,在检测到发送缓冲区的东东都发送后,禁止空闲中断
发送函数中打开空闲中断....
========================
下面是我写的
//------ 发送寄存器空闲中断 ------//
#pragma interrupt_handler USART_DataSendIdle:iv_USART_UDRE
void USART_DataSendIdle()
{// 当发送空闲时,将缓冲区数据依次发送
if( Comm.Write.IsOpen )
{
UDR = Comm.Write.Buffer;
}
if( Comm.Write.EndPos==Comm.Write.CurPos )
{// 禁止发送空闲中断
Comm.Write.IsOpen = false;
Interrupt_UDR_Disabled();
return;
}
} if (tx_counter)干啥用的? 晕死了。
页:
[1]