TI中文支持网
TI专业的中文技术问题搜集分享网站

6747 uart 中断 求指导

 uart中断偶尔能跳转到vectors.asm,但绝大多数情况不能。请专家帮我看下到底哪里出问题了。下面是我的初始化部分
void main( void )
{
   /* 初始化6747核 */

C6747_init();
 PINMUX11 = 0x00001100;   //UART1_TXD,UART1_RintXD
CSR&=0xfffe;
asm(" NOP 2 ");

uart1=C6747_UART_OPEN(1,57600);
 INTmux1=0x2E0000;                      // 指定uart1 到中断
asm(" NOP 2 ");                      
ISTP=0x80000000;
asm(" NOP 2 ");                        // 重置中断向量表到0C00h
ICR=0xfff0; asm(" NOP 2 ");
ISR=0x0;                            // 清除等待的中断
asm(" NOP 2 ");
IER=0xffff; CSR=CSR|0x1; //开总中断

UART_Handle C6747_UART_open( Uint16 id, Uint32 baudrate )
{
UART_Handle uart_handle;
Uint32 divisor;
volatile Uint16 dummy;

/*
* UART clk / baudrate
* = 150,000,000 / (900 * 16)
*/
divisor = 150000000 / ( baudrate * 16);

switch ( id )
{
case 0:
uart_handle = ( UART_Handle )&UART_MODULE_0;
break;
case 1:
uart_handle = ( UART_Handle )&UART_MODULE_1;
break;
case 2:
uart_handle = ( UART_Handle )&UART_MODULE_2;
break;
default:
return ( UART_Handle )-1;
}

uart_handle->regs->PWREMU_MGMT = 0; // Reset UART TX & RX components

C6747_wait( 100 );

uart_handle->regs->DLL = (divisor & 0xff); // Set baud rate
uart_handle->regs->DLH = (divisor >> 8);
uart_handle->regs->FCR = 0x0007; // Clear UART TX & RX FIFOs
uart_handle->regs->FCR = 0x0000; // Non-FIFO mode
uart_handle->regs->IER = 0x0007; // Enable interrupts
uart_handle->regs->LCR = 0x0003; // 8-bit words,
// 1 STOP bit generated,
// No Parity, No Stick paritiy,
// No Break control
uart_handle->regs->MCR = 0x0000; // RTS & CTS disabled,
// Loopback mode disabled,
// Autoflow disabled

uart_handle->regs->PWREMU_MGMT = 0xE001; // Enable TX & RX componenets

// Clear any pre-existing characters
dummy = uart_handle->regs->THR;
return uart_handle;
}

Shine:

如果是裸机代码的话,记得在中断子函数前面用interrupt关键字定义。

Shine:

回复 Shine:

如果用BIOS的dispatch的话,不需要加interrupt,不用HWI dispatch的话,也要加interrupt。

ju huang:

回复 Shine:

我的中断子函数有interrupt

 void interrupt UART1_INT() //中断响应函数{ volatile Uint8 ID; Uint8 datareceive=0; EVTCLR1|=0x4000;   //清除uart1的中断标志,uart1的中断号是46}
昨天是偶尔能进入vecters.asm。今天是彻底不行了

ju huang:

回复 Shine:

UART1中断标志IIR 的INTID 为2,IPEND 为0都是正常的

Shine:

回复 ju huang:

那看一下上一级的INTC中断控制器里的event flag和总中断标志位IFR相应的位有没有置1?

ju huang:

回复 Shine:

万分感谢,我查了下,INTC的的中断flag没问题。IFR的标志没有。是总中断的问题。然后我查了下总中断几个寄存器的定义,我现在用的例程的头文件C6747.h中是这样写的,

cregister unsigned int IER,IFR,CSR,ICR,ISTP,ISR; 这样写法对吗。      同时我没有查到IER,IFR的存储器地址,这个地址在哪个参考文档里呢。

几个寄存器的值:IER=0x0000FFF1  IFR=0x00000000  CSR=0x14000101

Tony Tang:

回复 ju huang:

ju huangcregister unsigned int IER,IFR,CSR,ICR,ISTP,ISR; 这样写法对吗。      同时我没有查到IER,IFR的存储器地址,这个地址在哪个参考文档里呢。

这是CPU寄存器,不是memory map register, 没有地址,这么写是对的,也可以用include c6x.h,然后用寄存名直接访问这几个寄存器。

ju huang:

回复 Tony Tang:

那专家帮我看下程序,我的初始化有没有问题,为什么IFR没有被置位。谢谢了

Shine:

回复 ju huang:

在ccs里看一下INTMUX1寄存器确实配置成0x2E0000了吧?你手动改一下IFR位看是否能进入中断子程序。

或者写个IFR判断语句然后设个断点跑,看一下IFR是否置位?

Tony Tang:

ju huangISTP=0x80000000;

确定中断向量表是在这个位置?你是如何把中断向表量固定到这的?

将IER清除,IFR有置位吗?

除了不进其它正常吗?

我看上面有点象是基于DSP/BIOS的工程,是吗?如果是,main里不需要打开全局中断。

赞(0)
未经允许不得转载:TI中文支持网 » 6747 uart 中断 求指导
分享到: 更多 (0)