✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆
🔥系列专栏 :
📃新人博主 :欢迎点赞收藏关注,会回访!
💬舞台再大,你不上台,永远是个观众。平台再好,你不参与,永远是局外人。能力再大,你不行动,只能看别人成功!没有人会关心你付出过多少努力,撑得累不累,摔得痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷。
文章目录
《嵌入式系统原理》课程实验报告
| 实验名称 | 熟悉 Linux 开发环境 | | |
| --- | --- | --- | --- |
| 实验日期 | 2022年5月14日 | 实验成绩 | |
| 一、 实验目的和要求
熟悉Linux开发环境,学会基于Tiny6410的Linux开发环境的配置和使用。 使用Linux的arm-Linux-gcc编译,并使用minicom串口方式下载和调试程序。 | | | |
| 二、实验内容
1.实验内容
本次实验使用Fedora 9.0操作系统环境,安装ARM-Linux的开发库及编译 器。创建一个新目录,并在其中编写hello.c和Makefile文件。学习在Linux下 的编程和编译过程,以及ARM开发板的使用和开发环境的设置。下载已经编译好的文件到目标开发板上运行。
2. 实验设备及工具(包括软件调试工具)
硬件:Tiny6410嵌入式实验平台。
软件:PC机操作系统Fedora9+MINICOM+ARM-Linux 开发环境
3. 实验步骤
1)登录win7系统,使用管理员权限打开VMware虚拟机软件。通过编辑此虚拟机选项,添加串行通信端口,并确认使用物理串行端口中为“自动选择串口”选项。启动Fedora系统,用户和密码都为knight
2)打开终端,建立hello工作目录(此时会在home目录下)。使用vi hello.c,打开编辑器,i进入编辑模式,编写下列程序,并ESC,wq保存并退出。
#include<stdio.h>
int main()
{
printf(“Hello,HFUT!”);
printf(“2020210xxx,2020210xxx||2022-5-14”);
return 0;
}
3)编写Makefile。与上面编写hello.c的过程类似,用vim来创建一个Makefile文件并将代码录入其中。然后使用make命令来编译程序。
CC=arm-linux-gcc
EXEC=hello
OBJS=hello.o
CFLAGS+=
LDFLAGS+=
all 😒(EXEC)
(
E
X
E
C
)
:
(EXEC):
(EXEC):(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS)
clean:
rm – f $(EXEC) .elf.gdb*.o
~
4)下载调试。输入su root密码kniht进入root用户。在终端输入minicom 回车,出现下面图片表示串口连接正常。(关闭minicom请先按Ctrl+A,再按X。不要使用界面右上角的×退出,否则 会在下一次执行minicom命令时提示被锁定,拒绝访问。)
按Ctrl+A+S,选择zmodem 回车后,提示输入绝对路径或者通过键盘快捷键选择文件后,回车。
若出现下图提示Tiny6410板子已经有了hello可执行文件(之前下载的),若需要下载,则需要删除之前的hello文件,rm hello即可。可以通过ls命令查看是否删除成功。
删除之后重新执行上述步骤。出现下图,则下载成功。
5)运行程序。在电脑终端输入./hello,或者在Tiny6410终端输入hello都可。 | | | |
| 二、 实验验收结果及其分析
实验验收情况为:通过验收
实验修改要求:将原程序中显示的“Hello,World!”修改为“Hello, HFUT!”,并增加 一行,显示本人学号和实验日期,显示格式为:“201*******||2021-05-08”
实验结果截图:
分析:实验时只需要将hello.c中的文件中重写编写内容,内容中输入学号。然后相应的路径下执行shell命令make clean 删除之前编译的结果,然后make重新编译,再通过minicom重新写入。注意关闭minicom请先按Ctrl+A,再按X。不要使用界面右上角的×退出,否则 会在下一次执行minicom命令时提示被锁定,拒绝访问。 | | | |
《嵌入式系统原理》课程实验报告
实验名称 | 实验二 汇编点亮 LED | ||
---|---|---|---|
实验日期 | 2022年5月14日 | 实验成绩 | |
一、实验目的和要求 | |||
学会Linux系统中开发汇编程序的步骤和方法。在此基础上,掌握通过汇编 程序访问GPIO端口,以实现控制Tiny6410开发板上LED的方法。 | |||
二、实验内容 | |||
1. 实验内容 |
本次实验使用Fedora 9.0操作系统环境,安装ARM-Linux的开发库及编译 器。学习在Linux下的编程和编译过程,即创建一个新目录leds_s,使用编辑器 建立start.S和Makefile文件,并使用汇编语言编写LED控制程序。编译程序, 并下载文件到目标开发板上运行。
2. 实验设备及工具(包括软件调试工具)
硬件:Tiny6410嵌入式实验平台。
软件:PC机操作系统Fedora9+MiniTools+ARM-Linux开发环境
3.实验原理
1)Tiny6410开发板上提供了4个可编程用户LED,原理图如下:
| | | |
| 可见,LED1、2、3、4分别使用的CPU GPIO端口资源为GPK_4、5、6、7。
2)点亮LED控制原理
点亮4个LED需如下2个步骤:把 外 设 的 基 地 址 告 诉 CPU 。 对 于 6410 来 说 , 内 存 的 地 址 范 围 为 0x00000000-0x60000000,外设的地址范围为0x70000000-0x7fffffff。 l 关闭看门狗,防止程序不断重启;设置寄存器GPKCON0,使GPK_4/5/6/7 四个引脚为输出功能;往寄存器GPKDAT写0,使GPK_4/5/6/7四个引脚输 出低电平,4个LED会亮;相反,往寄存器GPKDAT写1,使GPK_4/5/6/7四 个引脚输出高电平,4个LED会灭。
4. 实验步骤
1)建立工作目录leds。点击【虚拟机】菜单中的【设置】,选择【选项】中的“共享文件夹”,添加Windows系统中的桌面路径为共享文件夹。在Windows系统的桌面上,右键 复制leds文件夹,然后进入虚拟机当前用户的Home目录,使用右键粘贴,将文件夹从windows系统复制到虚拟机的系统中。
2)编写源代码
start.S的汇编源程序如下:
Makefile文件如下:
注意在makefile文件路劲下使用make命令,系统会执行如下操作:
a) 执行arm-Linux-gcc-o $@ $< -c命令,将当前目录下存在的汇编文件和 C文件编译成.o文件;
b) 执行arm-Linux-ld -Ttext 0x50000000 -o led.elf $^,将所有.o文件链接 成 elf 文 件 , -Ttext 0x50000000 表示程序的运行地址是 0x50000000, 即程序只有位于该地址上才能正常运行;
c) 执行arm-Linux-objcopy -O binary led.elf led.bin,将elf文件抽取为可在开发板上运行的bin文件;
d) 执行arm-Linux-objdump -D led.elf > led_elf.dis,将elf文件反汇编后保存在dis文件中,调试程序时可能会用到。
3)编译及下载程序:
l 编译代码
在root用户下的终端执行cd leds和make命令,生成led.bin文件。
l 烧写和运行程序
在 windows系统中,以管理员权限使用 SD-Flasher程序,将引导程序 Superboot-6410.bin烧入SD卡。成功烧写后的结果如下图所示:
在SD卡中建立一个images文件夹,并把配置文件FriendlyARM.ini复制到该文件夹中。双击打开SD卡中的该配置文件,在任意位置加入以下内容:USB-Mode = yes (注意字符的大小写)。如下图所示:
将烧写完成的SD卡,插入Tiny6410开发板的SD卡槽,并将开发板S2拨动开关置于SDBOOT位置,然后打开开发板电源,开发板将进入USB下载模式,LCD显 示屏上显示“USB Mode:Waiting…”。此时用MiniUSB线连接开发板与PC机, LCD上会显示“USB Mode:Connected”。 在windows系统中,以管理员身份运行MiniTools软件,打开如下软件界面:
确认界面下方显示绿色图标,表明MiniTools已通过MiniUSB线与开发板成功连接。接着,选择Install to NAND Flash,表示将裸机程序烧入NAND Flash, 但不 需 要 运 行 。 设 置 好 下 载 地 址 “ RAM Address(Download/Loading) =0x50000000 ” , 同 时 勾 选 Superboot , 并 选 择 烧 写 时 需 要 的 引 导 程 序 Superboot-6410.bin和要烧写的裸机程序。最后,点击【Start flashing】按 钮,执行选择的某一裸机程序(bin文件)烧写。成功后显示如下信息,然后关闭开发板电源,将S2拨动开关置于NAND位置,然后重新开启开发板电源, 则开发板运行刚刚烧入的裸机程序。
4)观察现象,可以看到LED灯呈现四个全亮,然后1和2亮(3和4灭),然后3和4亮(1和2灭),最后全灭的周期现象。
三、实验验收结果及其分析
实验验收情况为:通过验收
实验修改要求:在延时不变的条件下,将原程序中四个LED全亮,然后全灭的显示状态,修改为“四个全亮,然后1和2亮(3和4灭),然后3和4亮(1和2灭),最后全灭”。
实验结果截图:
实验分析:
Start.S函数中,首先把外设地址告和设置好的外设大小告诉CPU,然后关闭看门狗,然后将GPKCON的4567位设置为1,输出管脚。然后配置GPKDAT中的数据寄存器。GPKDAT的4、5、6、7引脚输出低电平,设置为GPKDAT = 0x0,则led全亮;GPKDAT 的4、5引脚输出低电平,设置GPKDAT = 0xc0,则12灯亮,34灯灭;GPKDAT 的6、7引脚设置低电平,设置GPKDAT = 0x30则34灯亮12灯灭,GPKDAT 的4、5、6、7引脚全为高电平,设置GPKDAT = 0xf0,则led灯全灭。修改代码见下图:
注意在烧写时要连接主机后面的USB接口,烧写完成后,要关闭开发板电源,将S2拨动开关置于NAND位置,然后重新开启开发板电源, 则开发板运行刚刚烧入的裸机程序。 | | | |
《嵌入式系统原理》课程实验报告
实验名称 | 实验四 按键中断实验 | ||
---|---|---|---|
实验日期 | 2022年5月21日 | 实验成绩 | |
一、实验目的和要求 | |||
学会Linux系统中开发C程序的步骤和方法。在此基础上,掌握通过汇编程 序实现Tiny6410中断控制器初始化及通过C程序实现中断处理的方法。 | |||
二、实验内容 | |||
1. 实验内容 | |||
本次实验使用Fedora 9.0操作系统环境,安装ARM-Linux的开发库及编译 器。学习在Linux下的编程和编译过程,即创建一个新目录irq,使用编辑器建 立start.S、main.c、irq.c和Makefile等文件,并使用C语言编写中断处理程序。 编译程序,并下载文件到目标开发板上运行。 | |||
当K1按下时,LED1和LED2被点亮;当K2按下时,LED3和LED4被点亮;当K3按下时,LED1和LED3被点亮;当K4按下时,LED2和LED4被点亮。 | |||
2. 实验设备及工具(包括软件调试工具) | |||
硬件:Tiny6410嵌入式实验平台。 | |||
软件:PC机操作系统Fedora9+MiniTools+ARM-Linux开发环境 | |||
3.实验原理 | |||
1)按键硬件原理图 Tiny6410中共有8个用户按键,原理图如下: | |||
相关的引脚信息如下图:
2)中断控制原理
把外设的基地址告诉CPU。对于6410来说, 内存的地址范围为 0x00000000-0x60000000,外设的地址范围为0x70000000-0x7fffffff。关闭看门狗,防止程序不断重启;设置寄存器GPNCON,使接按键K0~K5 的GPN0~GPN5为中断功能;设置寄存器EINT0CON0,使按键的中断触发 信号采用下降沿触发;设置寄存器EINT0MASK,使按键对应的中断使能; 设置VIC0INTSELECT,使对应中断源工作于IRQ模式。在中断处理函数中,查询寄存器EINT0PEND,判断哪个中断发生,进而识别对应的按键。最后,向寄存器EINT0PEND对应位写“1”,以实现清除中断标记。
4.实验步骤
- 建立工作目录irq。编写源代码,Start.S如下:
| | | |
|
irq.c文件如下:
main.c文件如下
makefile文件如下
2)编译及下载程序
切换到root用户,然后用cd命令进入到该文件夹下,执行make命令,生成irq.bin文件。然后按实验二给出的方法下载程序后,关闭开发板电源,首先将启动模式拨动开关S2拨动至“NAND”位置,然后重新开启开发板电源。当按下K1时,LED1点亮;按下K2时, LED2点亮;按下K3时,LED3点亮;按下K4时,所有LED熄灭。
3)实验修改
当K1按下时,LED1和LED2被点亮;当K2按下时,LED3和LED4被点亮;当K3按下时,LED1和LED3被点亮;当K4按下时,LED2和LED4被点亮。
原函数为K1按下时LED1灯亮,K2按下时,LED2灯亮,K3按下时,LED3灯亮,K4按下时,所有LED灯熄灭。实现方法为循环4次,首先若EINTPEND中有为1的值,则代表有相应的中断请求,通过循环中的i变量,即可得到相对位置,i+4则为它在GPKDATA比特串的实际位置,则GPKDATA相应位置设置为低电平输出管脚,相应的LED灯会亮,最后查询K4按键是否被按下,若被按下则所有LED灭。
为实现当K1按下时,LED1和LED2被点亮;当K2按下时,LED3和LED4被点亮;当K3按下时,LED1和LED3被点亮;当K4按下时,LED2和LED4被点亮。
只需编写一个循环,i循环1-4,如果EINT0PEND & (1<<i) == 1,则代表有相应的中断请求,如果是按键1中断,则GPKDATA ^= 0x30, LED1和LED2灯亮;如果是按键2中断,则GPKDATA ^= 0xa0,LED3和LED4灯亮; 如果是按键3中断,则GPKDATA ^= 0x50, LED1和LED3灯亮; 如果是按键4中断,则GPKDATA ^= 0xc0, LED2和LED4灯亮;程序如下图:
三、实验验收结果及其分析
实验验收情况为:通过验收
实验修改要求:实现当K1按下时,LED1和LED2被点亮;当K2按下时,LED3和LED4被点亮;当K3按下时,LED1和LED3被点亮;当K4按下时,LED2和LED4被点亮。
实验结果截图:
实验分析:
为实现当K1按下时,LED1和LED2被点亮;当K2按下时,LED3和LED4被点亮;当K3按下时,LED1和LED3被点亮;当K4按下时,LED2和LED4被点亮。
只需编写一个循环,i循环1-4,如果EINT0PEND & (1<<i) == 1,则代表有相应的中断请求,如果是按键1中断,则GPKDATA ^= 0x30, LED1和LED2灯亮;如果是按键2中断,则GPKDATA ^= 0xa0,LED3和LED4灯亮; 如果是按键3中断,则GPKDATA ^= 0x50, LED1和LED3灯亮; 如果是按键4中断,则GPKDATA ^= 0xc0, LED2和LED4灯亮;程序如下图:
修改之前:
修改后:
| | | |
《嵌入式系统原理》课程实验报告
实验名称 | 实验五 PWM 定时器实验 | ||
---|---|---|---|
实验日期 | 2022年5月21日 | 实验成绩 | |
一、实验目的和要求 | |||
学会Linux系统中开发C程序的步骤和方法。在此基础上,掌握通过C程序实现Tiny6410定时器初始化及中断处理的方法。 | |||
二、实验内容 | |||
1. 实验内容 | |||
本次实验使用Fedora 9.0操作系统环境,安装ARM-Linux的开发库及编译 器。学习在Linux下的编程和编译过程,即创建一个新目录timer,使用编辑器 建立start.S、main.c、timer.c和Makefile等文件。编译程序,并下载文件到 目标开发板上运行。 | |||
将1秒定时到达后四个LED灯同时亮/灭,修改为四个LED灯按流水灯方式循环显示(LED1→LED2→LED3→LED4→LED1→……)。 | |||
2. 实验设备及工具(包括软件调试工具) | |||
硬件:Tiny6410嵌入式实验平台。 | |||
软件:PC机操作系统Fedora9+MiniTools+ARM-Linux开发环境 | |||
3. 实验原理 | |||
1)PWM定时器 | |||
S3C6410内部包含五个32位定时器0~4。这些计时器通过产生内部定时中断 来与ARM微处理器交互。 | |||
2)中断控制原理 | |||
把外设的基地址告诉CPU。对于6410来说, 内存的地址范围为 0x00000000-0x60000000,外设的地址范围为0x70000000-0x7fffffff。关闭看门狗,防止程序不断重启;设置寄存器GPNCON,使接按键K0~K5 的GPN0~GPN5为中断功能;设置寄存器EINT0CON0,使按键的中断触发 信号采用下降沿触发;设置寄存器EINT0MASK,使按键对应的中断使能; 设置VIC0INTSELECT,使对应中断源工作于IRQ模式。在中断处理函数中,查询寄存器EINT0PEND,判断哪个中断发生,进而识别对应的按键。最后,向寄存器EINT0PEND对应位写“1”,以实现清除中断标记。 | |||
4.实验步骤 | |||
1)编写工作目录timer,编写源程序代码。Start.S的汇编源程序如下 | |||
Timer.C文件如下: | |||
Main.c文件如下 | |||
Makefile文件如下 | |||
2)编译及下载程序 | |||
切换到root用户,然后用cd命令进入到该文件夹下,执行make命令,生成timer.bin文件。然后按实验二给出的方法下载程序后,关闭开发板电源,首先将启动模式拨动开关S2拨动至“NAND”位置,然后重新开启开发板电源。初始状态4个灯全灭,每当定时器的1秒定时到达后,四个LED切换状态(灭->亮/亮->灭)。 | |||
3)实验修改 | |||
将1秒定时到达后四个LED灯同时亮/灭,修改为四个LED灯按流水灯方式循环显示(LED1→LED2→LED3→LED4→LED1→……)。 | |||
原函数为每当定时器的1秒定时到达后,四个LED切换状态(灭->亮/亮->灭)。实现过程为每当定时器的1秒定时达到后,将GPKDATA按位取反,即可实现4个LED灯的同时全亮和同时全灭,修改为四个LED灯按流水灯方式循环显示(LED1→LED2→LED3→LED4→LED1→……)。修改方法为修改timer.c中的do_irq()函数,因为要想实现流水线式的循环亮灭,需要定义一个全局变量count,然后编写一个循环,GKPDATA = ~(1<<4+(count%4)));然后count++,即可实现对GPKDATA的4、5、6、7输出端口分别置0(每次只有一个被置0,其他为1,代表每次亮一个灯),即可实现四个LED灯按流水灯方式循环显示(LED1→LED2→LED3→LED4→LED1→……)。 | |||
三、 实验验收结果及其分析 | |||
实验验收情况为:通过验收 | |||
实验修改要求:将1秒定时到达后四个LED灯同时亮/灭,修改为四个LED灯按流水灯方式循环显示(LED1→LED2→LED3→LED4→LED1→……)。 | |||
实验结果截图: |
实验分析:
将1秒定时到达后四个LED灯同时亮/灭,修改为四个LED灯按流水灯方式循环显示(LED1→LED2→LED3→LED4→LED1→……)。
原函数为每当定时器的1秒定时到达后,四个LED切换状态(灭->亮/亮->灭)。实现过程为每当定时器的1秒定时达到后,将GPKDATA按位取反,即可实现4个LED灯的同时全亮和同时全灭。
修改为四个LED灯按流水灯方式循环显示(LED1→LED2→LED3→LED4→LED1→……)。修改方法为修改timer.c中的do_irq()函数,因为要想实现流水线式的循环亮灭,需要定义一个全局变量count,然后编写一个循环,GKPDATA = ~(1<<4+(count%4)));然后count++,即可实现对GPKDATA的4、5、6、7输出端口分别置0(每次只有一个被置0,其他为1,代表每次亮一个灯),即可实现四个LED灯按流水灯方式循环显示(LED1→LED2→LED3→LED4→LED1→……)。
修改后的代码如下:
| | | |