{
/* 初始化6747核 */
C6747_init();
PINMUX11 = 0x00001100; //UART1_TXD,UART1_RintXD
CSR&=0xfffe;
asm(" NOP 2 ");
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里不需要打开全局中断。