本帖最后由 suyong_yq 于 2015-1-17 23:55 编辑
LiteFwLib固件库之UART样例工程 - Hello Board
——基于Keil5和FRDM-KL25板
suyong_yq@126.com
2015年1月
PS: 本文描述的内容对于老手(甚至还不用算是高手)来说根本不值得一提,但当我还是新手的时候,我曾经久久地困惑在其中无法自拔,甚至在入门不得要领的时候失去过继续玩
单片机的兴趣。希望我浅显的文字能够帮助充满热情的年轻工程师尽快地跨过入门的这些坎,体验到学习单片机开发的乐趣,并继续在这条路上坚持走下去。
对于单片机程序设计来说,最简单的、能看到现象的程序是用GPIO点亮一盏小灯,只要能控制引脚上电平的变化即可实现。然而,从更广义的学习程序设计的过程来看,实现人机交互才是最基本的需求。在本文中,将描述以UART异步
通信串行总线作为媒介,以最为方便也最为实用的方式实现电脑和单片机进行交互的方法,使得用户可以通过标准输入输出(stdio)的操作方式同单片机进行通信。在实现了标准输入输出库stdio之后,用户就能够在应用程序中,如同编写上位机C程序一样,调用putchar(),getchar(),printf()和scanf()等函数。
本文的描述是基于FRDM-KL25
开发板和LiteFwLib固件库,使用Keil集成开发环境创建应用工程。FRDM-KL25为下位机,而上位机(电脑)上同样需要运行一个同下位机进行通信的软件。这类软件比较常用的有:简约而不简单并且开源的putty,作为附件集成在Windows操作系统中的“超级终端”软件,及众多大神编写的“串口调试工具”,而这里,我选择使用的是“Tera Term”软件。
准备好这些工具,咱们就一起看看在单片机的应用程序中如何实现printf打印“hello, world”了。
在LiteFwLib固件库的样例工程目录“fsl_frdm_kl25example”中,打开样例工程“uart_hello”,如图1。
图1
通过阅读main()函数中的代码可以看到,在“uart_hello”样例程序中,通过调用printf()函数打印了一些欢迎信息,然后就是主循环中不断地读取输入字符,然后将这个字符回发出去。从这个main()函数的实现上看,这不是当年学C语言的时候在电脑上运行的程序嘛,怎么在单片机上也行?是的,只是其中的通信过程是搭载在UART异步串行通信总线上的,当然也可以搭载到其它串行通信总线上,童鞋们可以举一反三哈。
为了支持包含printf()在内的stdio标准输入输出库,需要在keil的工程选项中选择使用随keil软件自带实现的stdio库,如图2。这个stdio的库实现了基于最基本的单字节收发功能之上的所有格式化编码和解析算法,这些都是纯软件的东西,同底层搭载的具体通信介质与协议无关。关于实现的细节,我们暂时不去管它,只要知道这个随keil自带的stdio库帮助我们实现了与具体平台无关的所有功能就好了。由衷地感谢Keil的工程师,你们辛苦了!
图2
然而,只是有上层的软件还不够,在实际的应用中,stdio还需要调用最底层的、与具体平台相关的程序,调用硬件实现数据的发送与接收,才能真正把字符串打印出去。若要让FRDM-KL25板自己说“hello”,这个时候就该LiteFwLib出场了。FRDM-KL25的OpenSDA调试器将主控MCU的UART0同电脑连接,LiteFwLib也提供了使用UART0收发单个字节的驱动程序。我们刚好可以调用LiteFwLib的UART0收发驱动程序实现收发字节,让stdio“接地气”。这部分代码是在样例工程的“stdio_adapter.c”源文件中实现的,如图3所示。
图3
从代码中我们可以看到,实际上stdio是通过调用fputc和fgetc完成发送和接收字符的,只要实现了这两个函数,就能让printf在具体的
电路板正常工作啦。
这里要特别注意,在使用UART0作为stdio的底层驱动时,一定要先完成对UART0的初始化配置,否则UART0光着屁股上战场,要不妙的。这部分代码在样例工程的“init_board.c”中斤进行的,如图4。
图4
在单片机程序中实现printf的功能就这么简单。在“uart_hello”中只使用到了putchar(),getchar(),和printf()。其实printf()是最常用的,可是支持格式化输出,打印log非常方便。实际上,当可以使用getchar()的时候,scanf()也就能用了,在样例程序中没有演示,大家可以自己试试看,同在电脑上写C程序的使用方法完全相同的。这样是不是很方便呢?
下面简单介绍一下“Tera Term”的使用,这是我用过很多上位机串口软件中最钟情的一种。大家可以在网上搜索一下这个软件,也很容易找到下载链接。Tera Term是一个开源的模拟终端软件,支持很多种通信协议,这里我们只要知道它能在电脑上识别UART串口就好了,其它NB的功能暂时也用不到。惹不住要提一下,这厮还可以编写脚本自动处理交互过程的,在实现自动化测试用例时是非常非常实用的功能。
启动Tera Term软件后,选择“File”->“New Connec
tion...”,这里是要选择建立通信连接,选择使用“Serial”方式就好,在右边的下拉菜单中可以找到识别出来的串口。这里的自动识别功能实在是一个非常贴心的小功能,不仅仅列出了端口号,还把设备名称写出来了,定位目标更加方便啦。如图5,识别出了OpenSDA变身JLink时附带的UART串口。轻戳“OK”即可建立同FRDM-KL25板的通信。
图5
到这里先不要得意,这里还需要确认一下连接的配置是否正确,如果配置不正确,显示的只是乱码或或者根本没有内容显示出来。在样例程序中,UART0的通信波特率是115200,那么在上位机软件也要有相应的配置。选择“Setup”->“Serial port...”,在配置对话框中设定合适的值,如图6。
图6
轻戳OK之后终于大功告成了,从“Tera Term”的标题栏中可以看到正确的配置已经生效,如图7。
图7
最后,我们把“uart_hello”程序下载到FRDM-KL25,然后在电脑上启动Tera Term软件并正确配置后,复位FRDM-KL25板子运行程序,就可以体验最最基本的人机交互啦。见图8。
图8
搞定收工!在第一次运行Tera Term的时候显示字体没有我这里看得漂亮,改显示字体的设置就让大家自己摸索一下吧。