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的方法。
相关阅读:
《EM9380多通道AD数据采集》
《EM9380多路任意脉冲发生器及应用》
-
嵌入式主板
+关注
关注
7文章
6085浏览量
35196
发布评论请先 登录
相关推荐
评论