我正在写入一个带有圆形缓冲器的UART传输驱动程序。 现在我在A1上
每个字符都经过相同的kputchar((uint8_t c)例程。
Int16_t kputchar1 (uint8_t c){
uint16_t Head,Tail;
Head = T1Head;
Tail = T1Tail;
// U1STAbits.UTXEN = 1;
// I = 0;
如果(Head = Tail){// My buffer is empty so check UART
如果(UCA1IFG & UCTXIFG)== UCTXIFG)// UCA1TXBUF为空
{
UCA1TXBUF = c;
_T1INT_ENABLE;
返回2;}
}
Head++;
IF (Head == T1BUF_Size) Head = 0;
IF (Head == Tail)
{
while (Head == T1Tail);//等待字符离开缓冲
区}
T1BUF[Head]= c;
T1Head = Head;
_T1INT_ENable;
Return 1;
}
我的ISR如下所示:
#pragma vector=USI_A1_vector
__interrupt void USI_A1_ISR(void)
{
A1VectorCnt++;
switch(__偶 数_in_range(UCA1IV,4)){
案例0:
中断; //矢量0-无中断
情况2: //矢量2 - RXIFG
{
UINT8_t头;
头部= R1Head;
HEAD ++;
如果(头部>= R1BUF_SIZE)头部= 0;
如果(头= R1Tail) R1Overflow = 1;
R1BUF[Head]= UCA1RXBUF;// TX -> RXed字符
R1Head = Head;
}
中断;
案例4: //矢量4 - TXIFG
{
UINT8_t尾线= T1Tail;
IF (T1Head == Tail)
{
//没有更多要处理的内容
_T1INT_DISABLE;//禁用中断
}
否则
{
tail++;
如果(Tail >= T1BUF_SIZE) Tail = 0;
UCA1TXBUF = T1BUF[尾端];
T1Tail = Tail;
}
}
中断;
默认:
中断;
}
所以我写了一串数据,暂停,然后再写,暂停,再写,永远。
我已经暂停了足够长的时间,以确保在发送下一个字符串之前写入所有数据。 字符串以比9600波特能处理的速度更快的速度发送数据,因此它进入循环缓冲区。 通过ISR,当我等待时,循环缓冲区将被清除。
所有操作都与第一个字符串的工作方式相同。 将写入缓冲区中的所有内容。
当我准备好写入UCA1IFG中的第二个字符串UCTXIFG未设置时,表示UCA1TXBUF不为空。
在调试器中,我可以看到要写入的循环缓冲区中的数据。
T1Head = 109
T1Tail = 10
UCA1IFG = 0
UCA1IE = 3
UCA1CTL0 = 0
UCA1CTL1 = 0x80
UCABR0 = 0x60
UCAR1 = 0
(这不是波特率问题,我的晶体是14.7456 MHz,第一个字符串以9600波特正确输出)
文档显示
36.3 15.1 传输中断操作
UCTXIFG中断标志由发射器设置,以指示UCAxTXBUF已准备好接受
另一个字符。 如果还设置了UCTXIE和GIE,则会生成中断请求。 UCTXIFG是
将字符写入UCAxTXBUF时自动重置。
UCTXIFG在PUC之后或UCSWRST = 1时设置。 UCTXIE在PUC或时间后重置
UCSWRST = 1。
所以我在调试器中查看它,发射器一直处于空闲状态,UCTXIFG不是1。 是什么原因造成的?
我唯一能想到的是,我响应了ISR,当我成功写入字符串并且当时没有更多数据要写入时,我关闭了TX中断启用。 因此ISR不会再次触发。 但旗帜仍应很高。 还是不能这样做?
调试器是否在做一些意外的事情,而不是让其触发? 我正在使用IAR 7.10 .................3.
我感到困惑。
基普