本帖最后由 Fillmore 于 2018-9-29 17:54 编辑
第二章 Finsh Shell 在搞 Finsh Shell 之前先要搞定一个串口通讯,至少要保证能收数据能发数据。 2.1 串口file:///C:/Users/rtthr/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif 由于使用的是 LPC1768,直接参考一下 BSP 下的 LPC176x 工程的写法,之前我在网上看教程,都是从 STM32 讲起的,更可笑的是,我在做串口程序的时候,是从STM32 的串口程序改过来的。。。好浪费时间呀。。。当时参考 “RT thread 设备驱动组件之 USART 设备”这个文档做的,前人种树,后人乘凉呀。现在知道学习方法了没有?先去看一下 BSP 里面有没有对应的例程序,有的话,直接参考。不懂了再看网上相关的**,之前俺的学习路线出了点差错,不过还好,跑起来了。 现在,我们在前一节的基础上,添加 UART。 2.1.1 初识串口 先来看一下 uart.c 这个文件里面都有什么鬼,定义了一个结构体,几个函数,如图2-1 所示。
图 2-1 uart.c 结构图 注意了,以前总是说 static 定义的函数只能内部使用,外部不能用呢??什么鬼??实际上是错误的,之前也做过实验,通过指针的方法是可以访问的,可能应当改写成“static 定义的函数,不能直接被外部的文件显式调用,指针方法可以调用”。 串口 0 各函数的作用如表 2-1 所示,其中 rt_hw_uart_init 函数是供外部调用的初始化函数,它主要任务是完成设备接口函数的绑定,并将设备注册,如图2-2 所示。
函数名 | 说明 | 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-1 串口 0 各函数的作用
图 2-2 串口初始化函数 首先定义了一个结构体指针 uart,这个指针指向实体 uart_device,然后对实体进行赋值,其中那个parent 就是rt_device,这个取的名字也很讨厌,为什么不直接写成device 这样的名字呢?可以自己改的,嘿嘿, 我也懒得去改,知道是它就成。最后一句,注册到 RTT。注意了,这里只是小学生刚来注册报名登记而已, 什么事情都还没有干,相当于还没有安排座位(真正的初始化),还无法开始听课(数据读取和写入操作)。 再说一下那个结构体是怎么回事吧。 struct rt_uart_lpc { struct rt_device parent; /* buffer for reception */ rt_uint8_t read_index, save_index; rt_uint8_t rx_buffer[RT_UART_RX_BUFFER_SIZE]; } 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 所示。
没有那个 Device 选择的地方了,怎么办,看一下里面都写了什么,如图 2-7 所示。RTE_USING_DEVICE 也没有找到定义呢,要用怎么办?手动添加吧。
图 2-7 配置文件信息
编译,出错了哦,NND,这个 Nano 3 改进得怎么这么不人性化呢?看一下是什么?说是没有定义
怎么办?继续添加,参考一下以前的代码,定义是这个样子的:
至为什么呢?我也不知道,没有看文档,用 PP 想一下,那个定义之后有 64 个字节,从键盘输入超过 64 个字节的将会是什么指令呢?哥都不让它这么多输入,浪费老子空间。最后配置文件如图 2-8 所示。
图 2-8 手动修改配文件
再编译,没有错误了。接下来要添加 Finsh Shell 了。
担心图片存储空间不够,今天就更新到这里啦 明天继续明天见 大家也可以加入论坛交流群,交流讨论
|