假設我要編寫一個自己的指令腳本, 來讀取MCU的關鍵信息,關鍵字為mcu, 文件命名為shell_mcu.c; 當輸入“mcu rd 0”時顯示MCU的FLASH大小,輸入“mcu rd 1”時讀取MCU的唯一ID信息。
shell_mcu.c源代碼:
/*********************************Copyright (c)*********************************
**
**? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?FIVE工作組
**
**---------------------------------File Info------------------------------------
** File Name:? ? ? ? ? ? ? ?shell_mcu.c
** Last modified Date:? ? ? 2017/9/17 15:13:57
** Last Version:? ? ? ? ? ? V1.0
** Description:? ? ? ? ? ? ?shell測試
**
**------------------------------------------------------------------------------
** Created By:? ? ? ? ? ? ? wanxuncpx
** Created date:? ? ? ? ? ? 2017/9/17 15:14:08
** Version:? ? ? ? ? ? ? ? ?V1.0
** Descriptions:? ? ? ? ? ? none
**------------------------------------------------------------------------------
** HW_CMU:? ? ? ? ? ? ? ? ? STM32F103
** Libraries:? ? ? ? ? ? ? ?STM32F10x_StdPeriph_Lib_V3.5.0
** version? ? ? ? ? ? ? ? ? V3.5
*******************************************************************************/
/******************************************************************************
更新說明:
******************************************************************************/
/******************************************************************************
*********************************? 編 譯 控 制 ********************************
******************************************************************************/
#define MCU_SHELL? ? ? ? ? ? ? ?//注釋掉時屏蔽iap shell功能
#include "xc_shell.h"? ? ? ?//Shell支持文件,含bool,uint8_t..以及串口數據收發操作
/******************************************************************************
********************************* 文件引用部分 ********************************
******************************************************************************/
/*---------------------*
*? ? ?模塊驅動引用
*----------------------*/
//#include "net_w5500.h"
#ifdef MCU_SHELL
/******************************************************************************
********************************** Shell實例 **********************************
******************************************************************************/
/*---------------------*
*? ? ? CLI指令服務
*----------------------*/
extern bool Shell_MCU_Service(void * pcBuff, uint16_t len );
/*---------------------*
*? ? ? ?CLI 結構
*----------------------*/
const Cmd_Typedef_t CLI_McuMsg=
{
//識別關鍵字
"mcu",
//幫助內容
"[mcu contorls]\r\n"
" mcu rd \t\t- Read FLASH information.\r\n"
"\r\n",
//處理函數
&Shell_MCU_Service,
//附帶數據
0,
#ifdef SHELL_USE_YMODEM
//存儲介質
NULL,
#endif
};
/*---------------------*
*? ? ?CLI鏈表節(輸出)
*----------------------*/
Cmd_List_t? McuList? = {&CLI_McuMsg? ? ? ,NULL}; //IAP指令鏈表
/******************************************************************************
********************************* 函 數 聲 明 *********************************
******************************************************************************/
/******************************************************************************
/ 函數功能:STM32F103控制函數
/ 修改日期:2015/7/14 20:22:02
/ 輸入參數:none
/ 輸出參數:none
/ 使用說明:需要執行約10s
******************************************************************************/
static bool FLASH_ioctl(uint8_t cmd,void * param)
{
#define UID_ADDR? ? ? ? ? ? 0x1FFFF7E0? //閃存容量寄存器,值對應KB單位
#define MAC_ADDR? ? ? ? ? ? 0x1FFFF7E8? //MCU的唯一ID號,共12個字節
#define UID_SIZE? ? ? ? ? ? 2? ? ? ? ? ?//UID的字節數
#define MAC_SIZE? ? ? ? ? ? 12? ? ? ? ? //MAC的字節數
//step1: 檢查參數
if(!param)return false;
//step2: 處理數據
switch(cmd){
case 0 : {? ? ? ?//獲取FLASH的的UID
uint16_t * ptDst = (uint16_t *)((uint32_t)param+1);
*ptDst = *(uint16_t *)UID_ADDR;
*(uint8_t? *)param =? UID_SIZE;
return true;
}
case 1 : {? ? ? ?//獲取芯片的MAC地址
uint32_t * ptDst = (uint32_t *)((uint32_t)param+1);
uint32_t * ptSrc = (uint32_t *)MAC_ADDR;
*ptDst++ = *ptSrc++;
*ptDst++ = *ptSrc++;
*ptDst++ = *ptSrc++;
*(uint8_t? *)param = MAC_SIZE;
return true;
}
default:return false;
}
}
/******************************************************************************
/ 函數功能:文件系統Shel指令處理
/ 修改日期:2013/9/10 19:04:15
/ 輸入參數:輸入當前的程序版本
/ 輸出參數:none
/ 使用說明:none
******************************************************************************/
bool Shell_MCU_Service(void * pcBuff, uint16_t len )
{
uint8_t? ? *ptRxd;? ? ? ? ? //用于接收指令處理
int? ? ? ? ?i;
uint16_t? ? retval;
uint8_t? ? ?buff[32];
//處理指令
//--------------------------------------------------------------------------
ptRxd = (uint8_t *)pcBuff;
if(StrComp(ptRxd,"rd ")) //讀取FLASH信息
{
int wval;
if(1 != sscanf((void *)ptRxd,"%*s%d",&wval) )return false;
if( wval>2 )return false;
if(0==wval) {
FLASH_ioctl(0,buff);
retval = *(uint16_t *)(buff+1) ;
printf("->Flash:\t%dKB\r\n",retval);
return true;
}
else if(1==wval) {
FLASH_ioctl(1,buff);
printf("->MAC:\t ");
for(i=0; iprintf("%02X\r\n",buff[i+1]);
return true;
}
else return false;
}
else if(StrComp(ptRxd,"help\r\n"))? ? ? //指令幫助
{
shell_SendStr((void *)CLI_McuMsg.pcHelpStr);
return true;
}
else return false;
}
/******************************************************************************
***********************************? ?END? ************************************
******************************************************************************/
#endif
5.2 實現步驟
1) 將該文件添加到工程下。
2) 在main.c中用extern 引用McuList,源代碼為:
/*---------------------*
*? ? ?Shell指令鏈表
*----------------------*/
extern Cmd_List_t? McuList;
3)在main.c初始化時添加:
//----------------------------------------------------------
//step1: shell初始化
shell_Init(115200,ledx_cfg);? ? ? ? //初始化shell接口
CLI_AddCmd(&McuList);? ? ?//添加模塊指令到鏈表
4)編譯工程文件。
5)下載到開發板運行即可在終端下看到新支持的CLI指令:
<1> 大家可根據此模板和方法,添加許多自己的指令和功能
<2> 限于篇幅,Ymodem文件傳輸,IAP升級、RTOS支持等將在下一期為大家講解
[1] [2]
本網站轉載的所有的文章、圖片、音頻視頻文件等資料的版權歸版權所有人所有,本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如果本網所選內容的文章作者及編輯認為其作品不宜公開自由傳播,或不應無償使用,請及時通過電子郵件或電話通知我們,以迅速采取適當措施,避免給雙方造成不必要的經濟損失。