【STM32F407】第9章 RL-TCPnet V7.X调试方法(Event Recorder和串口两种)
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=95243
第9章 RL-TCPnet调试方法(Event Recorder和串口两种)
本章节为大家讲解RL-TCPnet的调试方法,RL-TCPnet的调试功能可以通过串口打印和Event Recoder实时监控运行状态。而且RL-TCPnet的调试设置比较简单,因为官方已经为我们做好了调试版本的库,直接添加到工程,并使能相应的宏配置就可以使用了。
9.1 初学者重要提示
9.2 RL-TCPnet支持的调试版本
9.3 RL-TCPnet调试方法设置(串口打印)
9.4 RL-TCPnet调试方法设置(Event Recorder)
9.5 实验例程说明
9.6 总结
9.1 初学者重要提示
- 本章节讲解的内容相对比较简单,主要是配置Net_Debug.c文件即可。由于Net_Debug.c文件中可以使能的选项较多,实际测试中使能太多的话,会打印出非常多的信息,完全看不过来,所以实际测试的时候最好需要调试哪些功能,就开启哪些选项。
- 本章节使用的例子是由前面移植章节配套的例子简单修改而来。另外,对于本章节配套的例子,大家仅需要知道如何使能调试功能即可,具体代码实现的功能会在后面章节逐渐讲解。
- 如果不熟悉Event Recorder的使用,务必看下V5用户手册的第8章。http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 。
9.2 RL-TCPnet支持的调试版本
KEIL官方提供的库有如下几个版本:
- IPv4 Debug和IPv4/IPv6 Debug
这两个版本用于Event Recoder的调试。
- IPv4 Debug STDIO和IPv4/IPv6 Debug STDIO
这两个版本用于串口调试。
- IPv4 Release和IPv4/IPv6 Release
这两个是正式发布版本。
9.3 RL-TCPnet调试方法设置(串口打印)
下面分步进行说明RL-TCPnet的串口调试方法。
9.3.1 第1步,添加串口调试版本的RL-TCPnet库
选择库文件IPv4/IPv6 Debug STDIO
9.3.2 第2步,设置使用User模式的IO输出
设置后,用户就可以设置串口输出数据。
9.3.3 第3步,使用串口重定向函数stdout_putchar
RL-TCPnet的调试功能就是通过调用函数printf实现打印功能,所以需要我们做一个串口重定向,也就是修改函数stdout_putchar(特别注意,如果程序里面有fputc函数的重定向,请注释掉)。只不过这里稍有区别,对于换行符 n 要特殊处理下,将其修改成回车符 r 。否则打印出来的消息会错行,比较混乱。
int stdout_putchar (int ch)
{
#if 0 /* 将需要printf的字符通过串口中断FIFO发送出去,printf函数会立即返回 */
comSendChar(COM1, ch);
return ch;
#else /* 采用阻塞方式发送每个字符,等待数据发送完毕 */
/* 使用了RL-TCPnet网络协议栈,这里特别调整下 */
if (ch == 'n')
{
/* 写一个字节到USART1 */
USART1->TDR = 'r';
/* 等待发送结束 */
while((USART1->ISR & USART_ISR_TC) == 0){}
}
/* 写一个字节到USART1 */
USART1->TDR = ch;
/* 等待发送结束 */
while((USART1->ISR & USART_ISR_TC) == 0){}
return ch;
#endif
}
int stdout_putchar (int ch)
{
#if 0 /* 将需要printf的字符通过串口中断FIFO发送出去,printf函数会立即返回 */
comSendChar(COM1, ch);
return ch;
#else /* 采用阻塞方式发送每个字符,等待数据发送完毕 */
/* 使用了RL-TCPnet网络协议栈,这里特别调整下 */
if (ch == 'n')
{
/* 写一个字节到USART1 */
USART1->TDR = 'r';
/* 等待发送结束 */
while((USART1->ISR & USART_ISR_TC) == 0){}
}
/* 写一个字节到USART1 */
USART1->TDR = ch;
/* 等待发送结束 */
while((USART1->ISR & USART_ISR_TC) == 0){}
return ch;
#endif
}
9.3.4 第4步,调试级别配置
(重要说明,RL-TCPnet的调试是通过串口打印出来的)
RL-TCPnet的调试功能是通过配置文件Net_Debug.c实现。在MDK工程中打开文件Net_Debug.c,可以看到下图所示的工程配置向导:
- Print Time Stamp
勾选了此选项的话,打印消息时,前面会附带时间信息。
- 其它所有的选项
默认情况下,所有的调试选项都是关闭的,每个选项有三个调试级别可选择,这里我们以Memory Management为例,点击下拉列表,可以看到里面有Off,Errors only和Full debug三个调试级别可供选择,每个调试选项里面都是这三个级别。
Off:表示关闭此选项的调试功能。
Errors only:表示仅在此选项出错时,将其错误打印出来。
Full debug:表示此选项的全功能调试。
9.3.5 第5步,实际效果
下面开启如下几个选项的全功能调试(Application Debug Definitions的所有选项都是关闭的,没有开启):
实际应用时,要调试哪方面功能的时候,打开哪些选项,否则打印出来的信息非常多,显示效果如下:
9.4 RL-TCPnet调试方法设置(Event Recorder)
下面分步说明RL-TCPnet的Event Recorder调试方法。关于JLINK,STLINK,CMSIS-DAP使用Event Recorder的注意事项在V5开发板用户手册的8章节有详细说明:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 。
9.4.1 第1步,添加Event Recorder调试版本的RL-TCPnet库
选择库文件IPv4/IPv6 Debug。
9.4.2 第2步,设置使用Event Recorder模式的IO输出
使能bsp.h文件里面的宏定义,0表示禁止Event Recorder,1表示使能。
这个宏定义控制的是bsp.c文件里面的Event Recorder的初始化。
#if Enable_EventRecorder == 1
/* 初始化EventRecorder并开启 */
EventRecorderInitialize(EventRecordAll, 1U);
EventRecorderStart();
#endif
设置完毕后,配置STDOUT使用Event Recorder。
9.4.3 第3步,调试级别配置
(重要说明,RL-TCPnet的调试是通过串口打印出来的)
RL-TCPnet的调试功能是通过配置文件Net_Debug.c实现。在MDK工程中打开文件Net_Debug.c,可以看到下图所示的工程配置向导:
- Print Time Stamp
勾选了此选项的话,打印消息时,前面会附带时间信息。
- 其它所有的选项
默认情况下,所有的调试选项都是关闭的,每个选项有三个调试级别可选择,这里我们以Memory Management为例,点击下拉列表,可以看到里面有Off,Errors only和Full debug三个调试级别可供选择,每个调试选项里面都是这三个级别。
Off:表示关闭此选项的调试功能。
Errors only:表示仅在此选项出错时,将其错误打印出来。
Full debug:表示此选项的全功能调试。
9.4.4 第4步,实际效果
打开RL-TCPnet的调试组件:
效果如下:
Event Recorder组件:
效果如下:
9.5 实验例程说明
本章节仅仅是教会大家调试方法,具体实验内容还不做讲解,仅需学会调试功能的开启方法即可。
本章节配套了如下几个例子:
具体网络工程的测试看第7章的7.14小节或者第8章的8.14章节均可。
9.6 总结
本章节为大家讲解这么多,建议实际操作演练下,实践出真知。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- mysql sql-mode 解析和设置
- JAVABEAN EJB POJO区别
- @Component和@Bean以及@Autowired、@Resource
- mybatis generator and 和or条件
- 『.Net反射』ILGenerator.Emit 动态MSIL 编程
- Spring通过XML配置文件以及通过注解形式来AOP 来实现前置,后置,环绕,异常通知
- 切面编程(环绕通知与前后置通知区别)
- Spring在代码中获取bean的几种方式
- Spring 一个接口多个实现类怎么注入
- ASP.NET MVC Controller的激活
- js 逗号表达式
- spring动态调用方法
- Spring AOP动态代理原理与实现方式
- 基于注解多数据源解决方案
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore