假设我要编写一个自己的指令脚本, 来读取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]
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。