ETA321是英創(chuàng)推出的基于STM32單片機(jī)的多功能擴(kuò)展模塊,可為英創(chuàng)現(xiàn)有的WinCE系統(tǒng)增加AD、DA、PWM、脈沖計(jì)數(shù)等功能。ETA321使用了一片STM32F103RCT6單片機(jī),STM32F103RCT6通過(guò)其USB Device接口與英創(chuàng)工控主板連接通訊,STM32在WinCE系統(tǒng)中被當(dāng)做一個(gè)串口設(shè)備,英創(chuàng)主板作為上位機(jī)已經(jīng)固化了STM32的USB驅(qū)動(dòng)程序,同時(shí)我們封裝了一組STM32與英創(chuàng)WinCE系統(tǒng)通訊的API接口函數(shù),客戶可以利用我們提供的接口函數(shù),把成熟的實(shí)時(shí)控制算法移植到ETA321上,快速實(shí)現(xiàn)與英創(chuàng)主板的數(shù)據(jù)通訊。在使用這些API函數(shù)時(shí),需要遵從以下約定:
1、通訊以數(shù)據(jù)包(結(jié)構(gòu)體)作為基本單元,每次通訊收/發(fā)一個(gè)數(shù)據(jù)包,每個(gè)數(shù)據(jù)包最大為255字節(jié),數(shù)據(jù)包第一個(gè)字節(jié)為本數(shù)據(jù)包的字節(jié)長(zhǎng)度,第二個(gè)字節(jié)為命令碼,數(shù)據(jù)包的其它內(nèi)容由用戶自定義。
2、數(shù)據(jù)包的第二個(gè)命令碼字節(jié)用于表明本數(shù)據(jù)包的“身份”。當(dāng)STM32接收到數(shù)據(jù)包,得到命令碼后,會(huì)根據(jù)命令碼執(zhí)行相應(yīng)的操作,當(dāng)上位機(jī)接收到數(shù)據(jù)包后,根據(jù)命令碼就可以知道接收到了什么數(shù)據(jù)。0~127命令碼表示常規(guī)命令和數(shù)據(jù),128~255表示實(shí)時(shí)數(shù)據(jù)或?qū)崟r(shí)命令。
3、數(shù)據(jù)包和命令碼的定義在WinCE上位機(jī)端和STM32端必須完全一致。STM32必須對(duì)接收到的每個(gè)命令數(shù)據(jù)包回復(fù)一個(gè)相同命令碼的應(yīng)答包,如果沒(méi)有數(shù)據(jù)需要回復(fù),可簡(jiǎn)單回復(fù)通用應(yīng)答數(shù)據(jù)包。
下面是命令碼和數(shù)據(jù)包定義示例:
/************************* 定義命令代碼*************************/
#define MCU_GENERIC_VER_INFO 0
#define MCU_GENERIC_ADC 1
// STM32返回的實(shí)時(shí)數(shù)據(jù)命令碼
#define MCU_REALTIME_ADC (0 + MCU_REALTIME_DATA)
/*********************** 定義數(shù)據(jù)包(結(jié)構(gòu)體) **********************/
// 獲取單片機(jī)固件版本信息
typedef struct
{
BYTE ucSize; // size of the structure < 256
BYTE ucCmd; // = MCU_GENERIC_VER_INFO
WORD wMajor; // major version number
WORD wMinor; // minor version number
char ucName[24]; // name of realtime driver
} MCU_VER_INFO, *PMCU_VER_INFO; // struct for Version Info
// ADC命令
typedef struct
{
BYTE ucSize; // size of the structure < 256
BYTE ucCmd; // = MCU_GENERIC_ADC
BYTE ucCH; // AD通道
DWORD dwSamplingRate; // 采樣率
} MCU_ADC, *PMCU_ADC; // struct for Version Info
// STM32通用應(yīng)答數(shù)據(jù)包
typedef struct
{
BYTE ucSize; // size of the structure < 256
BYTE ucCmd; //
BYTE ucRerult;
}MCU_GENERIC_REPLY, *PMCU_GENERIC_REPLY;
WinCE上位機(jī)API函數(shù)
在WinCE上使用我們提供的API函數(shù)時(shí),需要在工程中包含以下3個(gè)文件
#include "mcu_class.h" // API接口函數(shù)定義
#include "mcuCmdInfo.h" // 命令碼和數(shù)據(jù)包定義
#pragma comment(lib, "mcu_class.lib") // 包含庫(kù)文件
下面是API函數(shù)說(shuō)明:
/**
@brief 打開(kāi)MCU設(shè)備,初始化相關(guān)環(huán)境
@param None
@retval = 返回true 打開(kāi)成功
**/
BOOL OpenMCU();
/**
@brief 給STM32發(fā)送控制指令
@param *pCmdInfo[in]:符合約定數(shù)據(jù)結(jié)構(gòu)的命令數(shù)據(jù)
@param *pBuf[out]: 接收STM32返回?cái)?shù)據(jù)的數(shù)據(jù)緩存,此參數(shù)可為NULL
@param dwBufSize[in]:數(shù)據(jù)緩存大小
@retval = true 發(fā)送成功,返回true僅表示數(shù)據(jù)通訊成功,命令執(zhí)行情況可查看pBuf返回的數(shù)據(jù)
**/
BOOL SendCmd(BYTE *pCmdInfo, BYTE *pBuf, DWORD dwBufSize = 0);
/**
@brief 關(guān)閉MCU,釋放相關(guān)資源
@param None
@retval = true 關(guān)閉成功
**/
BOOL CloseMCU();
/**
@brief 接收STM32實(shí)時(shí)回傳數(shù)據(jù)的回調(diào)函數(shù)指針,當(dāng)接收到128~255命令碼時(shí)被調(diào)用
**/
REPLYPRO MCUReplyPro;
STM32單片機(jī)API函數(shù)
在編寫STM32程序時(shí),同樣應(yīng)該包含和上位機(jī)定義一致的"mcuCmdInfo.h"文件。STM32使用API函數(shù)定義如下:
/**
* @brief USBD初始化及CDC類初始化
* @param None
* @retval None
**/
void USBCDC_Init(void);
/**
* @brief 查檢是否有上位機(jī)發(fā)來(lái)的命令
* @param pBuf:用于接收命令的數(shù)據(jù)緩存
* @param pBuf:用于接收命令的數(shù)據(jù)緩存大小
* @retval =0:未接收到命令 >0:接收到數(shù)據(jù)包的長(zhǎng)度(字節(jié)數(shù))
**/
uint8_t CheckCommand(uint8_t *pBuf, uint32_t nBufSize);
/**
* @brief 向上位機(jī)發(fā)送數(shù)據(jù)
* @param 要發(fā)送的數(shù)據(jù)緩存
* @param 要發(fā)送的數(shù)據(jù)字節(jié)數(shù)
* @retval 返回發(fā)送字節(jié)數(shù)
**/
uint8_t SendData(uint8_t *pBuf, uint32_t nSendBytes);
STM32應(yīng)用程序首先需要調(diào)用USBCDC_Init初始化USB接口,然后調(diào)用CheckCommand函數(shù)檢查是否接收到上位機(jī)發(fā)來(lái)的命令,再根據(jù)命令碼執(zhí)行相應(yīng)的操作,調(diào)用SendData函數(shù)發(fā)送應(yīng)答數(shù)據(jù)或?qū)崟r(shí)數(shù)據(jù)。
下面是WinCE系統(tǒng)中實(shí)現(xiàn)讀取ETA321版本信息和實(shí)時(shí)波形數(shù)據(jù)采樣的示例程序:
#include "stdafx.h"
#include "mcu_class.h" // API接口函數(shù)定義
#include "mcuCmdInfo.h" // 命令碼和數(shù)據(jù)包定義
#pragma comment(lib, "mcu_class.lib") // 包含庫(kù)文件
// 聲明實(shí)時(shí)數(shù)據(jù)處理回調(diào)函數(shù)
static void CALLBACK MCUReplyPro(BYTE *buf, DWORD buflen);
int _tmain(int argc, _TCHAR* argv[])
{
MCU_CLASS mcu;
BYTE Buf[MAX_BUF_SIZE];
TCHAR csBuf[MAX_BUF_SIZE];
DWORD dwSize, dwCnt = 0;
MCU_VER_INFO getVerInfo;
MCU_ADC adc;
size_t RetrunSize;
// 打開(kāi)MCU設(shè)備
if(!mcu.OpenMCU()) {
return -1;
}
// 指定MCU實(shí)時(shí)數(shù)據(jù)處理回調(diào)函數(shù)
mcu.MCUReplyPro = MCUReplyPro;
// 調(diào)用SenCmd函數(shù)之前必須初始化的個(gè)變量
getVerInfo.ucSize = sizeof(MCU_VER_INFO); // 發(fā)送的命令結(jié)構(gòu)體大小(字節(jié)數(shù))
getVerInfo.ucCmd = MCU_GENERIC_VER_INFO; // 命令代碼:獲取MCU版本信息
dwSize = sizeof(Buf); // 用于接收MCU數(shù)據(jù)的緩存大小
if(mcu.SendCmd((BYTE *)(&getVerInfo), (BYTE *)&getVerInfo, dwSize)) {
// 窄字符轉(zhuǎn)寬字符
mbstowcs_s(&RetrunSize, csBuf, _countof(csBuf), getVerInfo.ucName, _TRUNCATE);
OutputMessage(TEXT("mcu-ver %x-%x '%s'\r\n"), getVerInfo.wMajor,getVerInfo.wMinor,csBuf);
}
else {
OutputMessage(TEXT("send command:%d failed!!!\r\n"), getVerInfo.ucCmd);
}
// 調(diào)用SenCmd函數(shù)之前必須初始化的變量
adc.ucSize = sizeof(MCU_ADC); // 發(fā)送的命令結(jié)構(gòu)體大小(字節(jié)數(shù))
adc.ucCmd = MCU_GENERIC_ADC; // 命令代碼:獲取MCU版本信息
adc.ucCH = 0; // 設(shè)備ADC通道
adc.dwSamplingRate = 10000; // 設(shè)置ADC采樣率KHz
if(!mcu.SendCmd((BYTE *)(&adc), NULL)) {
OutputMessage(TEXT("send command:%d failed!!!\r\n"), adc.ucCmd);
}
while(1) {
Sleep(1000);
if(dwCnt > 10) // 10S后退出
break;
}
adc.dwSamplingRate = 0; // 停止ADC采集
if(!mcu.SendCmd((BYTE *)(&adc), NULL)) {
OutputMessage(TEXT("send command:%d failed!!!\r\n"), adc.ucCmd);
}
Sleep(1000);
// 關(guān)閉MCU設(shè)備,釋放相關(guān)資源
mcu.CloseMCU();
return 0;
}
// 實(shí)時(shí)數(shù)據(jù)處理回調(diào)函數(shù)
void CALLBACK MCUReplyPro(BYTE *buf, DWORD buflen)
{
PMCU_ADC_DATA pADCData;
static DWORD cnt = 0;
pADCData = (PMCU_ADC_DATA)buf;
cnt += pADCData->ucSize;
// 處理實(shí)時(shí)數(shù)據(jù)......
}
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6096瀏覽量
36124
發(fā)布評(píng)論請(qǐng)先 登錄
信創(chuàng)浪潮下,國(guó)產(chǎn)主板有什么新的發(fā)展機(jī)遇?

比斯特電池組綜合性能測(cè)試機(jī):關(guān)鍵功能模塊剖析

芯盛智能榮獲2024年信息技術(shù)應(yīng)用創(chuàng)新工作委員會(huì)卓越貢獻(xiàn)成員單位
飛騰助力首屆教育信息技術(shù)應(yīng)用創(chuàng)新大賽圓滿落幕
有方科技參編的信息技術(shù)團(tuán)體標(biāo)準(zhǔn)發(fā)布
龍芯中科助力2024首屆教育信息技術(shù)應(yīng)用創(chuàng)新大賽成功舉辦
光伏電站無(wú)人機(jī)智能巡檢系統(tǒng)各功能模塊

中科創(chuàng)達(dá)榮獲2024年軟件和信息技術(shù)服務(wù)優(yōu)秀企業(yè)
MES系統(tǒng)的功能模塊詳解
英銳恩科技,以實(shí)力打造國(guó)產(chǎn)單片機(jī)替代品牌!
信創(chuàng)國(guó)產(chǎn)化背景下的工控主板發(fā)展現(xiàn)狀
SSD架構(gòu)與功能模塊詳解

評(píng)論