天津大学嵌入式系统——Blinky实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Blinky实验
一、建立Keil工程
1.选择Project→New uVision Project命令,弹出Create New Project 对
话框,指定工程路径并在文件名文本框中输入Blinky,如图1所示。
图1
2.单击“保存”按钮,弹出Select Device for Target 窗口,在左侧的
列表框中选择CPU的类型(Philips的LPC2138芯片),右边对应出现该
芯片的资源描述,如图2所示。
图2
3.单击OK按钮,出现如图3所示提示信息(是否复制启动代码到工程文件
夹并添加文件到工程中)。这里的启动代码是依据设置的编译器而生成的。
图3
4.单击是按钮添加启动代码,此时启动代码已经添加到工程中,左侧的
Project Workspace 中显示添加的启动代码文件,双击Startup.s可查看代码,如图4所示。
图4
5.在工作空间中选中Target 1,单击右键从弹出菜单选择Add Group,分
别添加System Calls 和 Source Code两个文件夹,然后右键从弹出菜单选择Add Files to Group“System Calls/Source Code”命令分别为其添加retarget.c和blinky.c文件,如图5所示。
图5
二、进行工程配置
1.在工作空间选择Target1 右键选择Options for Target‘Target1’命
令,弹出对话框如图6所示,设置Xtal为8MHz。
图6
2.单击Output标签,再单击Create Hex File前面的单选按钮,如图7
所示。可生成hex格式可执行文件,再单击Select Folder for Objects
按钮,指定输出文件路径。
图7
3.单击Listing标签,再单击Select Folder for Listings按钮,指定生
成的list文件的输出路径,然后单击Assembler Listing和Linker Listing前面的单选按钮,如图8所示。
图8
4.单击Linker标签,设定链接器参数,指定Linker Script文件的路径,
如图9所示,单击Edit按钮对Flash.ld文件进行编辑。
图9
5.单击OK按钮保存设置。
三、Build目标
在工作空间右键单击选择Build Target或者按F7键,编译并链接工程,输出窗口如图10所示。
四、程序仿真
1.Keil内寄存器查看结果,如图11所示。
图11
观察到IO口16~23依次输出为1,然后23~16依次输出为1,无限循环。
2.电路仿真
1)启动Proteus,连接如图所示电路。
图12
2)选择元件LP2318,在弹出的快捷菜单中选择编辑属性,在Program
Files栏设定程序文件(blinky.hex)的路径,如图13所示。
图13
3)运行仿真,仿真结果如图14所示。(IO口输出为1时灯灭!)
图14
五、程序分析
1.
Retarget.c //此程序文件主要用来重新实现底层IO的基
本函数#include
#pragma import(__use_no_semihosting_swi) //不使用编译器自带的软
中断服务函数
void _sys_exit(int return_code) {
label: goto label; /* endless loop */
} //系统退出的底层实现,直接用死循环来模拟最后程序的退出。
2.blinky.c
#include
void wait (void) { /* 延时函数 */
int d;
for (d = 0; d < 1000000; d++);
}
int main (void) {
unsigned int i; /* LED 标号 */
IODIR1 = 0x00FF0000; /* P1.16..23 定义为输出口*/
while (1) { /* 无限循环 */
for (i = 1<<16; i < 1<<23; i <<= 1) { /* i从16递加到23 */ IOSET1 = i; /* 使对应P.i输出为1 */ wait (); /* 延时 */
IOCLR1 = i; /* 使对应P.i输出为0 */ }
for (i = 1<<23; i > 1<<16; i >>=1 ) { /* i从23递减到16*/ IOSET1 = i; /*使对应P.i输出为1 */ wait (); /*延时*/
IOCLR1 = i; /*使对应P.i输出为0 */ }
}
}
/*P.i输出为1时,电路仿真中灯灭;P.i输出为0时,电路仿真中灯亮 */