微处理器与嵌入式设备——IO 接口编程

实验目的

  1. 掌握 ARM 的 GPIO,UART 接口工作原理。

  2. 学习编程实现 GPIO 接口的控制及 ARM 和PC 机的UART 通信。

  3. 掌握 ARM 裸机下 C 语言编程方法。

实验内容

  1. 学习串行通信原理,了解串行通信控制寄存器。

  2. 实现I/O 接口编程。

实验步骤

数码管实验

  1. 双击打开对应工程文件夹下的vivado project file

  2. 在File 菜单下选择Export,点击包括比特流,点击OK

  3. 在File 菜单下选择 luanch SDK,打开SDK 软件

  4. 新建工程并命名,类型选择Empty Application

  5. 在新建的工程中添加源文件,新建Source File

  6. 为文件命名,注意要跟上文件类型.c,点击Finish

  7. 补全seg_test.c 文件中缺失的代码,添加至源文件中:需完成的功能:

    a. 使用开关控制右四位数码管显示数字 0~9,当值大于 9时,数码管无显示

    b. 其中开关从右至左为低位至高位,开关开状态为 1,关状态为 0,开关组成的 2 进制值对 应数码管上显示的十进制数值

  8. 点击保存,软件自动编译程序

  9. 用 USB 数据线将开发板 2 处接口与电脑主机连接,打开板子电源开关7,开发板 1 处拨码开关全部打到"on"

  10. 在vivado 中点击左下角 Open Hardware Manager,选择open target,再选择Auto C onnection

  11. 点击 Program device,在弹出的窗口中找到工程的比特流,比特流文件在工程中的路径为:project_name/project_name.runs/impl_1/system_wrapper.bit,如下图,点击Program 下载比特流到板子

  12. 运行程序

  13. 拨动开关,观察数码管上的显示

  14. 可使用debug 调试程序,具体参见实验二

UART 串口实验

  1. 双击打开对应工程文件夹下的vivado project file

  2. 在File 菜单下选择Export,点击包括比特流,点击OK

  3. 在File 菜单下选择 luanch SDK,打开SDK 软件

  4. 新建工程并命名,类型选择Empty Application

  5. 在新建的工程中添加源文件,新建Source File

  6. 为文件命名,注意要跟上文件类型.c,点击Finish

  7. 补全common_uart.c 文件中缺失的代码,添加至源文件中,需完成的功能:

  8. 通过 PL 上的 UART串口发送单个字符,接收后向串口回传该字符,若收到的字符为"x",则退出程序

  9. 点击保存,软件会自动编译程序

  10. 用 USB 数据线将开发板 2 处UART 接口与电脑主机连接,将 5 上方的 USB口用双头USB 线连接至主机,打开板子电源开关 7

  11. 在vivado 中点击左下角 Open Hardware Manager,选择open target,再选择Auto C onnection

  12. 点击 Program device,在弹出的窗口中找到工程的比特流,比特流文件在工程中的路径为:project_name/project_name.runs/impl_1/system_wrapper.bit,如下图,点击Progr am 下载比特流到板子

  13. 计算机→管理,在设备管理器→端口里查看Silicon Labs CP210x USB to UART Bridge 对应的端口号

  14. 打开串口调试助手,将串口设置为该端口号,将波特率设为9600,其余配置不改变,然后打开串口

  15. 运行程序

  16. 在串口助手里,输入字符,点击 TX发送,在左上方的框里看是否有接受到正确的字符

实验结果

数码管实验

在这部分实验中,我们首先利用 Gpio_sw 函数读取按键的值。并由 DataRead作为返回结果,随后选择利用Gpio_w_seg,即位选函数,设定后四个数码管工作,最后利用Gpio_d_seg,即段选函数设置输出的结果,并且对于按键大于 9的情况进行处理.各部分函数的功能已经在注释中给出:按键读取的函数功能如下所示

数码管位选的函数如下所示

数码管段选函数如下所示:

在这部分中,我们对原有的代码进行了部分的改动,没有在主函数中处理按键大于9 的异常情况,而是在数码管段选的函数中写入default来完成异常的处理,使得代码更加的合理。

主函数,直接调用三个子函数,不用判断按键的大小了。

实验结果如下所示,当拨码开关选中 1 和 3 的时候,对应十进制数字是 5

D:\QQ接收的文件\MobileFile\IMG_20210509_130351.jpg

当拨码开关大于 9 的时候,数码管不显示

D:\QQ接收的文件\MobileFile\IMG_20210509_130355.jpg

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模块相关配置时钟信号的寄存器来确定时钟信号。

要实现控制数码管闪烁的功能,有什么办法可以完成?

  1. 可以通过向命令寄存器中写入"下载数据并译码(Download)"命令,其指令的格式如下所示:

在指令格式中,高 4 位的 0110 是命令字段; A3A2A1A0是数码管显示的位选,dp 控制小数点是否点亮,0—点亮,1—熄灭; flash表示是否要闪烁,0—正常显示,1—闪烁; D4D3D2D1D 0 是数码管的段选。

  1. 可以向命令寄存器写入"闪烁控制命令(Flash)",其指令格式如下所示:

在命令格式中,高 4 位的 0111 是命令字段;xxxx 表示无关位,通常取值 0000;第 2 字节的Fn(n=0~7)控制数码管相应位的闪烁属性,0—正常显示,1—闪烁。复位后,所有位都不闪烁。

  1. 可以自己利用延迟函数,反复的点亮消除数码显示
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值