Код инициализации:
Код
ubuff = &u0buff;
ubuff->tx_buff = u0_buff_tx;
ubuff->rx_buff = u0_buff_rx;
ubuff->tx_buff_size = sizeof(u0_buff_tx);
ubuff->rx_buff_size = sizeof(u0_buff_rx);
PCONP_bit.PCURT0 = 1; //UART power on
PINSEL0_bit.P0_0 = 1;//select pin for UART0
PINSEL0_bit.P0_1 = 1;
U0FCR = 0xC1;
uart_bautrate(UART0,32);
U0LCR = 0x03; //1-8-N
INT_Plug(UART0_ISR,VIC_UART0,IRQ_int,IRQ_Slot0);
VIC_IntEnable(BIT(VIC_UART0));
U0IER_bit.RDAIE = 1;
U0IER_bit.RXLSIE = 1;
ubuff->tx_buff = u0_buff_tx;
ubuff->rx_buff = u0_buff_rx;
ubuff->tx_buff_size = sizeof(u0_buff_tx);
ubuff->rx_buff_size = sizeof(u0_buff_rx);
PCONP_bit.PCURT0 = 1; //UART power on
PINSEL0_bit.P0_0 = 1;//select pin for UART0
PINSEL0_bit.P0_1 = 1;
U0FCR = 0xC1;
uart_bautrate(UART0,32);
U0LCR = 0x03; //1-8-N
INT_Plug(UART0_ISR,VIC_UART0,IRQ_int,IRQ_Slot0);
VIC_IntEnable(BIT(VIC_UART0));
U0IER_bit.RDAIE = 1;
U0IER_bit.RXLSIE = 1;
код функции передачи
Код
int uart_send_str(TUartChanel dev, const char* data)
{
TUART_BUFF* ubuff;
int len,fsize,head,i;
unsigned long old_irq;
char *ptr;
ubuff = &u0buff;
fsize = 0;
len = strlen(data);
ptr = (char*)data;
do
{
do fsize = uart_tx_free(dev); while(fsize == 0);
if (fsize > len) fsize = len;
head = ubuff->tx_head;
for (i=0;i<fsize;i++)
{
ubuff->tx_buff[head] = *ptr++;
if(++head == ubuff->tx_buff_size) head = 0;
}
ubuff->tx_head = head;
old_irq = disable_IRQ();
ubuff->tx_size = ubuff->tx_size+i;
restore_IRQ(old_irq);
U0IER_bit.THREIE = 1; //<= включаем прерывание и оно не происходит
len = len - fsize;
}
while((*ptr!='\0')&&(len > 0));
return(0);
};
{
TUART_BUFF* ubuff;
int len,fsize,head,i;
unsigned long old_irq;
char *ptr;
ubuff = &u0buff;
fsize = 0;
len = strlen(data);
ptr = (char*)data;
do
{
do fsize = uart_tx_free(dev); while(fsize == 0);
if (fsize > len) fsize = len;
head = ubuff->tx_head;
for (i=0;i<fsize;i++)
{
ubuff->tx_buff[head] = *ptr++;
if(++head == ubuff->tx_buff_size) head = 0;
}
ubuff->tx_head = head;
old_irq = disable_IRQ();
ubuff->tx_size = ubuff->tx_size+i;
restore_IRQ(old_irq);
U0IER_bit.THREIE = 1; //<= включаем прерывание и оно не происходит
len = len - fsize;
}
while((*ptr!='\0')&&(len > 0));
return(0);
};
код main
Код
//U0THR = 0x00; //<- если включить эту строку UART начинает генерить прерывания
while(1)
{
uart_send_str(UART0,"HELLO WORD");
}
while(1)
{
uart_send_str(UART0,"HELLO WORD");
}
Код обработчика:
Код
void UART0_ISR (void)
{
unsigned int tmp;
TUART_BUFF* ubuff = &u0buff;
switch((U0IIR>>1)&0x7)
{
case IIR_THRE: // continue sending data
if (ubuff->tx_size == 0)U0IER_bit.THREIE = 0;
else
{
U0THR = ubuff->tx_buff[ubuff->tx_tail];
ubuff->tx_size--;
if (++ubuff->tx_tail == ubuff->tx_buff_size) ubuff->tx_tail = 0;
}
break;
case IIR_RSL:
tmp = U0LSR;
ubuff->last_error |= tmp & 0x9E;
break;
case IIR_RDA: // receive data
case IIR_CTI: // time out
tmp = U0RBR;
if (ubuff->eho_state == ON)
{
while(!U0LSR_bit.THRE);
U0THR = tmp;
};
if ((tmp == 0x0D) || (tmp == 0x0A)) ubuff->str_flag = 1;
if (ubuff->rx_size == (ubuff->rx_buff_size-1))
{
ubuff->last_error |= RC_FIFO_OVERRUN_ERR;
}
else
{
ubuff->rx_buff[ubuff->rx_head] = tmp;
ubuff->rx_size++;
if (++ubuff->rx_head == ubuff->rx_buff_size) ubuff->rx_head = 0;
}
break;
}//switch
} //isr
{
unsigned int tmp;
TUART_BUFF* ubuff = &u0buff;
switch((U0IIR>>1)&0x7)
{
case IIR_THRE: // continue sending data
if (ubuff->tx_size == 0)U0IER_bit.THREIE = 0;
else
{
U0THR = ubuff->tx_buff[ubuff->tx_tail];
ubuff->tx_size--;
if (++ubuff->tx_tail == ubuff->tx_buff_size) ubuff->tx_tail = 0;
}
break;
case IIR_RSL:
tmp = U0LSR;
ubuff->last_error |= tmp & 0x9E;
break;
case IIR_RDA: // receive data
case IIR_CTI: // time out
tmp = U0RBR;
if (ubuff->eho_state == ON)
{
while(!U0LSR_bit.THRE);
U0THR = tmp;
};
if ((tmp == 0x0D) || (tmp == 0x0A)) ubuff->str_flag = 1;
if (ubuff->rx_size == (ubuff->rx_buff_size-1))
{
ubuff->last_error |= RC_FIFO_OVERRUN_ERR;
}
else
{
ubuff->rx_buff[ubuff->rx_head] = tmp;
ubuff->rx_size++;
if (++ubuff->rx_head == ubuff->rx_buff_size) ubuff->rx_head = 0;
}
break;
}//switch
} //isr