[技术PK大擂台] [新人试水] LPC1768 RTT_Nano3 Shell

[复制链接]
80|2
 楼主 | 2019-3-14 17:34 | 显示全部楼层 |阅读模式

第二章 Finsh Shell
在搞Finsh Shell之前先要搞定一个串口通讯,至少要保证能收数据能发数据。

2.1 串口
由于使用的是LPC1768,直接参考一下BSP下的LPC176x工程的写法,之前我在网上看教程,都是从STM32讲起的,更可笑的是,我在做串口程序的时候,是从STM32的串口程序改过来的。。。好浪费时间呀。。。
当时参考 “RT thread 设备驱动组件之USART设备”这个文档做的,前人种树,后人乘凉呀。现在知道学习方法了没有?先去看一下BSP里面有没有对应的例程序,有的话,直接参考。不懂了再看网上相关的文章,之前俺的学习路线出了点差错,不过还好,跑起来了。

现在,我们在前一节的基础上,添加UART。

先来看一下uart.c这个文件里面都有什么鬼,定义了一个结构体,几个函数,如图2-1所示。


图2-1 uart.c结构图

注意了,以前总是说static定义的函数只能内部使用,外部不能用呢??什么鬼??实际上是错误的,之前也做过实验,通过指针的方法是可以访问的,可能应当改写成“static定义的函数,不能直接被外部的文件显式调用,指针方法可以调用”。

串口0各函数的作用如表2-1所示,其中rt_hw_uart_init函数是供外部调用的初始化函数,它主要任务是完成设备接口函数的绑定,并将设备注册,如图2-2所示。

表2-1 串口0各函数的作用
UART0_IRQHandler        串口0的中断函数,接收数据到缓冲区
rt_uart_init                        串口0的初始化函数
rt_uart_open                        串口0的打开函数,开中断
rt_uart_close                        串口0的关闭函数,关中断
rt_uart_read                        串口0的读取函数,从缓冲区读取数据
rt_uart_write                        串口0的发送函数
rt_hw_uart_init                        将以上函数与设备结构体绑定,并注册

图2-2 串口初始化函数
首先定义了一个结构体指针uart,这个指针指向实体uart_device,然后对实体进行赋值,其中那个parent就是rt_device,这个取的名字也很讨厌,为什么不直接写成device这样的名字呢?可以自己改的,嘿嘿,我也懒得去改,知道是它就成。最后一句,注册到RTT。注意了,这里只是小学生刚来注册报名登记而已,什么事情都还没有干,相当于还没有安排座位(真正的初始化),还无法开始听课(数据读取和写入操作)。

+ r) B  b; l, t' n4 q0 S
再说一下那个结构体是怎么回事吧。

  1. struct rt_uart_lpc
  2. {
  3.     struct rt_device parent;
  4.     /* buffer for reception */
  5.     rt_uint8_t read_index, save_index;
  6.     rt_uint8_t rx_buffer[RT_UART_RX_BUFFER_SIZE];
  7. } uart_device;
复制代码
rt_device这个是系统定义好的结构体,用户需要自定义设备结构体时,都从这个地方去扩展,把它放到最前面是为了方面取地址和强制内型转换使用(强制转换会不会把数给弄坏了?以前我也这样想。我们换一个思路来看这个问题,那个东东原原本本在那里,我们用一个相机拍个照(读取数据),照片是有参考坐标的,不同的坐标读取不同的值,在上面画上网格,格子大小不同,读取的数据就会不同,但是原有的数据不会变,除非你写入。)

2.2 添加串口文件
在工程目录下建立一个文件夹Drivers,并将LPC176x下的uart.c和uart.h复制过来,然后在工程添加Drivers目录,将uart.c添加进去。如图2-3中的1所示。然后添加头文件的目录,如图2-3中的2和3操作,将头文件目录包含进来,如图2-4所示。
图2-3添加uart.c/添加头文件包含目录
图2-4添加uart.c/添加头文件包含目录

注意一下,44行,这里对两个宏进行了判断,只有打开了这两个开关,下面的代码才参考编译呢。
图2-5编译条件

2.3 打开串口支持
查找一下那两个宏定义在什么地方,悲剧的是,RT_USING_UART0个宏没有定义的地方,另一个宏在rt_config.h里面有,但是长相不好看呢。先看一新旧配置文件的对比图吧,如图2-6、2-7所示。

     

图2-6 新版配置文件                                                                               图2-6 旧版配置文件
没有那个Device选择的地方了,怎么办,看一下里面都写了什么,如图2-7所示。RTE_USING_DEVICE也没有找到定义呢,要用怎么办?手动添加吧。


图2-7 配置文件信息

编译,出错了哦,NND,这个Nano 3改进得怎么这么不人性化呢?看一下是什么?说是没有定义
Drivers\uart.c(56): error:  #20: identifier "RT_UART_RX_BUFFER_SIZE" is undefined
怎么办?继续添加,参考一下以前的代码,定义是这个样子的:
#define RT_UART_RX_BUFFER_SIZE  (RT_CONSOLEBUF_SIZE >> 1)
至为什么呢?我也不知道,没有看文档,用PP想一下,那个定义之后有64个字节,从键盘输入超过64个字节的将会是什么指令呢?哥都不让它这么多输入,浪费老子空间。最后配置文件如图2-8所示。
图2-8 手动修改配文件

再编译,没有错误了。接下来要添加Finsh Shell了。

2.4 Finsh Shell支持
OMG,算了放张图就好了,如图2-9所示。(这里实在是太简单了,无法用语言表达,请看图。)
图2-9添加Finsh Shell

2.5 检查一下
查找一下初始化函数,如图2-10所示。坑货,怎么没有调用呀?
图2-10查找一下调用情况
注意,编译没有错误,并不代码程序执行没有错误,不然怎么会出现BUG呢?编译成功只能说明,语法没有问题,符合编译器的逻辑。

2.6 Shell使用uart0
输出口选择设备“uart0”,注意了,这里的uart0不是指LPC上的串口0,指的是名字为uart0的那个设备。所以,不要以为只能是串口哦,别的接口,可能也是可以用的,当然,我没有试过,机会留给大家。
图2-11选择uart0进行输出

2.7 添加初始化
添加到board.c中去,如图2-12所示。
图2-12添加初始化

下载试用

图2-13 下载设置

2.8 使用PuTTY查看运行结果
怪了,怎么这样也可以运行?记得之前在2.1.1时,如果没有进行Linker的相关设置时,是不能运行的,这个RT_thread进行改进了?反正我是不清楚啦,我也刚玩不久。但是屏上显示乱码呢,怎么回事?是不是和那个Linker设置有关呢?啥子情况呢?而且每次启动都不一样哦。先展示一下启动时的图片,如图2-14所示。
图2-14运行时有乱码

2.9 试着添加Linker设置
如图2-15所示。添加 --keep*.o(.rti_fn.*)   --keep *.o(FSymTab)
图2-15Linker设置

编译运行,乱码还在。说明不是这个问题,位置都不是固定的,那就肯定是波特率不准造成的啦,修改一下试试。

2.10 修改波特率偿试
图2-16降低波特率

结果是,好了!想骂人不?哪个瓜娃子写的底层驱动呀?BSP不准哦!!!修改这个是治标不治本的法子哦!



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主 | 2019-3-14 17:37 | 显示全部楼层
2,10之后下周更
| 2019-3-14 17:38 | 显示全部楼层
很好
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /3 下一条

快速回复 返回顶部 返回列表