freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于fpga的rs485通信接口設(shè)計-資料下載頁

2024-11-10 03:47本頁面

【導讀】設(shè)計題目:基于FPGA的RS485通信

  

【正文】 H_REG2 FPGA_REG(0x0D) //波特率寄器高 define FPGA_BAUND_RATE_L_REG2 FPGA_REG(0x0E) //波特率寄器低 define FPGA_CTRL_REG2 FPGA_REG(0x0F) //控制寄存器 定義物理地址及 RAM 區(qū)長度。由于 FPGA 提供 16 個寄存器給 CPU 訪問,因此長度應(yīng)該為 16 字節(jié)。而 EMC_nCS3 片選信號掛了兩個器件: FGPA 和 CAN,因此根據(jù)原理圖, FPGA 的地址應(yīng)該為 A16 對應(yīng)的片選 ,為 0xXXXXXXXX XXXXX010 00000000 00000000=0xE3020200: define FPGA_ADDR_RANGE 16 define FPGA_PHYSICAL_ADDR 0xE3020200 static volatile UINT8 *g_lpBaseFPGA = NULL。 static volatile INTC_REGS_T *pINTCRegs = NULL。 物理地址映射: PHYSICAL_ADDRESS pa。 DWORD dwThreadID。 BOOL bResult = FALSE。 /* * 分配 FPGA 訪問空間 */ = FPGA_PHYSICAL_ADDR。 g_lpBaseFPGA = (volatile UINT8 *) MmMapIoSpace(pa, FPGA_ADDR_RANGE, FALSE)。 if(g_lpBaseFPGA == NULL) { RETAILMSG(1, (TEXT(FPGA0 VirtualAlloc failed.\r\n)))。 return FALSE。 } (2)中斷驅(qū)動程序設(shè)計 第 31 頁 (共 41 頁) 各種外設(shè)時通過中斷和 WinCE 核心進行通信的。過程是: 1)硬件設(shè)備產(chǎn)生硬件中斷 2) OAL 完成硬件中斷到邏輯中斷( SYSINTR)的轉(zhuǎn)換( OEMinit 函數(shù)實現(xiàn)) 3)系統(tǒng)識別邏輯中斷,同時進行處理。 分兩步:中斷服務(wù)例程( ISR)和中斷服務(wù)線程( IST)。 ISR 主要負責中斷響應(yīng),一般要求短小精干,對執(zhí)行效率有很高的要求,只負責最簡單的工程,即響應(yīng)設(shè)備并返回一個中斷標示給核心。而對中斷的實際處理則在 IST 中。 ISR 的主要作用: 1 如果數(shù)據(jù)可能丟失或者被下一個中斷改寫,則 ISR 將數(shù)據(jù)從設(shè)備讀到緩沖區(qū) 2 ISR 清除設(shè)備上的中斷條件 3 ISR 向內(nèi)核返回一個 SYSINTR 4 內(nèi)核設(shè)置供 IST 等待的中斷事件 5 調(diào)度程序調(diào)度等待的 IST 以執(zhí)行后續(xù)的中斷服務(wù)操作。 ISR 分為靜態(tài) ISR 和可安裝的 ISR。 靜態(tài) ISR 只能靜態(tài)被編譯到核心,在運行時不能改變,和 IST 通信是單向的,ISRIST,支持中斷嵌套,可以使用核心的堆棧。 可安裝的 ISR 由內(nèi)核管理程序從 DLL 中動態(tài)加載,是由 ISTISR,多個 ISR 可以同一個 中斷請求相連,按加載驅(qū)動的順序進行調(diào)度,共享內(nèi)存的使用比較靈活。 IST 是運行在用戶空間的中斷服務(wù)線程,負責接到系統(tǒng)邏輯中斷號之后的處理,使用中首先要注冊自己,再與一個系統(tǒng)事件關(guān)聯(lián)。 一般來說,使用 InterruptInitialize 函數(shù)注冊自己,使用 WaitForSingleObject函數(shù)來等待終端請求事件。系統(tǒng)調(diào)度器會調(diào)度這個線程來進行中斷的處理。 流接口驅(qū)動一般在 XXX_Init 里面做這些事情, IST 是 的一個附屬線程。 具體實現(xiàn)過程是: 1 創(chuàng)建一個事件 2 得到系統(tǒng)的中斷號 3 創(chuàng)建一個掛起的中斷服務(wù)線程( IST) 4 設(shè)置中斷服務(wù)線程的優(yōu)先級別 5 調(diào)用函數(shù) InterruptInitialize 通知系統(tǒng)注冊中斷 6 回復中斷服務(wù)線程 IST,IST 開始服務(wù) 因此, WinCE6 的中斷發(fā)生和處理過程總結(jié)如下: 第 32 頁 (共 41 頁) ? 硬件設(shè)備產(chǎn)生中斷信號 ? 中斷信號被異常處理程序( ExceptionHandle)捕獲 ? 異常處理程序激活掛載中斷服務(wù)例程 ISR ? ISR 響應(yīng)硬件,并操作硬件設(shè)備 ? ISR 將中斷映射 ? ISR 設(shè)置相應(yīng)的核心中斷標示 ? 中斷服務(wù)調(diào)度程序與 OAL 例程合作,設(shè)置中斷事件,操縱在特定中斷事件上的等 待隊列 ? OAL 操作硬件,改變硬件的中斷狀態(tài),將其設(shè)置為開中斷 ? 中斷事件激活系統(tǒng)調(diào)度程序, 在相隔一段時間以后調(diào)度中斷服務(wù)線程 ? IST 處理中斷的相關(guān)事件,并調(diào)用系統(tǒng)的支持庫 ? 系統(tǒng)支持庫訪問硬件設(shè)備,完成對硬件設(shè)備的操作 LPC3250 支持 74 個中斷源,每個中斷都有中斷使能位,并可被配置為不同優(yōu)先級,以及電平或者邊沿觸發(fā)方式,可根據(jù)條件對原始中斷狀態(tài)以及掩碼中斷寄存器訪問。因此此款 ARM9 芯片對中斷的支持是非常強大的,滿足本課題的設(shè)計要求。 LPC3250所有的外部引腳中斷通過同步電路連接到兩個子中斷控制器 SIC1和 SIC2,它們的四個輸出被連接到主中斷控制器( MIC)的四個輸入端,建議配置這些輸入為低電平有效。下圖為 sub2 中斷控制器基地址分配。 圖 Slave2( Sub2)中斷控制寄存器基地址 本 FPGA 中斷采用 Slave interrupt controller 2,因此,定義其基地址為: define SIC2_BASE 0x40010000 /* Slave2 int ctrl registers base*/ 物理地址與虛擬地址映射: = SIC2_BASE。 pINTCRegs = (volatile INTC_REGS_T *) MmMapIoSpace(pa, sizeof (INTC_REGS_T), FALSE)。 if(pINTCRegs == NULL) { RETAILMSG(1, (TEXT(FPGA0 INT Reg map failure.\r\n)))。 } 在分配完 FPGA 訪問空間后,就需要從 OAL 請求一個 SYSINTR 值: if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, amp。g_nFpgaIrq, 第 33 頁 (共 41 頁) sizeof(UINT32), amp。g_nFpgaSysIntr, sizeof(UINT32), NULL)) { RETAILMSG(1, (_T( failed to request sysintr value for FPGA interrupt \r\n)))。 goto exit。 } 請求成功后, 在 驅(qū)動的初始化函數(shù)中通過 CreateEvent的方式來創(chuàng)建事件對象, 就可以創(chuàng)建中斷線程: g_htFpgaIST = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) FPGA_IntrThread, NULL, 0, amp。dwThreadID)。 if (g_htFpgaIST == 0) { RETAILMSG(1, (_T( create thread failed\r\n)))。 //goto exit。 return FALSE。 } g_hInterrupt = CreateEvent(NULL, FALSE, FALSE, NULL)。 g_hRxEvent = CreateEvent(NULL, FALSE, FALSE, NULL)。 最后在驅(qū)動的 IST 中,當硬件中斷產(chǎn)生時,就通過 SetEvent 的方式來通知應(yīng)用程序: static DWORD WINAPI FPGA_IntrThread(LPVOID pContext) { DWORD dwRet。 if (!(InterruptInitialize(g_nFpgaSysIntr, g_hInterrupt, 0, 0))) { RETAILMSG(1, (_T( Interrupt initialize failed\r\n)))。 return 0。 } RETAILMSG(1,(LWait for interrupt0!!!!!!!!!!!!~~\r\n))。 /*中斷線程開始運行 */ while (!g_bKillIST) { dwRet = WaitForSingleObject(g_hInterrupt, INFINITE)。 if (g_bKillIST == TRUE) return 0。 SetEvent(g_hRxEvent)。 RETAILMSG(1,(Linterrupt0 happend!!!!!!!!!!!!~~\r\n))。 InterruptDone(g_nFpgaSysIntr)。 第 34 頁 (共 41 頁) } return 0。 } 這樣的方式也需要應(yīng)用程序創(chuàng)建同樣的事件對象,應(yīng)用程序也可以用一個線程來等待這個事件被觸發(fā)時就讀取數(shù)據(jù)。 由于 FPGA 中斷引腳通過 GPI_2 來復用,因此,定義其邏輯中斷號: UINT32 g_nFpgaIrq = OAL_INTR_IRQ_GPI_02。 /* GPI_02 的物理中斷號及邏輯中斷號 */ 下圖是 Sub2 中斷控制寄存器的實際定義,可以看到, GPI_2 的中斷源是在該寄存器第 24 位,因此為了便于使用軟件編程,設(shè)置 GPI_2 的掩碼為左移 24 位,即可以定義該中斷。 define GPIO_IRQ_MASK (124) 圖 Slave2( Sub2)中斷控制寄存器定義 然后在函數(shù) EINT_ConfigInterruptPin中配置外部中斷引腳并使能為 上升 沿觸發(fā): 第 35 頁 (共 41 頁) VOID EINT_ConfigInterruptPin(VOID) { pINTCRegsatr |= GPIO_IRQ_MASK。 //上升沿或者高電平觸發(fā) pINTCRegsapr |= GPIO_IRQ_MASK。 //上升沿觸發(fā) } 由于 pINTCRegs 是 INTC_REGS_T 類型的實例,而 INTC_REGS_T 定義如下: /* Interrupt Controller Module Register Structure */ typedef struct { volatile UNS_32 er。 /* Enable Register */ volatile UNS_32 rsr。 /* Raw Status Register */ volatile UNS_32 sr。 /* Status Register */ volatile UNS_32 apr。 /* Activation Polarity select Register */ volatile UNS_32 atr。 /* Activation Type select Register */ volatile UNS_32 itr。 /* Interrupt Type select Register */ } INTC_REGS_T。 其中, APR 寄存器表示中斷極選擇: 0 表示通過低電平或者下降沿產(chǎn)生, 1 表示通過高電平或者上升沿產(chǎn)生; ATR 寄存器表示中斷激活類型選擇: 0 表示電平敏感, 1 表示邊沿敏感; 將兩者都設(shè)置為 1,則表示 GPI_2 中斷是由上升沿產(chǎn)生。 在完成 FPGA 以及中斷的初始化和相關(guān)寄存器的設(shè)置后,下面的工作就是具體通過DeviceIO Control 函數(shù)和相應(yīng)的 IO_Control Code 來執(zhí)行具體的讀寫操作。用戶模式下的DeviceIO Control 函數(shù)可以發(fā)送特定的 IO_Control Code 給一個特定的設(shè)備驅(qū)動程序,使相應(yīng)的設(shè)備執(zhí)行該動作。 實現(xiàn)的具體函數(shù)為 PGA_IOControl。分別為讀取 FPGA 寄存器和寫入 FPGA 寄存器功能。 swi
點擊復制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1