如题,当我把内核定时器的中断时间调长一点时,串口中断才会稍微有点反应,但是相当迟钝;如果时间短的话,串口中断直接不反应。是不是程序从低优先级的串口中断跳出,执行完高优先级的内核定时器程序后就不回到串口中断了啊??不会吧!!
下面是我的几个初始化函数和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();
}