static void __CAN_IntInit(uint8_t byCanNo) { //挂中断线 if(byCanNo==0) { //发送中断线 Int_Register(CN_INT_LINE_CAN1_RX0); Int_SetClearType(CN_INT_LINE_CAN1_RX0,CN_INT_CLEAR_AUTO); Int_IsrConnect(CN_INT_LINE_CAN1_RX0,CAN_ISR_Handler); Int_SettoAsynSignal(CN_INT_LINE_CAN1_RX0); Int_ClearLine(CN_INT_LINE_CAN1_RX0); Int_RestoreAsynLine(CN_INT_LINE_CAN1_RX0); //发送中断线 Int_Register(CN_INT_LINE_CAN1_RX1); Int_SetClearType(CN_INT_LINE_CAN1_RX1,CN_INT_CLEAR_AUTO); Int_IsrConnect(CN_INT_LINE_CAN1_RX1,CAN_ISR_Handler); Int_SettoAsynSignal(CN_INT_LINE_CAN1_RX1); Int_ClearLine(CN_INT_LINE_CAN1_RX1); Int_RestoreAsynLine(CN_INT_LINE_CAN1_RX1); //发送中断线 Int_Register(CN_INT_LINE_CAN1_SCE); Int_SetClearType(CN_INT_LINE_CAN1_SCE,CN_INT_CLEAR_AUTO); Int_IsrConnect(CN_INT_LINE_CAN1_SCE,CAN_ISR_Handler); Int_SettoAsynSignal(CN_INT_LINE_CAN1_SCE); Int_ClearLine(CN_INT_LINE_CAN1_SCE); Int_RestoreAsynLine(CN_INT_LINE_CAN1_SCE); } // else // { // //发送中断线 // Int_Register(CN_INT_LINE_CAN2_RX0); // Int_SetClearType(CN_INT_LINE_CAN2_RX0,CN_INT_CLEAR_AUTO); // Int_IsrConnect(CN_INT_LINE_CAN2_RX0,CAN_ISR_Handler); // Int_SettoAsynSignal(CN_INT_LINE_CAN2_RX0); // Int_ClearLine(CN_INT_LINE_CAN2_RX0); // Int_RestoreAsynLine(CN_INT_LINE_CAN2_RX0); // // //发送中断线 // Int_Register(CN_INT_LINE_CAN2_RX1); // Int_SetClearType(CN_INT_LINE_CAN2_RX1,CN_INT_CLEAR_AUTO); // Int_IsrConnect(CN_INT_LINE_CAN2_RX1,CAN_ISR_Handler); // Int_SettoAsynSignal(CN_INT_LINE_CAN2_RX1); // Int_ClearLine(CN_INT_LINE_CAN2_RX1); // Int_RestoreAsynLine(CN_INT_LINE_CAN2_RX1); // // //发送中断线 // Int_Register(CN_INT_LINE_CAN2_SCE); // Int_SetClearType(CN_INT_LINE_CAN2_SCE,CN_INT_CLEAR_AUTO); // Int_IsrConnect(CN_INT_LINE_CAN2_SCE,CAN_ISR_Handler); // Int_SettoAsynSignal(CN_INT_LINE_CAN2_SCE); // Int_ClearLine(CN_INT_LINE_CAN2_SCE); // Int_RestoreAsynLine(CN_INT_LINE_CAN2_SCE); // } }
//----初始化tick--------------------------------------------------------------- //功能: 初始化定时器,并连接tick中断函数,启动定时器. //参数: 无 //返回: 无 //备注: 本函数是移植敏感函数. //----------------------------------------------------------------------------- void __DjyInitTick(void) { Int_IsrConnect(cn_int_line_timer_event,__DjyIsrTick); Int_SettoAsynSignal(cn_int_line_timer_event); //tick中断被设为异步信号 Int_RestoreAsynLine(cn_int_line_timer_event); timeSetEvent(CN_CFG_TICK_US/mS,CN_CFG_TICK_US/mS,&TimerCallBack,0,TIME_PERIODIC); }
void main(int argc, char *argv[]) { MSG msg; LARGE_INTEGER litmp; SetProcessAffinityMask(GetCurrentProcess(), 1); hInstance = GetModuleHandle(NULL); pHeapList.CessionNum = 1; pHeapList.HeapAlign = 0; pHeapList.HeapBottom = DjyosHeap; pHeapList.HeapTop = pHeapList.HeapBottom + sizeof(DjyosHeap); pHeapList.PageSize = 128; strcpy(pHeapList.name,"sys"); pHeapList.name[4] = '\0'; // a = CreateDirectory(_TEXT("djyfs"),NULL); // a = CreateDirectory(_TEXT("djyfs\\sys"),NULL); Heap_StaticModuleInit(0); Int_Init(); QueryPerformanceFrequency(&litmp); s64g_freq = litmp.QuadPart; Int_IsrConnect(cn_int_line_switch_context,switch_context); Int_SettoAsynSignal(cn_int_line_switch_context); //tick中断被设为异步信号 Int_RestoreAsynLine(cn_int_line_switch_context); // printf("VC 编译器版本:%d\n\r",_MSC_VER); Sys_Start(); // 主消息循环: while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return ; }
// ============================================================================= // 功能: 初始化UART对应的中断线,并初始化中断入口函数 // 参数:SerialNo,串口号 // 返回: 无 // ============================================================================= static void __UART_IntInit(u32 SerialNo) { u8 IntLine; if(SerialNo == CN_UART0) IntLine = CN_INT_LINE_UART0_RX_TX; else if(SerialNo == CN_UART1) IntLine = CN_INT_LINE_UART1_RX_TX; else if(SerialNo == CN_UART2) IntLine = CN_INT_LINE_UART2_RX_TX; else if(SerialNo == CN_UART3) IntLine = CN_INT_LINE_UART3_RX_TX; else if(SerialNo == CN_UART4) IntLine = CN_INT_LINE_UART4_RX_TX; else if(SerialNo == CN_UART5) IntLine = CN_INT_LINE_UART5_RX_TX; else return; if(true == Int_Register(IntLine)) { Int_IsrConnect(IntLine,UART_ISR); Int_SetClearType(IntLine,CN_INT_CLEAR_AUTO); Int_SettoAsynSignal(IntLine); Int_ClearLine(IntLine); Int_RestoreAsynLine(IntLine); } }
// ============================================================================= // 功能: IIC中断配置函数 // 参数: IntLine,中断线 // isr,中断服务函数指针 // 返回: 无 // ============================================================================= static void __IIC_IntConfig(u32 IntLine,u32 (*isr)(ptu32_t)) { Int_Register(IntLine); Int_IsrConnect(IntLine,isr); Int_SettoAsynSignal(IntLine); Int_ClearLine(IntLine); //清掉初始化产生的发送fifo空的中断 Int_RestoreAsynLine(IntLine); }
// ============================================================================= // 功能: IIC中断配置函数 // 参数: IntLine,中断线 // isr,中断服务函数指针 // 返回: 无 // ============================================================================= static void __IIC_IntConfig(u32 IntLine,u32 (*isr)(ufast_t)) { Int_IsrConnect(cn_int_line_TWII,__IIC_ISR); Int_SettoAsynSignal(cn_int_line_TWII); Int_ClearLine(cn_int_line_TWII); //清掉初始化产生的发送fifo空的中断 Int_RestoreAsynLine(cn_int_line_TWII); }
// ============================================================================= // 功能: SPI中断配置函数 // 参数: IntLine,中断线 // 返回: 无 // ============================================================================= static void __SPI_IntConfig(u8 IntLine) { //中断线的初始化 Int_Register(IntLine); Int_SetClearType(IntLine,CN_INT_CLEAR_AUTO); Int_IsrConnect(IntLine,SPI_ISR); Int_SettoAsynSignal(IntLine); Int_ClearLine(IntLine); Int_RestoreAsynLine(IntLine); }
// ============================================================================= // 函数功能:module_init_timer // SHARC21469的GP timer初始化 // 输入参数: // 输出参数: // 返回值 : // 说明 : // ============================================================================= void GPTimer_ModuleInit(void) { struct tagTimerChip Sharc21469GPtimer; Int_IsrConnect(cn_int_line_GPTMR0I,__GPTimer0_ISR); Int_SettoAsynSignal(cn_int_line_GPTMR0I); Int_ClearLine(cn_int_line_GPTMR0I); //清掉初始化产生的发送fifo空的中断 Int_RestoreAsynLine(cn_int_line_GPTMR0I); Int_IsrConnect(cn_int_line_GPTMR1I,__GPTimer1_ISR); Int_SettoAsynSignal(cn_int_line_GPTMR1I); Int_ClearLine(cn_int_line_GPTMR1I); //清掉初始化产生的发送fifo空的中断 Int_RestoreAsynLine(cn_int_line_GPTMR1I); *pTM0CTL = TIMODEPWM | PRDCNT | IRQEN; // configure the timer0 *pTM0W = 1; // timer0 width *pTM1CTL = TIMODEPWM | PRDCNT | IRQEN; // configure the timer1 *pTM1W = 1; // timer1 width register Sharc21469GPtimer.chipname = "SHARC21469GPTimer"; Sharc21469GPtimer.timerhardalloc = __GPTimer_Alloc; Sharc21469GPtimer.timerhardfree = __GPTimer_Free; Sharc21469GPtimer.timerhardctrl = __GPTimer_Ctrl; TimerHard_RegisterChip(&Sharc21469GPtimer); // =============下面代码仅做测试使用=================================== /* struct tagGPTimerHandle *testTimer; //step1:分配一个定时器 testTimer=__GPTimer_Alloc(30000000, __GPTimer0_ISR); //step2:设置定时周期 // __GPTimer_SetCycle(testTimer, 30000000); //step3:使能中断 __GPTimer_EnInt(testTimer); //开始计数 __GPTimer_StartCount(testTimer); */ }
// ============================================================================= // 功能: SPI中断配置函数 // 参数: IntLine,中断线 // 返回: 无 // ============================================================================= static void __SPI_IntConfig(void) { u8 IntLine = cn_int_line_espi; //中断线的初始化 Int_Register(IntLine); Int_IsrConnect(IntLine,SPI_ISR); Int_SettoAsynSignal(IntLine); Int_SetLineTrigerType(IntLine,EN_INT_TRIGER_HIGHLEVEL); Int_ClearLine(IntLine); Int_RestoreAsynLine(IntLine); }
// ============================================================================= // 函数功能:__GPTimer_Alloc // 分配定时器 // 输入参数:cycle,定时器周期 // timerisr,定时器的中断处理函数 // 输出参数: // 返回值 :分配的定时器句柄,NULL则分配不成功 // 说明 : // ============================================================================= ptu32_t __GPTimer_Alloc(u32 cycle,fnTimerIsr timerisr) { u8 timerno; u8 i=0; u8 irqline; struct tagGPTimerHandle *timer; ptu32_t timerhandle; //原子操作,防止资源竞争 atom_low_t timeratom; timeratom = Int_LowAtomStart(); timer=&s_tGPTimerHandle[0]; if(!timer->timerstate) { timerno=timer->timerno; } else { timer=&s_tGPTimerHandle[1]; if(!timer->timerstate) { timerno=timer->timerno; } else //没有的话直接返回就可以了,用不着再啰嗦了 { return NULL; } } Int_LowAtomEnd(timeratom); //原子操作完毕 irqline = sgHaltimerIrq[timerno]; timer = &s_tGPTimerHandle[timerno]; timer->cycle = cycle; timer->timerno = timerno; timer->irqline = irqline; timer->timerstate = CN_TIMER_ENUSE; //好了,中断号和定时器号码都有了,该干嘛就干嘛了。 //先设置好定时器周期 //__P1020PicTimer_PauseCount(timer); __GPTimer_SetCycle(timer,cycle); //设置定时器中断,先结束掉该中断所有的关联相关内容 Int_CutLine(irqline); Int_IsrDisConnect(irqline); Int_EvttDisConnect(irqline); Int_SettoAsynSignal(irqline); Int_IsrConnect(irqline, timerisr); timerhandle = (ptu32_t)timer; return timerhandle; }
//----初始化命令行设备--------------------------------------------------------- //功能: 如名 //参数: 无 //返回: 无意义 //----------------------------------------------------------------------------- ptu32_t ModuleInstall_Cmd(ptu32_t para) { tagDevHandle cmd_dev; pMultiplexCmd = NULL; MplCmdStatus = CN_MULTIPLEX_SENSINGBIT_WRITE;//初始时可写不可读 Ring_Init( &recv_ring_buf, (u8 *)cmd_ptcl_recv_buf, cmd_buf_len); //以下建立windows 终端输入设备 cmd_dev = Driver_DeviceCreate( NULL,"windows_cmd", NULL,NULL, (devWriteFunc) cmd_DriverWrite, (devReadFunc ) cmd_DriverRead, (devCtrlFunc ) cmd_DriverCtrl, cmd_MultiplexAdd, 0 ); if(cmd_dev == NULL) goto exit_from_add_device; // pg_cmd_hdl = Driver_OpenDevice("windows_cmd",O_RDWR,0); //打开右手句柄 Int_IsrConnect(cn_int_line_cmd,cmd_int); Int_SettoAsynSignal(cn_int_line_cmd); Int_RestoreAsynLine(cn_int_line_cmd); win32_scanf = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)win32_scanf_pro, 0, 0, NULL ); SetThreadAffinityMask( win32_scanf, 1 ); hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); hStdIn = GetStdHandle(STD_INPUT_HANDLE); /* hNewScreenBuffer = CreateConsoleScreenBuffer( GENERIC_READ | GENERIC_WRITE, // read/write access FILE_SHARE_READ | FILE_SHARE_WRITE, // shared NULL, // default security attributes CONSOLE_TEXTMODE_BUFFER, // must be TEXTMODE NULL); // reserved; must be NULL SetConsoleActiveScreenBuffer(hNewScreenBuffer); */ return 1; exit_from_add_device: return 0; }
// ============================================================================= // 函数功能:__AtTimer_Alloc // 分配定时器 // 输入参数:timerisr,定时器的中断处理函数 // 输出参数: // 返回值 :分配的定时器句柄,NULL则分配不成功 // 说明 : // ============================================================================= ptu32_t __AtTimer_Alloc(fntTimerIsr timerisr) { u8 timerno; u8 irqline; struct AtTimerHandle *timer; ptu32_t timerhandle; //原子操作,防止资源竞争 atom_low_t timeratom; timeratom = Int_LowAtomStart(); //寻找空闲的timer timerno = __AtTimer_GetFirstZeroBit(gs_dwAtTimerBitmap); if(timerno < CN_ATTIMER_NUM)//还有空闲的,则设置标志位 { gs_dwAtTimerBitmap = gs_dwAtTimerBitmap | (CN_ATTIMER_BITMAP_MSK<< timerno); Int_LowAtomEnd(timeratom); //原子操作完毕 } else//没有的话直接返回就可以了,用不着再啰嗦了 { Int_LowAtomEnd(timeratom); //原子操作完毕 return NULL; } PMC_EnablePeripheral(CN_PERI_ID_TC0 + timerno); irqline = sgHaltimerIrq[timerno]; timer = &stgTimerHandle[timerno]; timer->cycle = 0; timer->timerno = timerno; timer->irqline = irqline; timer->timerstate = CN_TIMER_ENUSE; //好了,中断号和定时器号码都有了,该干嘛就干嘛了。 //先设置好定时器周期 __AtTimer_PauseCount(timer); // __AtTimer_SetCycle(timer,cycle); //设置定时器中断,先结束掉该中断所有的关联相关内容 Int_Register(irqline); Int_CutLine(irqline); Int_IsrDisConnect(irqline); Int_EvttDisConnect(irqline); Int_SettoAsynSignal(irqline); Int_IsrConnect(irqline, timerisr); timerhandle = (ptu32_t)timer; return timerhandle; }
// ============================================================================= // 功能:DM9000中断初始化。DM9000中断引脚接到CPU的GPIO引脚,因此需将该引脚配置为外部 // 中断,并配置触发电平;同时需连接中断线到中断系统 // 参数:无 // 返回值 : // ============================================================================= void DM9000_IntInit(void) { //配置外部引脚EINT7/GPF7 pg_gpio_reg->GPFCON &= ~(3<<14); pg_gpio_reg->GPFCON |= (2<<14); //配置为输入 pg_gpio_reg->EXTINT0 &= ~(7<<28); pg_gpio_reg->EXTINT0 |= (4<<28); //配置上升沿触发 pg_gpio_reg->EINTPEND |= (1<<7); pg_gpio_reg->EINTMASK &= (~(01<<7)); u32 DM9000_ISR_Handler(ufast_t IntLine); //DM9000的中断引脚输出中断信号到CPU的EINT7 Int_IsrConnect(cn_int_line_eint4_7,DM9000_ISR_Handler); Int_SettoAsynSignal(cn_int_line_eint4_7); Int_ClearLine(cn_int_line_eint4_7); Int_RestoreAsynLine(cn_int_line_eint4_7); }
//----初始化uart对应的中断----------------------------------------------------- //功能: 初始化uart对应的中断线,并初始化中断入口函数 //参数:SerialNo,串口号 //返回: 无 //----------------------------------------------------------------------------- void __UART_IntInit(u32 SerialNo) { uint32_t int_line; if(SerialNo == CN_UART0) int_line = CN_INT_LINE_UART0; else if(SerialNo == CN_UART1) int_line = CN_INT_LINE_UART1; else if(SerialNo == CN_USART0) int_line = CN_INT_LINE_USART0; else int_line = CN_INT_LINE_USART1; Int_SetClearType(int_line,CN_INT_CLEAR_PRE); Int_IsrConnect(int_line,UART_ISR); Int_SettoAsynSignal(int_line); Int_ClearLine(int_line); Int_RestoreAsynLine(int_line); }
// ============================================================================= // 函数功能:__P1020PicTimer_Alloc // 分配定时器 // 输入参数:cycle,定时器周期 // timerisr,定时器的中断处理函数 // 输出参数: // 返回值 :分配的定时器句柄,NULL则分配不成功 // 说明 : // ============================================================================= ptu32_t __P1020PicTimer_Alloc(u32 cycle,fnTimerIsr timerisr) { u8 timerno; u8 irqline; struct tagP1020PicTimerHandle *timer; ptu32_t timerhandle; //原子操作,防止资源竞争 atom_low_t timeratom; timeratom = Int_LowAtomStart(); //寻找空闲的timer timerno = __P1020PicTimer_GetFirstZeroBit(gs_dwP1020PicTimerBitmap); if(timerno < CN_P1020PICTIMER_NUM)//还有空闲的,则设置标志位 { gs_dwP1020PicTimerBitmap = gs_dwP1020PicTimerBitmap | (CN_P1020PICTIMER_BITMAP_MSK<< timerno); Int_LowAtomEnd(timeratom); //原子操作完毕 } else//没有的话直接返回就可以了,用不着再啰嗦了 { Int_LowAtomEnd(timeratom); //原子操作完毕 return NULL; } irqline = sgHaltimerIrq[timerno]; timer = &stgP1020TimerHandle[timerno]; timer->cycle = cycle; timer->timerno = timerno; timer->irqline = irqline; timer->timerstate = CN_TIMER_ENUSE; //好了,中断号和定时器号码都有了,该干嘛就干嘛了。 //先设置好定时器周期 __P1020PicTimer_PauseCount(timer); __P1020PicTimer_SetCycle(timer,cycle); //设置定时器中断,先结束掉该中断所有的关联相关内容 Int_CutLine(irqline); Int_IsrDisConnect(irqline); Int_EvttDisConnect(irqline); Int_SettoAsynSignal(irqline); Int_SetClearType(irqline,CN_INT_CLEAR_PRE); Int_IsrConnect(irqline, timerisr); timerhandle = (ptu32_t)timer; return timerhandle; }
int main( void ) { /****************UART SET*******************/ *pPICR2 &= ~(0x1F); //Sets the UART0 receive interrupt to P12 *pPICR2 |= (0x13<<0); initPLL_DDR2(); *pUART0LCR=0; *pUART0IER = UARTRBFIE; // enables UART0 receive interrupt /****************SYS INIT*******************/ initDPI(); initUART(); Init_LEDs(); Init_PushButtons(); sysreg_bit_clr(sysreg_MODE1, IRPTEN ); /* disable global interrupts */ /* unmask individual interrupts */ (*pDAI_IRPTL_PRI) = (SRU_EXTMISCA1_INT | SRU_EXTMISCA2_INT); /* make sure interrupts latch on the rising edge */ (*pDAI_IRPTL_RE) = (SRU_EXTMISCA1_INT | SRU_EXTMISCA2_INT); /* setup the IRQ pins to use the pushbuttons */ (*pSYSCTL) |= (IRQ1EN | IRQ2EN); sysreg_bit_set(sysreg_MODE2, (IRQ1E | IRQ2E) ); /* enable IRQ interrupts and make DAI interrupts high priority */ sysreg_bit_set(sysreg_IMASK, (IRQ1I | IRQ2I | DAIHI) ); sysreg_bit_clr(sysreg_IMASKP, (IRQ1I | IRQ2I | DAIHI) ); sysreg_bit_set(sysreg_LIRPTL, P12IMSK ); sysreg_bit_clr(sysreg_LIRPTL, P12IMSKP ); sysreg_bit_clr(sysreg_IRPTL, (IRQ1I | IRQ2I) ); sysreg_bit_clr(sysreg_LIRPTL, P12I ); /* register the interrut handlers */ Int_Init(); Int_IsrConnect(cn_int_line_IRQ2I,SW9_IRQ2_handler); Int_RestoreRealLine(cn_int_line_IRQ2I); Int_IsrConnect(cn_int_line_IRQ1I,SW8_IRQ1_handler); Int_RestoreAsynLine(cn_int_line_IRQ1I); Int_IsrConnect(cn_int_line_DAII,__int_engine_dai); Int_RestoreAsynLine(cn_int_line_DAII); Int_IsrConnect(cn_int_line_P12I,UARTisr); Int_RestoreAsynLine(cn_int_line_P12I); Int_CutTrunk(); Int_ContactTrunk(); sysreg_bit_clr(sysreg_IRPTL, (IRQ1I | IRQ2I) ); NOP;NOP; sysreg_bit_clr(sysreg_LIRPTL, P12I ); NOP;NOP; sysreg_bit_set(sysreg_MODE1, NESTM ); /* enable interrupts nest */ sysreg_bit_set(sysreg_MODE1, IRPTEN ); /* enable global interrupts */ // 测试通过 // atom_high_test=Int_HighAtomStart(); // Int_HighAtomEnd(atom_high_test); // atom_low_test=Int_LowAtomStart(); // Int_LowAtomEnd(atom_low_test); // 测试通过 Int_TapLine(cn_int_line_IRQ2I); // Int_TapLine(cn_int_line_DAII); // Int_TapLine(cn_int_line_P12I); Int_TapLine(cn_int_line_IRQ1I); // 测试通过 // bool_value=Int_QueryLine(cn_int_line_IRQ2I); // bool_value=Int_QueryLine(cn_int_line_IRQ1I); // bool_value=Int_QueryLine(cn_int_line_DAII); // bool_value=Int_QueryLine(cn_int_line_P12I); // 测试通过 // Int_CutLine(cn_int_line_SFT3I); // Int_CutLine(cn_int_line_P17I); // Int_CutLine(cn_int_line_IRQ2I); /****************UART TEST******************/ xmitUARTmessage(welcomemessage,sizeof(welcomemessage)); xmitUARTmessage("CYG Copyright \n\r",sizeof("CYG Copyright \n\r")); while(1) { Blink_LED(10000000); // Int_TapLine(cn_int_line_IRQ2I); // xmitUARTmessage("CYG Copyright \n\r",sizeof("CYG Copyright \n\r")); // Int_TapLine(cn_int_line_DAII); } /* Begin adding your custom code here */ return 0; }