您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> [求助]BF518内核定时器中断开启时,串口中断... 
本帖共有1627个阅读者
发表帖子 发表投票 回复主题
[求助]BF518内核定时器中断开启时,串口中断反应迟钝或基本不反应
tianbianren(论坛新手)
tianbianren
头衔:社区公民
帮派:无帮无派
帖数:15
金钱:180
积分:14
注册时间:2011/8/1
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
[求助]BF518内核定时器中断开启时,串口中断反应迟钝或基本不反应
如题,当我把内核定时器的中断时间调长一点时,串口中断才会稍微有点反应,但是相当迟钝;如果时间短的话,串口中断直接不反应。是不是程序从低优先级的串口中断跳出,执行完高优先级的内核定时器程序后就不回到串口中断了啊??不会吧!!
下面是我的几个初始化函数和main函数中的初始化顺序:

short UartInit(unsigned char UartNum, unsigned long UartBitrate)
{
    unsigned short UartMmrOffset = 0;
    unsigned short UartDivisor   = 0;

    switch (UartNum) {
        case 0: UartMmrOffset = UART0_MMR_OFFSET; break;
        case 1: UartMmrOffset = UART1_MMR_OFFSET; break;
    }

    volatile unsigned short *pUartGctl = (volatile unsigned short*) (UART0_GCTL + UartMmrOffset);
    volatile unsigned short *pUartLcr  = (volatile unsigned short*) (UART0_LCR  + UartMmrOffset);
    volatile unsigned short *pUartDll  = (volatile unsigned short*) (UART0_DLL  + UartMmrOffset);
    volatile unsigned short *pUartDlh  = (volatile unsigned short*) (UART0_DLH  + UartMmrOffset);


    UartDivisor = (SCLK_MAX_Hz/ UartBitrate);//UartDivisor = (get_sclk_hz() / UartBitrate);
    UartDivisor += 8; // round up before divide by 16
    UartDivisor >>= 4;

    // First of all, enable UART clock.
    *pUartGctl = UCEN; //0x01 Enable UARTx Clocks

    // Write Divisor to the two 8-bit DL registers (DLH:DLL).
    *pUartLcr = DLAB;     //0x80 Divisor Latch Access
    *pUartDlh = ((UartDivisor & 0xFF00) >> 8);
    *pUartDll = ( UartDivisor & 0x00FF);

    // Clear DLAB again and set UART frame to 8 bits, no parity, 1 stop bit.
    // This may differ in other scenarious.
    *pUartLcr = 0x03;//WLS(8);

    return 0;
}
void UartInterruptsInit(void)
{
int iar2 = *pSIC_IAR2;
int imask0 = *pSIC_IMASK0;
// volatile int temp;

/* UART0 interrupt bits 23-19 of IAR1, setup for  IVG10 : 3 */
//          1111 0011 1111 1111 1111 1111 1111 1111
iar2  |= 0x03000000;  
    iar2  &= 0xF3FFFFFF;
    *pSIC_IAR2 = iar2;
    
register_handler(ik_ivg10, Uart0_ISR);


     imask0 |= 0x00400000;
     // bit 22 ----------0000 0000  0100 0000  0000 0000  0000 0000
*pSIC_IMASK0 = imask0;
*pUART0_IER = (ELSI|ERBFI);//ERBFI 0x01   Enable Receive Buffer Full Interrupt */
   //ETBEI 0x02   Enable Transmit Buffer Empty Interrupt
   //ELSI 0x04   Enable RX Status Interrupt
}
void Init_Timers(void)
{
/* active state, auto reload, generate interrupt */
*pTCNTL = TMPWR | TAUTORLD |TINT; //TMPWR     00000000 00000000 00000000 00000001   /* Timer Low Power Control, 0=low power mode, 1=active state */
//TAUTORLD  00000000 00000000 00000000 00000010   /* Timer auto reload */
//TINT      00000000 00000000 00000000 00000100   /* Timer generated interrupt 0=no interrupt has been generated, 1=interrupt has been generated (sticky) */
*pTPERIOD = TIMEOUT_PERIOD; //TIMEOUT_PERIOD 0x00002000  100000 00000000
*pTSCALE  = TIMEOUT_PERIOD/2;
// *pTCOUNT  = TIMEOUT_PERIOD;

/* enable the timer */
*pTCNTL |= TMREN; //TMREN     00000000 00000000 00000000 00001000   /* Timer enable, 0=disable, 1=enable */
}      //pTCNTL    00000000 00000000 00000000 00001111
/*******************************************************************
*   Function:    Init_Timer_Interrupts
*   Description: This function initialises the interrupts for Timer0
*******************************************************************/
void Init_Timer_Interrupts(void)
{
register_handler(ik_timer, Timer_ISR);
}


main函数中的初始化顺序
main()
{
Init_PLL();
GpioInit(0);
Init_Timers();
Init_Timer_Interrupts();
UartInit(0,115200);
UartInterruptsInit();
}

bf518学习中
等级:论坛新手 参考IP地址:*.*.*.*
2011/9/9 10:20:54
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

内核中断优先级高,且中断频繁的话,会影响中断优先级低的中断,会出现你说的现象,可以这样解决。当需要读取串口中断时,将内核中断屏蔽,待完成串口中断操作后再打开内核中断,以此来保护低优先级中断。


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2011/9/9 18:48:43
tianbianren(论坛新手)
tianbianren
头衔:社区公民
帮派:无帮无派
帖数:15
金钱:180
积分:14
注册时间:2011/8/1
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
恩,好的,我试试!

bf518学习中
等级:论坛新手 参考IP地址:*.*.*.*
2011/9/10 11:35:06
webom2008(论坛新手)
webom2008
头衔:社区公民
帮派:无帮无派
帖数:22
金钱:287
积分:29
注册时间:2013/9/9
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
楼主:我也是用core timer作为system tick,但是编译时,遇到Timer_ISR未定义的错误,不知错在哪里。求助?

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/9/25 16:28:56
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
你把
EX_INTERRUPT_HANDLER(Timer_ISR);
放到你中断初始化函数前面,声明一下。

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