同步操作将从 海南大学-刘伟/单片机调试助手-windows 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
单片机调试助手,集串口/蓝牙/TCP/UDP调试、IAP升级、波形助手、图像助手等功能一体
克隆/下载
,下载ZIP包单片机调试助手.exe
即可直接运行串口配置为1位起始位、8位数据位、1位停止位。
详见在线升级调试程序(一) (jswyll.com/iap/)
支持使用扇区描述文件升级扇区大小不一的单片机,格式为json,Blocks
表示FLASH块数组,Base
是各个Block的基地址,Sectors
是扇区数组,Size
是扇区大小,Number
是该大小的扇区个数。示例,TC264的FLASH扇区如下
地址范围 | 大小 | 名称(缩写) | 描述 |
---|---|---|---|
0x6000_0000 - 0x6000_dfff | 120KB | CPU1 Data Scratch-Pad SRAM (CPU1.DSPR) | 高速暂存SRAM |
0x8000_0000 - 0x800f_ffff | 1MB | Program Flash 0 (PF0) | 程序FLASH0 |
0x8010_0000 - 0x8027_ffff | 1.5MB | Program Flash 1 (PF1) | 程序FLASH1 |
对于PF0和PF1,扇区结构如下:
其中,偏移地址(Offset Address)是相对PF0或PF1的首地址而言的。则扇区描述文件编写为:
{
"Blocks":
[
{
"Base": "0x80000000",
"Sectors":
[
{
"Size": "16KB",
"Number": 8
},
{
"Size": "32KB",
"Number": 8
},
{
"Size": "64KB",
"Number": 4
},
{
"Size": "128KB",
"Number": 3
}
]
},
{
"Base": "0x80100000",
"Sectors":
[
{
"Size": "16KB",
"Number": 8
},
{
"Size": "32KB",
"Number": 8
},
{
"Size": "64KB",
"Number": 4
},
{
"Size": "128KB",
"Number": 3
},
{
"Size": "256KB",
"Number": 2
}
]
}
]
}
有新版本时软件自动更新
在接收区文本框连续单击三次可清空接收框内容
在发送区输入\r\n
可以转义成回车换行
发送快捷键:Alt+N,N为0~9,对应各个发送按钮
可设置异常拔出串口后在10秒内尝试重新打开
记忆应用配置(设置、文本框、选择框内容)
暗色界面主题
本软件支持ANSI转义序列:ANSI escape code - Wikipedia标准的重置(0)、黑色(30)、红色(31)、绿色(32)、黄色(33)和蓝色(34)转义序列。由于软件主题为亮色时,白色背景下的黄色前景字体不显眼,故以金色前景色显示。
典型例子:乐鑫科技ESP_LOG、RT_Thread 日志组件(RT-Thread API参考手册: 日志组件)。
在"rt_config.h"中打开彩色宏定义
#define RT_DEBUG
#define RT_DEBUG_COLOR
在.c源文件中可打印
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
int CO2;
int main(void)
{
// ...
LOG_D("init ok.");
// ...
LOG_I("read CO2 value: %d", CO2);
// ...
LOG_W("location info is noneffective.");
// ...
LOG_E("read O2 failed!");
while (1)
{
// ...
}
}
其中,打印类型如下表:
打印类型 | 说明 | 使用颜色打印时的颜色 |
---|---|---|
LOG_E | 错误 | 红色 |
LOG_W | 警告 | 黄色 |
LOG_I | 信息 | 绿色 |
LOG_D | 调试 | 默认颜色 |
各打印类型函数的用法与printf函数一样。
DBG_TAG
是打印标签,每个源文件可以不一样,通常取为文件名,便于显示打印信息时知道打印来源。
打印等级DBG_LVL
可取为:DBG_ERROR
、DBG_WARNING
、DBG_INFO
、DBG_LOG
,打印等级依次增大,即该源文件文件打印的类型越多:
DBG_LVL | 打印的类型 |
---|---|
DBG_ERROR | 只打印LOG_E |
DBG_WARNING | 打印LOG_E 、LOG_W |
DBG_INFO | 打印LOG_E 、LOG_W 、LOG_I |
DBG_LOG | 打印LOG_E 、LOG_W 、LOG_I 、LOG_D |
可以在调试时把打印等级设为DBG_LOG
来显示更多的信息;在正式版时设为DBG_INFO
或更高的等级以减少程序大小。
注意:
#include <rtdbg.h>
应在宏定义DBG_TAG
和DBG_LVL
之后。
不使用RT-Thread时,可以模仿RT-Thread的打印方式:
新建一个"rtdbg.h"文件,保存在所在工程中,内容复制自RT-Thread的"rtdbg.h",并增加如下第37~40行的代码
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2016-11-12 Bernard The first version
* 2018-05-25 armink Add simple API, such as LOG_D, LOG_E
*/
/*
* The macro definitions for debug
*
* These macros are defined in static. If you want to use debug macro, you can
* use as following code:
*
* In your C/C++ file, enable/disable DEBUG_ENABLE macro, and then include this
* header file.
*
* #define DBG_TAG "MOD_TAG"
* #define DBG_LVL DBG_INFO
* #include <rtdbg.h> // must after of DBG_LVL, DBG_TAG or other options
*
* Then in your C/C++ file, you can use LOG_X macro to print out logs:
* LOG_D("this is a debug log!");
* LOG_E("this is a error log!");
*/
#ifndef RT_DBG_H__
#define RT_DBG_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#define RT_DEBUG
#define RT_DEBUG_COLOR
#define rt_kprintf printf
/* the debug log will force enable when RT_DEBUG macro is defined */
#if defined(RT_DEBUG) && !defined(DBG_ENABLE)
#define DBG_ENABLE
#endif
/* it will force output color log when RT_DEBUG_COLOR macro is defined */
#if defined(RT_DEBUG_COLOR) && !defined(DBG_COLOR)
#define DBG_COLOR
#endif
#if defined(RT_USING_ULOG)
/* using ulog compatible with rtdbg */
#include <ulog.h>
#else
/* DEBUG level */
#define DBG_ERROR 0
#define DBG_WARNING 1
#define DBG_INFO 2
#define DBG_LOG 3
#ifdef DBG_TAG
#ifndef DBG_SECTION_NAME
#define DBG_SECTION_NAME DBG_TAG
#endif
#else
/* compatible with old version */
#ifndef DBG_SECTION_NAME
#define DBG_SECTION_NAME "DBG"
#endif
#endif /* DBG_TAG */
#ifdef DBG_ENABLE
#ifdef DBG_LVL
#ifndef DBG_LEVEL
#define DBG_LEVEL DBG_LVL
#endif
#else
/* compatible with old version */
#ifndef DBG_LEVEL
#define DBG_LEVEL DBG_WARNING
#endif
#endif /* DBG_LVL */
/*
* The color for terminal (foreground)
* BLACK 30
* RED 31
* GREEN 32
* YELLOW 33
* BLUE 34
* PURPLE 35
* CYAN 36
* WHITE 37
*/
#ifdef DBG_COLOR
#define _DBG_COLOR(n) rt_kprintf("\033["#n"m")
#define _DBG_LOG_HDR(lvl_name, color_n) \
rt_kprintf("\033["#color_n"m[" lvl_name "/" DBG_SECTION_NAME "] ")
#define _DBG_LOG_X_END \
rt_kprintf("\033[0m\n")
#else
#define _DBG_COLOR(n)
#define _DBG_LOG_HDR(lvl_name, color_n) \
rt_kprintf("[" lvl_name "/" DBG_SECTION_NAME "] ")
#define _DBG_LOG_X_END \
rt_kprintf("\n")
#endif /* DBG_COLOR */
/*
* static debug routine
* NOTE: This is a NOT RECOMMENDED API. Please using LOG_X API.
* It will be DISCARDED later. Because it will take up more resources.
*/
#define dbg_log(level, fmt, ...) \
if ((level) <= DBG_LEVEL) \
{ \
switch(level) \
{ \
case DBG_ERROR: _DBG_LOG_HDR("E", 31); break; \
case DBG_WARNING: _DBG_LOG_HDR("W", 33); break; \
case DBG_INFO: _DBG_LOG_HDR("I", 32); break; \
case DBG_LOG: _DBG_LOG_HDR("D", 0); break; \
default: break; \
} \
rt_kprintf(fmt, ##__VA_ARGS__); \
_DBG_COLOR(0); \
}
#define dbg_here \
if ((DBG_LEVEL) <= DBG_LOG){ \
rt_kprintf(DBG_SECTION_NAME " Here %s:%d\n", \
__FUNCTION__, __LINE__); \
}
#define dbg_log_line(lvl, color_n, fmt, ...) \
do \
{ \
_DBG_LOG_HDR(lvl, color_n); \
rt_kprintf(fmt, ##__VA_ARGS__); \
_DBG_LOG_X_END; \
} \
while (0)
#define dbg_raw(...) rt_kprintf(__VA_ARGS__);
#else
#define dbg_log(level, fmt, ...)
#define dbg_here
#define dbg_enter
#define dbg_exit
#define dbg_log_line(lvl, color_n, fmt, ...)
#define dbg_raw(...)
#endif /* DBG_ENABLE */
#if (DBG_LEVEL >= DBG_LOG)
#define LOG_D(fmt, ...) dbg_log_line("D", 0, fmt, ##__VA_ARGS__)
#else
#define LOG_D(...)
#endif
#if (DBG_LEVEL >= DBG_INFO)
#define LOG_I(fmt, ...) dbg_log_line("I", 32, fmt, ##__VA_ARGS__)
#else
#define LOG_I(...)
#endif
#if (DBG_LEVEL >= DBG_WARNING)
#define LOG_W(fmt, ...) dbg_log_line("W", 33, fmt, ##__VA_ARGS__)
#else
#define LOG_W(...)
#endif
#if (DBG_LEVEL >= DBG_ERROR)
#define LOG_E(fmt, ...) dbg_log_line("E", 31, fmt, ##__VA_ARGS__)
#else
#define LOG_E(...)
#endif
#define LOG_RAW(...) dbg_raw(__VA_ARGS__)
#endif /* defined(RT_USING_ULOG) && define(DBG_ENABLE) */
#ifdef __cplusplus
}
#endif
#endif /* RT_DBG_H__ */
注释第39行#define RT_DEBUG_COLOR
可关闭颜色打印。
在.c源文件中使用,使用方法和在RT-Thread中一样
注意: 由于Keil C51的不支持C99以上的语法标准,不支持可变宏定义,以上方法无法在Keil C51中使用。
测试条件:51单片机STC8G,波特率115200bps
在菜单栏 - 扩展 - 波形助手
打开该功能,软件在收到指定协议的数据后将自动解析为波形。
当前协议:单片机发送数据格式:“0:波形1数值,1:波形2数值,2:波形3数值...\r\n”。其中“\r\n”代表回车并换行,每发送一行代表一次各个波形的Y值,冒号和逗号均为英文半角符,数值可为整数或小数,冒号前的0、1、2、3等表示数据对应于哪个波形。示例:0:-0.912962,1:0.408004\r\n
测试代码,发送正弦、余弦函数值:
#include <math.h>
#include <stdio.h>
void main()
{
float t = 0;
// 初始化...
while(1)
{
printf("0:%f,1:%f\r\n", sin(t), cos(t));
t += 0.1;
delay_ms(10);
}
}
上述代码中printf函数已被重定向输出到串口,故可以直接用printf打印。
如果printf未重定向输出到串口,可以用先用sprintf
函数先将字符串输出到数组,然后再调用串口函数发送字符串,效果是等同的:
#include <math.h>
#include <stdio.h>
#includde <string.h>
void main()
{
float t = 0;
char txt[64];
// 初始化...
while(1)
{
sprintf(txt, "0:%f,1:%f\r\n", sin(t), cos(t));
uart_putstr(UART_1, txt, strlen(txt));
t += 0.1;
delay_ms(10);
}
}
例如,智能车调试PID时,可以:
#include <stdio.h>
extern int aim_speed, real_speed;
extern float speed_P, speed_I, speed_D;
int main(void)
{
// 初始化...
while(1)
{
printf("0:%d,1:%d,2:%.3f,3%.3f,4:%.3f", aim_speed, real_speed, speed_P, speed_I, speed_D)
delay_ms(100);
}
}
效果如下:
提交issue:https://gitee.com/jswyll_com/mcu_assistant/issues
作者邮箱:2439423861@qq.com
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。