HML_FwLib系列在镜像中的使用说明
镜像预装核心功能,但支持外部扩展,如果需要外部扩展,可以将HML_FwLib或相关源码放置于windows系统盘中合适的位置即可。
镜像下载:
机器人工程专业实践镜像2021版-含现代控制理论、机器人控制器、ROS2、ESP32、Webots和导航实践(tianbot_mini)
- github.com/MCU-ZHISHAN-IoT?tab=repositories
- blog.csdn.net/michaelchain/article/details/119627800
除了之前提及的博客:
HML_FwLib_STC89使用笔记(单片机课程补充资料)
其他芯片支持如下:
很惊喜的发现有8051专款啦!!!
其中最强大的功能是???
zcli!!!
官方源码如下(引用):
/*****************************************************************************/
/** * \file zcli.c* \author Weilun Fong | wlf@zhishan-iot.tk* \date 2020/02/08* \brief a simple CLI demo file entirely runs on MCU, including basic* information print functions and a I\O control function* \note zCLI is just a toy for fun, don't expected rich functions because* of limited on-chip resource. However, user can still develop a* new CLI based on it* This demo is inspired by https://github.com/nhivp/msp430-cli* \version v0.3* \ingroup example* \remarks test-board: ZM2.1; test-MCU: STC89C52RC, integrated XRAM: 256B(* make interface variable XRAM needed to set as 1, because its unit* is KB ...)
******************************************************************************//*** \note please disable following HML compile macro in hml/conf.h because of * limited on-chip zone:* (1) __CONF_COMPILE_EXTI* (2) __CONF_COMPILE_TIM2, __CONF_HAVE_TIM2, __CONF_HAVE_T2MOD*//****************************************************************************** header file ******************************************************************************/
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include "hml/hml.h"/****************************************************************************** macro ******************************************************************************//*** \brief baudrate of zcli*/
#define ZCLI_BAUDRANTE 9600/*** \brief zcli max arguments number support*/
#define ZCLI_MAX_ARGS 3/*** \brief time stamp*/
#define ZCLI_TIMESTAMP 20200209
#define ZCLI_TIMESTAMP_STRING "20200209"/*** \brief version code*/
#define ZCLI_VERSION 0001
#define ZCLI_VERSION_MAJOR ((ZCLI_VERSION / 100) % 100)
#define ZCLI_VERSION_MINOR (ZCLI_VERSION % 100)/*** \brief length define for zcli*/
#define ZCLI_CMD_LEN 8
#define ZCLI_ARGS_LEN 8
#define ZCLI_STRING_LEN 24
#define ZCLI_TABLE_LEN(x) sizeof(x)/sizeof(*(&x[0]))/*** \brief ASCII character mark*/
#define ASCII_BS 0x08 /* backspace */
#define ASCII_TAB 0x09 /* horizontal tab */
#define ASCII_CR 0x0D /* carriage return */
#define ASCII_DEL 0x7F /* delete *//****************************************************************************** type define ******************************************************************************/
/*** \brief compatible with putchar() function change* \quote (sdcc official) sdcc 3.7.0: Changed putchar() prototype from void putchar(char)* to int putchar(int) to improve standard-compliance and allow error reporting.*/
#if ((__SDCC_VERSION_MAJOR > 3) || ((__SDCC_VERSION_MAJOR == 3 ) && (__SDCC_VERSION_MINOR >= 7)))
typedef int PUTCHAR_T;
typedef int PUTCHAR_CH_T;
#else
typedef void PUTCHAR_T;
typedef char PUTCHAR_CH_T;
#endif/*** \brief function pointer for zcli action*/
typedef int8_t (*zcli_action_t)(void);/****************************************************************************** structure define ******************************************************************************//*** \brief command module*/
typedef struct
{char command[ZCLI_CMD_LEN];char description[64];zcli_action_t action;
} zcli_command;/****************************************************************************** variable define ******************************************************************************//*** \brief command list*/
static __code zcli_command zcli_command_table[] =
{/* Command, Description, Command Action Function */{ "?" , "? - Same as \"h\"" , zcli_action_h },{ "c" , "c - Clear screen" , zcli_action_c },{ "h" , "h - Show help information" , zcli_action_h },{ "hi" , "hi - Say hello" , zcli_action_hi },{ "io" , "io <port> <val> - Set value of target IO, e.g.: io p1 0xab", zcli_action_io },{ "si" , "si - Show system information" , zcli_action_si },{ "v" , "v - Show version information" , zcli_action_v }
};/*** \brief zcli PS1*/
static const char __code zcli_str_ps1[] = "\r\n> ";/*** \brief clear one character*/
static const char __code zcli_str_backspace[] = "\b \b";/*** \brief other zcli string*/
static const char __code terminal_str_clearLine[] = "\33[2K\r\r> ";
static const char __code zcli_str_authorInfo[] = "\r\nWritten by Weilun Fong \
<wlf@zhishan-iot.tk>";
static const char __code zcli_str_commited[] = "\r\n\033[1m\033[32mCommitted!\033[0m";
static const char __code zcli_str_copyrigth[] = "\r\nzCLI 2020 (c) ZHISHAN-IoT";
static const char __code zcli_str_hello[] = "\r\nHello! I'm zCLI!";
static const char __code zcli_str_helpNote[] = "\r\nPlease input command as follows:";
static const char __code zcli_str_invalidCommand[] = "\r\nWtf? Enter '?' for usage";
static const char __code zcli_str_invalidCommandFormat[] = "\r\nInvalid command format!";
static const char __code zcli_str_noSuchIo[] = "\r\nNo such I/O!";
static const char __code zcli_str_reboot[] = "\r\nMCU will reboot after 3s ";
static const char __code zcli_str_systemInfo[8][32] = { \"\r\nWTD\t: yes", \"\r\nI\\O\t: 32+5 I\\O pins", \"\r\nTimer\t: 3 16-bit timer", \"\r\nClock\t: 11.0592MHz", \"\r\nBoard\t: ZM2.1", \"\r\nArch\t: Intel mcs-51", \"\r\nMCU\t: STC Micro STC89C52RC"
};/*** \brief UART receive buffer*/
char __pdata g_buf[ZCLI_STRING_LEN];/*** \brief buffer for command keyword and parameters*/
char __pdata g_commandBuffer[ZCLI_CMD_LEN]; /* buffer for read command */
char __pdata g_lastInput[ZCLI_STRING_LEN]; /* store last input */
char __pdata g_commandArguments[ZCLI_MAX_ARGS][ZCLI_ARGS_LEN];/*** \brief buffer index*/
uint16_t g_index = 0;/*** \brief invalid command flag*/
bool g_isValidCommand = false;/*** \brief printf() can't print data in CODE/XRAM area, so use UART_sendString* instead of it*/
#define zcli_printString(__VA_STRING__) UART_sendString(__VA_STRING__)/****************************************************************************** function declare ******************************************************************************/
uint16_t axtoi(char *str);
void sys_init(void);
int8_t zcli_action_c(void);
int8_t zcli_action_h(void);
int8_t zcli_action_hi(void);
int8_t zcli_action_io(void);
int8_t zcli_action_re(void);
int8_t zcli_action_si(void);
int8_t zcli_action_v(void);
void zcli_clearMemory(void);
void zcli_getCommand(char* cmd);
void zcli_getArguments(void);
void zcli_startup(void);/*****************************************************************************/
/** * \author Weilun Fong* \date 2020/02/02* \brief convert hexadecimal to integer* \param[in] str: pointer to ascii string* \return none* \ingroup example* \remarks result
******************************************************************************/
uint16_t axtoi(char *str)
{uint8_t i = strlen(str);uint8_t j = 1;uint16_t res = 0;while (i--){if ((str[i] >= '0') && (str[i] <= '9')){res = res + j*(str[i] - '0');}else if ((str[i] >= 'a') && (str[i] <= 'f')){res = res + j*(str[i] - 'a' + 0xA);}j = j * 0x10;}return res;
}/*****************************************************************************/
/** * \author Weilun Fong* \date 2020/02/02* \brief override putchar function* \param[in] ch: expected ascii character* \return none* \ingroup example* \remarks
******************************************************************************/
PUTCHAR_T putchar(PUTCHAR_CH_T ch)
{UART_sendByte((char)ch);#if ((__SDCC_VERSION_MAJOR > 3) || ((__SDCC_VERSION_MAJOR == 3 ) && (__SDCC_VERSION_MINOR >= 7)))return ch;#endif
}/*****************************************************************************/
/** * \author Weilun Fong* \date 2020/02/02* \brief initial MCU* \param[in] * \return none* \ingroup example* \remarks use timer-1 as baudrate generator
******************************************************************************/
void sys_init(void)
{UART_configTypeDef uc;uc.baudrate = ZCLI_BAUDRANTE;uc.interruptState = ENABLE;uc.interruptPriority = ENABLE;uc.mode = UART_mode_1;uc.multiBaudrate = DISABLE;uc.receiveState = ENABLE;UART_config(&uc);enableAllInterrupts();
}/*****************************************************************************/
/** * \author Weilun Fong* \date 2020/02/02* \brief clear screen* \param[in] * \return execute status code* \ingroup example* \remarks when terminal accept byte 0x0C, it will clean screen
******************************************************************************/
int8_t zcli_action_c(void)
{UART_sendByte(0x0C);return 0;
}/*****************************************************************************/
/** * \author Weilun Fong* \date 2020/02/02* \brief show help information* \param[in] * \return execute status code* \ingroup example* \remarks print all commands and description for usage
******************************************************************************/
int8_t zcli_action_h(void)
{uint8_t i = 0;zcli_printString(zcli_str_helpNote);for (i = 0; i < ZCLI_TABLE_LEN(zcli_command_table); i++){printf("\r\n%s", zcli_command_table[i].description);}return 0;
}/*****************************************************************************/
/** * \author Weilun Fong* \date 2020/02/02* \brief say hello via zcli* \param[in] * \return execute status code* \ingroup example* \remarks
******************************************************************************/
int8_t zcli_action_hi(void)
{zcli_printString(zcli_str_hello);return 0;
}/*****************************************************************************/
/** * \author Weilun Fong* \date 2020/02/05* \brief I/O control* \param[in] * \return execute status code* \ingroup example* \remarks command format is fixed with "io <port> <val>", which gap withspace
******************************************************************************/
int8_t zcli_action_io(void)
{uint8_t i = 0;char hexString[3];PERIPH_GPIO p = PERIPH_GPIO_0;/* get first parameter value, jump "io" first */i = 0x2;if ((g_commandArguments[1][0] == 'p')){switch (g_commandArguments[1][1]){case '0': p = PERIPH_GPIO_0; break;case '1': p = PERIPH_GPIO_1; break;case '2': p = PERIPH_GPIO_2; break;case '3': p = PERIPH_GPIO_2; break;default: zcli_printString(zcli_str_noSuchIo); return -1;}}else{zcli_printString(zcli_str_invalidCommandFormat);return -1;}/* get second parameter value, jump one blank first */i++;/* get hex number */if ((g_commandArguments[2][0] == '0') && (g_commandArguments[2][1] == 'x')){hexString[1] = g_commandArguments[2][2];hexString[0] = g_commandArguments[2][3];hexString[2] = '\0';GPIO_configPortValue(p, (byte)axtoi(hexString));zcli_printString(zcli_str_commited);return 0;}else{zcli_printString(zcli_str_invalidCommandFormat);return -1;}
}/*****************************************************************************/
/** * \author Weilun Fong* \date 2020/02/02* \brief show system information* \param[in] * \return execute status code* \ingroup example* \remarks
******************************************************************************/
int8_t zcli_action_si(void)
{uint8_t i = ZCLI_TABLE_LEN(zcli_str_systemInfo);while (i--){printf("%s", zcli_str_systemInfo[i]);}printf("\r\nFirm\t: %s v%s", __HML_NAME_STRING__, __HML_VERSION_STRING__);return 0;
}/*****************************************************************************/
/** * \author Weilun Fong* \date 2020/02/02* \brief show version information* \param[in] * \return execute status code* \ingroup example* \remarks
******************************************************************************/
int8_t zcli_action_v(void)
{printf("\r\nzCLI v%d.%d [%s]", ZCLI_VERSION_MAJOR, ZCLI_VERSION_MINOR, \
ZCLI_TIMESTAMP_STRING);zcli_printString(zcli_str_authorInfo);return 0;
}/*****************************************************************************/
/** * \author Weilun Fong* \date 2020/02/07* \brief clear zcli memory* \param[in] * \return none* \ingroup example* \remarks
******************************************************************************/
void zcli_clearMemory(void)
{g_index = 0;memset(g_buf, '\0', ZCLI_STRING_LEN);memset(g_commandArguments[0], '\0', ZCLI_STRING_LEN);memset(g_commandBuffer, '\0', ZCLI_CMD_LEN);
}/*****************************************************************************/
/** * \author Weilun Fong* \date 2020/02/02* \brief get command string* \param[in] cmd: pointer for string store* \return none* \ingroup example* \remarks
******************************************************************************/
void zcli_getCommand(char* cmd)
{zcli_getArguments();strncpy((char*)cmd, (char*)g_commandArguments[0], strlen(g_commandArguments[0]));
}/*****************************************************************************/
/** * \author Weilun Fong* \date 2020/02/07* \brief split user input and obtain all arguments* \param[in] * \return none* \ingroup example* \remarks parse result will store in g_commandArguments
******************************************************************************/
void zcli_getArguments(void)
{uint8_t aLen = 0; /* current arguments length */uint8_t aNum = 0; /* arguments item number */uint8_t i = 0;for (i = 0; i < g_index; i++){if ((g_buf[i] == '\0')|| (g_buf[i] == ' ')|| (g_buf[i] == ASCII_CR)){strncpy((char*)g_commandArguments[aNum++], (char*)&g_buf[i - aLen], aLen);aLen = 0;}else{aLen++;}if(aNum > ZCLI_MAX_ARGS){break;}}
}/*****************************************************************************/
/** * \author Weilun Fong* \date 2020/02/02* \brief show startup information* \param[in] * \return none* \ingroup example* \remarks
******************************************************************************/
void zcli_startup(void)
{zcli_action_c();zcli_printString(zcli_str_copyrigth);zcli_printString(zcli_str_ps1);
}/*****************************************************************************/
/** * \author Weilun Fong* \date 2020/02/02* \brief main function* \param[in] * \return none* \ingroup example* \remarks
******************************************************************************/
void main(void)
{uint8_t i = 0;/*** \brief zcli startup works*/sys_init();zcli_clearMemory();zcli_startup();/*** \brief zcli main work*/while (true){while (g_isValidCommand == true){zcli_getCommand(g_commandBuffer);if (g_commandBuffer[0] != '\0'){for (i = 0; i < ZCLI_TABLE_LEN(zcli_command_table); i++){/* jump out when target command matches */if (!strcmp((char *)g_commandBuffer, (char*)zcli_command_table[i].command)){break;}}if (i < ZCLI_TABLE_LEN(zcli_command_table)) /* make sure and execute action */{zcli_command_table[i].action();}else{zcli_printString(zcli_str_invalidCommand);}}/* display header */zcli_printString(zcli_str_ps1);zcli_clearMemory();g_isValidCommand = false;}}
}/*****************************************************************************/
/** * \author Weilun Fong* \date 2020/02/08* \brief interrupt service function for UART* \param[in] * \return none* \ingroup example* \remarks special ascii character: BS, CR, DEL
******************************************************************************/
void uart_isr(void) __interrupt SI0_VECTOR
{char rBuf = 0x00;disableAllInterrupts(); /* avoid disturb *//*** \brief handle data when MCU receives data*/if (RI == SET){rBuf = UART_getByte();if (g_index > ZCLI_STRING_LEN){putchar(rBuf);}else{switch (rBuf){/* backspace & delete support */case ASCII_BS:case ASCII_DEL:{g_buf[g_index] = '\0';if (g_index >= 1) /* clear last character */{zcli_printString(zcli_str_backspace);g_index--;}} break;/* regard '\r' as end flag, and increase value of index */case ASCII_CR:{g_buf[g_index] = '\0';g_isValidCommand = true;memcpy(g_lastInput, g_buf, ZCLI_STRING_LEN);/* avoid buffer overflow */if (g_index < ZCLI_STRING_LEN){g_index++;}} break;/* tab support */case ASCII_TAB:{/* obtain history command */memcpy(g_buf, g_lastInput, ZCLI_STRING_LEN);g_index = sizeof(g_buf) / sizeof(char);zcli_printString(terminal_str_clearLine);zcli_printString(g_buf);} break;/* other characters */default:{/* visible characters */if ((rBuf >= 32) && (rBuf <= 126)){putchar(rBuf);g_buf[g_index] = tolower(rBuf);}else{g_buf[g_index--] = '\0';}/* avoid buffer overflow */if (g_index < ZCLI_STRING_LEN){g_index++;}} break;}RI = RESET;}}enableAllInterrupts(); /* recover */
}
编译:
- make -j MCU=stc89c52rc
- make rebuild MCU=stc89c52rc JOBS=1
上传:
- stcgal -P stc89 -b 115200 output.ihx
HML_FwLib系列在镜像中的使用说明相关推荐
- Docker系列之镜像瘦身(五)
本节我们来讲讲在我们在构建镜像过程中不出问题,同时使得最后所构建的镜像文件大小尽可能最小. 缓存(cache) Docker的优势之一在于提供了缓存,加速镜像迭代构建,我们知道构建镜像使用docker ...
- 机器人实践课程镜像分享及使用说明(Arduino+ROS1+ROS2+Gazebo+SLAM+...)
经过5年尝试和努力,在吸取indigo.kinetic版本经验后,融合Arduino.ROS1.ROS2.Gazebo和SLAM的适用机器人爱好者的实践课程镜像尝鲜版(bug是免不了的!_!)终于完成 ...
- ROS机器人程序设计(原书第2版)学习镜像分享及使用说明
2018 ROS Melodic的迷失与救赎::https://blog.csdn.net/column/details/28058.html 2018 GitChat::沉迷机器人操作系统的一个理由 ...
- Delphi中SendMessage使用说明
Delphi中SendMessage使用说明 SendMessage基础知识 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.而函数Po ...
- [UML]UML系列——用例图中的各种关系(include、extend)
[UML]UML系列--用例图中的各种关系(include.extend) 原文:[UML]UML系列--用例图中的各种关系(include.extend) 用例图中的各种关系 一.参与者与用例间的关 ...
- 爱上MVC3系列~分部视图中的POST
在PartialView中进行表单提交,有什么用呢,我来总结一下: 1 这个表单不只一个地方用到 2 可能涉及到异步的提交问题 这两种情况都有可能需要把表单建立在"分部视图"中,我 ...
- FCKeditor 在ASP.Net 中的使用说明
FCKeditor 在ASP.Net 中的使用说明 FCKeditor 是一个运行在浏览器上的 JavaScript 应用程序.他可以不依赖任何服务器端语言运行.不过,更好的使用方法是你使用一种服务器 ...
- 在docker镜像中加入环境变量
原文链接 前言 reference:https://vsupalov.com/docker-build-time-env-values/ 很多时候,我们需要在docker镜像中加入环境变量,本人了解的 ...
- Java 8系列之Stream中万能的reduce
Stream系列: Java 8系列之Stream的基本语法详解 Java 8系列之Stream的强大工具Collector Java 8系列之重构和定制收集器 Java 8系列之Stream中万能的 ...
最新文章
- 对TD tree的使用体验及建议
- 移动开发框架,第【二】弹:Hammer.js 移动设备触摸手势js库
- 产品经理如何基于需求迭代产品(下篇3):产品的整体设计之逻辑层和交互层...
- 【UIKit】UITableView 3
- 关于估时间的一些感想
- HDU1850 Being a Good Boy in Spring Festival【Nim博弈】
- git针对Android Studio的使用
- Java练习21:递归方法求n!
- ITU-R BT.709
- 关于非线性动力学分析螺栓联接法兰接头建模的英文文献译文
- dataBinding 配置问题 Could not find method buildFeatures()for arguments xxx on extension ‘android
- 数字化给财税行业带来的星星之火
- phpspreadsheet常用设置项
- 计算机专业教务工作总结,计算机系阶段工作总结
- MC.9,库存分析,LIS之乱谈一气
- Three.js——天空盒
- Master—Theorem 主定理的证明和使用
- 概率论:先验与后验与似然
- 计算机网络:数据报与虚电路
- 我国区域经济发展格局历史变迁(1990——2012年)
热门文章
- C++设计模式——适配器模式(adapter pattern)
- 什么是seo的关键字
- 麓言信息超实用的平面设计构图原则
- 聊天突然尬住?教你用Python一键获取斗图表情包,各种表情包轻松化解尴尬
- matlab实现CRC_16,关于CRC校验实现程序解释(CRC16为例)
- msb307命令setlocal_记录VS2019生成项目提示MSB307命令dotnet paket restore已退出,代码为1....
- 生成普通二维码测试例子
- 2001年《Derivative Dynamic Time Warping》Eamonn J K Michael J P
- cpu占不上去问题总结
- 中国石油大学《马克思主义基本原理概论#》第二阶段在线作业