您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 技术讨论区 -> BF512中断问题
本帖共有661个阅读者
发表帖子 发表投票 回复主题
BF512中断问题
justall666(论坛新手)
justall666
头衔:社区公民
帮派:无帮无派
帖数:8
金钱:163
积分:11
注册时间:2013/7/25
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
BF512中断问题
各位大侠好:
目前遇到的问题是这样的,BF512上没有搭载操作系统,采用定时器进行调度,我在一个2ms的定时器里做的事情比较多,大概耗费200us左右,因此在串口进行接收数据时就会丢包,目前将串口的中断优先级调为IVG9  定时器的优先级为IVG11,同样丢包,如何解决该问题望大家指导。
定时器设置函数
*pSIC_IAR4 &= 0xffffff0f;
*pSIC_IAR4 |= 0x00000050;
register_handler(ik_ivg12, TIMER_ISR);

串口设置函数
//串口1中断初始化
*pSIC_IAR3 &= 0xffffff00;
*pSIC_IAR3 |= 0x00000022;   //初始化Uart1 发送和接收中断
register_handler(ik_ivg9,UART1_ISR); //注册中断处理函数

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/10/16 17:59:34
justall666(论坛新手)
justall666
头衔:社区公民
帮派:无帮无派
帖数:8
金钱:163
积分:11
注册时间:2013/7/25
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
附上串口初始化

//串口1初始化函数
void UART1_init(void)
{
unsigned int div;
unsigned int rate;
*pPORTH_FER |= PH6|PH7;
*pPORTH_MUX |= (1<<4)|(1<<6);
div = BF512_SYSCLK/Uart0_Bardrate/16;  
*pUART1_LCR=DLAB;// DLAB=1 允许访问DLL 和DLH寄存器
asm("SSYNC;");
*pUART1_DLL=div;
asm("SSYNC;");
*pUART1_DLH=div>>8; //DLL DLH分别赋值
asm("SSYNC;");
*pUART1_LCR=0x03|PEN|EPS;//  8为长度偶效验
asm("SSYNC;");
//*pUART0_IER=ERBFI|ETBEI;;//  接收中断发送中断允许
*pUART1_IER=ERBFI|ETBEI;//  接收中断发送中断允许
asm("SSYNC;");
*pUART1_GCTL=UCEN;     //使能串口  
asm("SSYNC;");
}


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/10/16 21:08:53
justall666(论坛新手)
justall666
头衔:社区公民
帮派:无帮无派
帖数:8
金钱:163
积分:11
注册时间:2013/7/25
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
串口中断服务程序
EX_INTERRUPT_HANDLER(UART1_ISR)
{
unsigned char data;
if((*pUART1_LSR&0x1)&&(*pUART1_IER&0x1))
{
    data = *pUART1_RBR;
    *sUart1ReceiveInPtr = data;
    sUart1ReceiveInPtr++;  
    Uart1PushData(data);
}

if((*pUART1_LSR&0x20)&&(*pUART1_IER&0x2))
{
  if(sUart1TransmitOutPtr ==sUart1TransmitInPtr  )  //如果缓冲区中无数据发送,则关闭中断
    {  
     sUart1isTxBufferEmpty = TRUE;  //发送缓存区为空
        *pSIC_IMASK0 &= ~0x2000000;     //关闭发送中断
        asm("SSYNC;");  
    }
    else
    {
          sUart1isTxBufferEmpty = FALSE;
         data=*sUart1TransmitOutPtr;
        *pUART1_THR  = data ;
        sUart1TransmitOutPtr++;

   }
}

}

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/10/16 21:10:07
justall666(论坛新手)
justall666
头衔:社区公民
帮派:无帮无派
帖数:8
金钱:163
积分:11
注册时间:2013/7/25
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
定时器初始化

void Timer1_Init(void)
{
    unsigned int  timer0_cnt;
    timer0_cnt=BF512_SYSCLK*2/1000+1;
    *pTIMER1_PERIOD = timer0_cnt;
    *pTIMER1_WIDTH = timer0_cnt/2;
    asm("SSYNC;");
    *pTIMER1_CONFIG = PWM_OUT|PERIOD_CNT|IRQ_ENA;
    asm("SSYNC;");
}

定时器中断

EX_INTERRUPT_HANDLER(TIMER_ISR)
{

if(*pTIMER_STATUS&0x1)
{
*pTIMER_STATUS = 0x0001;
  IntControl();
}
// 2ms中断供AD采样以及系统调用
if(*pTIMER_STATUS&0x2)
{
*pTIMER_STATUS = 0x0002;
Sample_AD();  
Task_Operation();
EnableUart1Tx();
EnableUart0Tx();

                }
}

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/10/16 21:14:26
justall666(论坛新手)
justall666
头衔:社区公民
帮派:无帮无派
帖数:8
金钱:163
积分:11
注册时间:2013/7/25
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

问题急啊,求版主解答


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/10/17 17:26:38
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
系统存在多个中断同时工作时,中断会相互影响,你可以将串口发送的代码放在定时器的中断函数中,这样不会被定时器中断影响。中断优先级在系统中 IVG7优先等级最高,越往后越低。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/10/18 9:54:02
justall666(论坛新手)
justall666
头衔:社区公民
帮派:无帮无派
帖数:8
金钱:163
积分:11
注册时间:2013/7/25
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

谢谢版主的解答;

目前是接收的数据有错误的包,经过调试发现是定时器中断在执行的过程中,串口高优先级中断无法打断低优先级的定时器中断,中断无法嵌套,请版主解答BF512如何设置中断嵌套


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/10/18 11:08:56
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
7信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
通常是,当你需要使用另一个中断时,就将其他中断屏蔽掉。避免相互干扰。等执行完了,再打开其他中断。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/10/18 21:46:25
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154085 Call, 1 Queries, Processed in 0.031250 second(s),