ARM下驱动中断读写问题
测试程序中read调用成功。寄存器也设置到了,测试中断引脚,是高电平,可没进中断服务程序,请问是什么原因?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
测试程序中read调用成功。寄存器也设置到了,测试中断引脚,是高电平,可没进中断服务程序,请问是什么原因?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(9)
代码贴出来撒,就这样说 谁知道是什么原因。
//TL16C554初始化
void Init_TLB(){
volatile unsigned char byRx;
int i;
TLB.RBR = (unsigned long )ioremap_nocache(TLB.nAddress, 4));
TLB.THR = (unsigned long )ioremap_nocache(TLB.nAddress, 4));
TLB.LSR = (unsigned long )ioremap_nocache(TLB.nAddress+0x28, 4));
TLB.MSR = (unsigned long )ioremap_nocache(TLB.nAddress+0x30, 4));
TLB.LCR = (unsigned long )ioremap_nocache(TLB.nAddress+0x18, 4));
TLB.FCR = (unsigned long )ioremap_nocache(TLB.nAddress+0x10, 4));
TLB.MCR = (unsigned long )ioremap_nocache(TLB.nAddress+0x20, 4));
TLB.DLL = (unsigned long )ioremap_nocache(TLB.nAddress, 4));
TLB.DLM = (unsigned long )ioremap_nocache(TLB.nAddress+0x08, 4));
TLB.IER = (unsigned long )ioremap_nocache(TLB.nAddress+0x08, 4));
TLB.SCR = (unsigned long )ioremap_nocache(TLB.nAddress+0x38, 4));
TLB.IIR = (unsigned long )ioremap_nocache(TLB.nAddress+0x10, 4));
TLB.sRecvHead = 0;
TLB.sRecvTail = 0;
TLB.sSendHead = 0;
TLB.sSendTail = 0;
// set FCR.FIFO允许,RXD复位,TXD复位,DMAmode=1,触发为14
TLB.FCR = 0xcf;
TLB.FCR) = 0xc9;
TLB.MCR)= 0x08;//使能外部串口通道
TLB.LCR = 0x83;//设置8bit
//特殊寄存器已打开,设置BPS
TLB.DLL=0x24;
TLB.DLM=0x00;
TLB.LCR =0x03;
TLB.IER=0x03;//接收保持和中断允许
byRx = TLB.RBR;//空读一次
i=0;
while(1){
//检查接收状态
byRx = TLB.LSR;
if(byRx&0x01){
byRx = TLB.RBR;
}
else
break;
//防止死循环
i++;
if(i > 4096)//每个UART最多只能缓存16个字节
break;
}
}
//TL16C554的接收
unsigned char TLB_Rxd(void){
volatile unsigned char byRx;
volatile unsigned char bySt;
int nRxCnt = 0;
while(nRxCnt < 512){
//检查接收状态
bySt = *(volatile unsigned char *)(TLB.LSR);
if(bySt&0x01){//数据就绪
byRx = *(volatile unsigned char *)(TLB.RBR);
TLB_RX(byRx);
}
else
break;
nRxCnt++;
}
return byRx;
}
static void UARTB_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
long flags;
save_flags_cli(flags);
unsigned char temp;
temp=TLB.IIR;
printk("TLB.IIR is %d\n",TLB.IIR);
switch(TLB.IIR) {
case 2:
printk(KERN_INFO "UARTB_transmited\n" );
break;
case 4:
case 6:
TLB_Rxd();
printk(KERN_INFO "UARTB_received\n" );
break;
default:
printk("Unknow interrupt type!");
break;
}
restore_flags(flags);
}
if (request_irq(INT_MPUIO_13, UARTB_interrupt, SA_INTERRUPT, DEVICE_NAME, NULL)) {
unregister_chrdev( TL16C554_MAJOR, DEVICE_NAME );
printk( DEVICE_NAME "can't request irqA \n" );
return (-1);
}
中断注册成功,测试INT_MPUIO_13角一直是高电平,可是没进入上面的中断程序,(如果进去了,应该是要打印TLB.IIR is %d\n",吧) 请问是为什么呢··谢谢
不太明白你使用的硬件,不过不能中断的话,可能是你注册的中断号跟你硬件连接不一致?或者在硬件初始化的时候,有把中断打开么?
两点建议:
1、注册的中断号是否正确?
2、虽然是高电平,但是,这个时候,全局中断是否打开了?本身这项中断是否使能了?
有时钟的话应该有全局中断。
对一下中断号,中断/引角是否是复用,配置是否正确
注册的中断和硬件号一致 ,申请中断成功了。什么叫初始化硬件时中断是否打开呢?怎么打开啊 ?我不知道怎么设置