EM9380是英創公司針對高速實時應用設計的一款雙CPU工控主板,主CPU采用了FreeScale 454MHz ARM9 iMX283, 從CPU采用的是Atmel公司的64MHz Cortex-M3。EM9380預裝了WinCE6.0操作系統,經過我們精心的設計,EM9380可實現最小為25uS 的實時控制應用。
EM9380與英創公司的另一款8串口工控主板EM9280的引出管腳高度兼容,具體可參考《EM9380與EM9280兼容設計》一文。 EM9380與EM9280的GPIO對應管腳完全一致,但在其各自復用的功能和軟件操作方法上有著較大的區別。下表是EM9380與EM9280 32位GPIO以及各自復用功能的對比。
PIN# | 信號名稱 | EM9280復用功能 | EM9380復用功能 |
CN1_27 | GPIO0 | COM2口CTS# | 復用定時器功能 |
CN1_28 | GPIO1 | COM2口RTS# | 復用定時器功能 |
CN1_29 | GPIO2 | 復用定時器功能 | |
CN1_30 | GPIO3 | 復用定時器功能 | |
CN1_31 | GPIO4 | PWM3 | |
CN1_32 | GPIO5 | PWM4 | |
CN1_33 | GPIO6 | PWM1 | PWM5 |
CN1_34 | GPIO7 | PWM2 | PWM6 |
CN1_35 | GPIO8 | AD0通道輸入 | |
CN1_36 | GPIO9 | AD1通道輸入 | |
CN2_15 | GPIO10 | COM6口RXD | AD2通道輸入 |
CN2_16 | GPIO11 | COM6口TXD | AD3通道輸入 |
CN2_17 | GPIO12 | AD4通道輸入 | |
CN2_18 | GPIO13 | AD5通道輸入 | |
CN2_19 | GPIO14 | AD6通道輸入 | |
CN2_20 | GPIO15 | AD7通道輸入 | |
CN2_21 | GPIO16 | COM2口CTS# | |
CN2_22 | GPIO17 | COM2口RTS# | |
CN2_23 | GPIO18 | COM6口RXD | |
CN2_24 | GPIO19 | COM6口TXD | |
CN2_25 | GPIO20 | PWM3 | PWM1 |
CN2_26 | GPIO21 | PWM4 | PWM2 |
CN2_27 | GPIO22 | I2C_SDA | I2C_SDA |
CN2_28 | GPIO23 | I2C_SCL | I2C_SCL |
CN2_29 | GPIO24 | IRQ1 | IRQ1 |
CN2_30 | GPIO25 | IRQ2 | IRQ2 |
CN2_31 | GPIO26 | IRQ3 | IRQ3 |
CN2_32 | GPIO27 | IRQ4 | IRQ4 |
CN2_33 | GPIO28 | SPI_MISO | SPI_MISO |
CN2_34 | GPIO29 | SPI_MOSI | SPI_MOSI |
CN2_35 | GPIO30 | SPI_SCLK | SPI_SCLK |
CN2_36 | GPIO31 | SPI_CS0N | SPI_CS0N |
從上表可以看出EM9380與EM9280的GPIO20~GPIO31功能完全一樣。而EM9380的GPIO0~GPIO15是從Cortex-M3從CPU引出、支持實時控制應用的引腳,可實現高速AD、高精度PWM、數字PID、脈沖計數等高速實時控制,這正是EM9380的特色所在。
在應用程序的設計上,EM9380的GPIO20~GPIO31使用與EM9280一樣的函數操作,EM9380的GPIO0~GPIO15則需要一組專門的API函數用來操作,這組API定義在mcu_api.h文件中,下面是對API函數的一個簡要說明。
// 打開MCU操作單元,獲取MCU的句柄。
HANDLE OpenMCU( int Index );
// 關閉MCU操作單元
BOOL CloseMCU( HANDLE hMCU );
// 獲取MCU的版本信息。
BOOL MCU_GetVInfo( HANDLE hMCU, PMCU_VER_INFO pMCU_VInfo );
// MCU GPIO操作:設置相關的GPIO位為輸出IO。
BOOL MCU_GPIO_OutEnable( HANDLE hMCU, UINT32 dwEnBits );
// MCU GPIO操作:設置相關的GPIO位為輸入IO。
BOOL MCU_GPIO_OutDisable(HANDLE hMCU, UINT32 dwDisBits );
// MCU GPIO操作:設置輸出GPIO位輸出高位。
BOOL MCU_GPIO_OutSet( HANDLE hMCU, UINT32 dwSetBits );
// MCU GPIO操作:設置輸出GPIO位輸出低位。
BOOL MCU_GPIO_OutClear( HANDLE hMCU, UINT32 dwClearBits );
// MCU GPIO操作:獲取相關輸入GPIO位狀態值。
BOOL MCU_GPIO_PinState( HANDLE hMCU, UINT32* pPinState );
// MCU GPIO操作:啟動實時監控輸入GPIO位狀態值。
BOOL MCU_GPIO_PinMonitor( HANDLE hMCU, UINT32* pPinState, UINT32 dwPeriod );
// MCU PWM操作:啟動/停止PWM通道, 啟動參數包括頻率、占空比和初始極性
// 輸入參數dwCh: PWM通道號, = 3, 4, 5, 6
// dwFreq: PWM輸出頻率,單位Hz
// dwDuty: PWM輸出占空比,單位.1%, 輸入范圍= 0-1000
// dwPol: PWM初始極性,= 0: 低電平, = 1: 高電平
BOOL MCU_PWM_CHANNEL( HANDLE hMCU, DWORD dwCh, DWORD dwFreq, DWORD dwDuty, DWORD dwPol );
// MCU ADC操作:啟動ADC通道常規數據采集
// 輸入參數dwChMode: AD通道模式= 0: 單端, = 1: 差分
// pBuf: AD數據Buffer
// dwBufSize: AD數據Buffer的長度,決定要采集的通道數, WORD長度對齊
BOOL MCU_ADC_Generic( HANDLE hMCU, DWORD dwChMode, WORD *pBuf, DWORD dwBufSize );
// MCU 等待實時數據。
// return TRUE: 接收到實時數據
// FALSE: no
BOOL WaitForData( HANDLE hMCU, DWORD dwTimeout );
// 功能: 讀取實時數據命令數據
// 返回值:MCU實時數據類型編號
// <0: 無數據
// =1: TYPE_MCU_GPIO_INFO
// =2: TYPE_MCU_ADC_INFO
DWORD MCU_Read( HANDLE hMCU, LPVOID pBuffer, DWORD Count );
“EM9380開發光盤\Sortware\C例程”目錄下的Mcu_TestSDK工程,詳細展示了上面API函數的使用方法,在使用這些API函數前,需要在自己的工程中鏈接對應的庫文件“mcusdk.lib”。
#pragma comment( lib, 'mcusdk.lib' )
mcusdk.lib實際上是為了方便用戶使用MCU功能(MCU即EM9380的從CPU)做的二次封裝,在mcusdk.lib庫內部依然調用的是標準流式驅動接口函數,比如通過CreateFile打開驅動句柄,通過DeviceIoControl與MCU驅動交互。利用這些標準驅動接口函數,用戶可以使用EM9380從CPU的更多高級功能,我們已經做了一些EM9380在高速實時控制方面應用的案例,這些例子演示了通過標準驅動接口函數操作MCU的方法。
相關閱讀:
成都英創信息技術有限公司 028-8618 0660