我正在使用我的uC LPC2478。我正在研究UART0功能。 但我需要制作UART0功能。 我不知道中断,如何使用!
我尝试发送一个长字符串,它应该收到一个长字符串。 但它不起作用。但是我需要写函数__irq void isr_UART0(void)???
> void initUART0 (void)
> {
> PCONP |= (1 << 3); /* Enable UART0 power */
>
> PINSEL0 &= ~0x000000F0;
> PINSEL0 |= 0x00000050;
>
> U0FDR = 0; /* Fractional divider not used */
> U0LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */
> U0DLL = 10; /* 115200 Baud Rate @ 12MHz PCLK Clock */
>
> U0DLM = 0;
> U0LCR = 0x03; /* DLAB = 0 */
>
> U0IER = 0;
>
> VICVectAddr6 = (U32)isr_UART0; /* Set Interrupt Vector */
> VICVectCntl6 = 15; /* use it for UART1 Interrupt */
> VICIntEnable = (1 << 6); /* Enable Interrupt */
>
> U0IER = 0x03;
> }
>
> void sendToUART0 (char *data, int len)
> {
> int i;
>
> while (!(U0LSR & (1 << 5)));
> for (i = 0; i < len; i++)
> {
> U0THR = *data;
> data++;
> }
> }
>
> void readDataAtUART0 (char *ch) {
> //while (!(U0LSR & 0x01));
> while (!(U0LSR & (1 << 0)));
> *ch = U0RBR;
> }
>
> /* UART1 receive ISR
> ******************************************************** */
> __irq void isr_UART0 (void) {
> // readDataAtUART0();
>
> // read and assign the received data
VICVectAddr = 0; /* Acknowledge Interrupt */
> }
答案 0 :(得分:0)
'但是它不起作用'对你的问题是一个非常糟糕的描述,所以-1无论如何。
'readDataAtUART0();'与'void readDataAtUART0(char * ch)'的签名不匹配,因此此代码将无法编译。中断处理程序没有进程或线程上下文,因此您必须求助于至少一个全局变量以允许处理程序进行通信 - 在您的情况下,是一个数组指针。
TX中断有点尴尬,因为U0THR可能需要“启动”第一个字符才能发送。这可能很尴尬,需要禁用tx中断来检查U0THR是否已清空前一个缓冲区内容的最后一个字符。
只需编译代码然后让rx处理程序先运行。