实验目的
-
掌握 ARM 的 GPIO,UART 接口工作原理。
-
学习编程实现 GPIO 接口的控制及 ARM 和PC 机的UART 通信。
-
掌握 ARM 裸机下 C 语言编程方法。
实验内容
-
学习串行通信原理,了解串行通信控制寄存器。
-
实现I/O 接口编程。
实验步骤
数码管实验
-
双击打开对应工程文件夹下的vivado project file
-
在File 菜单下选择Export,点击包括比特流,点击OK
-
在File 菜单下选择 luanch SDK,打开SDK 软件
-
新建工程并命名,类型选择Empty Application
-
在新建的工程中添加源文件,新建Source File
-
为文件命名,注意要跟上文件类型.c,点击Finish
-
补全seg_test.c 文件中缺失的代码,添加至源文件中:需完成的功能:
a. 使用开关控制右四位数码管显示数字 0~9,当值大于 9时,数码管无显示
b. 其中开关从右至左为低位至高位,开关开状态为 1,关状态为 0,开关组成的 2 进制值对 应数码管上显示的十进制数值
-
点击保存,软件自动编译程序
-
用 USB 数据线将开发板 2 处接口与电脑主机连接,打开板子电源开关7,开发板 1 处拨码开关全部打到"on"
-
在vivado 中点击左下角 Open Hardware Manager,选择open target,再选择Auto C onnection
-
点击 Program device,在弹出的窗口中找到工程的比特流,比特流文件在工程中的路径为:project_name/project_name.runs/impl_1/system_wrapper.bit,如下图,点击Program 下载比特流到板子
-
运行程序
-
拨动开关,观察数码管上的显示
-
可使用debug 调试程序,具体参见实验二
UART 串口实验
-
双击打开对应工程文件夹下的vivado project file
-
在File 菜单下选择Export,点击包括比特流,点击OK
-
在File 菜单下选择 luanch SDK,打开SDK 软件
-
新建工程并命名,类型选择Empty Application
-
在新建的工程中添加源文件,新建Source File
-
为文件命名,注意要跟上文件类型.c,点击Finish
-
补全common_uart.c 文件中缺失的代码,添加至源文件中,需完成的功能:
-
通过 PL 上的 UART串口发送单个字符,接收后向串口回传该字符,若收到的字符为"x",则退出程序
-
点击保存,软件会自动编译程序
-
用 USB 数据线将开发板 2 处UART 接口与电脑主机连接,将 5 上方的 USB口用双头USB 线连接至主机,打开板子电源开关 7
-
在vivado 中点击左下角 Open Hardware Manager,选择open target,再选择Auto C onnection
-
点击 Program device,在弹出的窗口中找到工程的比特流,比特流文件在工程中的路径为:project_name/project_name.runs/impl_1/system_wrapper.bit,如下图,点击Progr am 下载比特流到板子
-
计算机→管理,在设备管理器→端口里查看Silicon Labs CP210x USB to UART Bridge 对应的端口号
-
打开串口调试助手,将串口设置为该端口号,将波特率设为9600,其余配置不改变,然后打开串口
-
运行程序
-
在串口助手里,输入字符,点击 TX发送,在左上方的框里看是否有接受到正确的字符
实验结果
数码管实验
在这部分实验中,我们首先利用 Gpio_sw 函数读取按键的值。并由 DataRead作为返回结果,随后选择利用Gpio_w_seg,即位选函数,设定后四个数码管工作,最后利用Gpio_d_seg,即段选函数设置输出的结果,并且对于按键大于 9的情况进行处理.各部分函数的功能已经在注释中给出:按键读取的函数功能如下所示
数码管位选的函数如下所示
数码管段选函数如下所示:
在这部分中,我们对原有的代码进行了部分的改动,没有在主函数中处理按键大于9 的异常情况,而是在数码管段选的函数中写入default来完成异常的处理,使得代码更加的合理。
主函数,直接调用三个子函数,不用判断按键的大小了。
实验结果如下所示,当拨码开关选中 1 和 3 的时候,对应十进制数字是 5
当拨码开关大于 9 的时候,数码管不显示
UART 接口实验
根据代码流程图,我们可以得知,首先应从串口状态寄存器中读取最低位是否为1,来确定是否需要接收数据,若为 1 则利用函数 Xil_In8 从 uart_rxd_addr中接收串口助手发送的数据,返回值为 data,随后利用 Xil_Out8函数将接收到的数据回传给串口,此时应当选择输出地址为uart_txd_addr。接着判断接收到的数据是否是 x,如果是则跳出 while循环程序结束退出。
实验结果如下所示:
实验总结
在本次实验中,我们利用 GPIO接口实现了数码管的显示,了解了多段数码管段选和位选的工作原理。熟悉了相关GPIO的命令。其次,我们完成了 UART接口的实验,对异步的工作方式有了更多的了解,通过使用串口助手,向器件发送值并获得返回结果,在Debug中更能看出"异步"的工作思想,掌握了串行通信的原理和串行通信寄存器的工作方式。
实验思考题
查看相关寄存器,思考怎么配置 UART 时钟信号?
改变ulcon 的值可以配置 UART 配置寄存器。通过查看芯片的数据手册,查看CLOCK&P OWER MANAGEMENT 和UART模块相关配置时钟信号的寄存器来确定时钟信号。
要实现控制数码管闪烁的功能,有什么办法可以完成?
- 可以通过向命令寄存器中写入"下载数据并译码(Download)"命令,其指令的格式如下所示:
在指令格式中,高 4 位的 0110 是命令字段; A3A2A1A0是数码管显示的位选,dp 控制小数点是否点亮,0—点亮,1—熄灭; flash表示是否要闪烁,0—正常显示,1—闪烁; D4D3D2D1D 0 是数码管的段选。
- 可以向命令寄存器写入"闪烁控制命令(Flash)",其指令格式如下所示:
在命令格式中,高 4 位的 0111 是命令字段;xxxx 表示无关位,通常取值 0000;第 2 字节的Fn(n=0~7)控制数码管相应位的闪烁属性,0—正常显示,1—闪烁。复位后,所有位都不闪烁。
- 可以自己利用延迟函数,反复的点亮消除数码显示