飞思卡尔单片机应用实验
指 导 书
机械工程学院机械电子工程教研室
实验一 飞思卡尔嵌入式实验系统入门—GPIO控制实验
一、实验目的:
熟悉CodeWarrior集成开发环境及飞思卡尔嵌入式实验开发系统
掌握AW60的GPIO结构及控制方法
掌握CodeWarrior工程结构及创建汇编工程
熟悉汇编指令及应用汇编语言编程方法
二、实验内容
1.运用CodeWarrior新建工程,进行工程程序编辑、编译、下载、调试
2.利用飞思卡尔嵌入式实验开发系统根据实验需要进行硬件连接
3.根据连接在PTD口上的两个拨动开关的状态,控制接中PTB口上的八个LED处在以下四种不同状态:八个LED亮—灭循环;四个灯交替亮—灭;一个LED左移流水灯;两个LED右移流水灯。
实验接线原理图
图1-1 I/O口实验接线图
三、实验步骤
1.将飞思卡尔嵌入式实验开发系统实验箱接上电源,写入器BDM接头插接入核心卡BDM座,USB头接入PC机USB口。
2.PC机上启动CodeWarrior,新建工程p(注意设置工程保存路径)
3.观察工程文件结构,查看相应文件。
4.在main.asm中编辑工程主文件
5.编辑相关子程序
6.编译,如果有错误修改,直至编译通过
7.链接、下载,调试观察LED灯现象
四、思考题
1.汇编语言指导书CodeWarrior建立工程有什么工程框架文件,这些文件的作用?
2.嵌入式开发系统有哪些主要元器件?
3.如果采用模块化设计方法,将系统初始化、LED灯控制、延时程序等各自形成文件,工程应用这些文件时应注意什么?
4.上拉电阻和下拉电阻分内置的和外接的,内置的电阻一般只有几K或十几K,外接电阻可以是几M、十几M甚至更大。当要求功耗较低时,应该怎样选择内置的还是外接的电阻?
5.该实验的开关通过I/O口控制小灯的程序,分别叙述断点调试和单步调试的步骤,其中包含:利用汇编语言时,注意观察寄存器值的变化并记录寄存器中每次的值
实验二 串口通信(SCI)实验
一、实验目的:
1.进一步熟悉嵌入式开发系统环境、汇编、C语言、调试方式。
2.加强串口通信(SCI)基本原理及编程原理的理解。
3.理解C语言工程结构,掌握运用08C建立工程的方法。
4.分别运用查询方式、中断方式实现通信。
二、实验要求:
1.仔细阅读本实验指导书。
2.复习有关的串行通信(SCI)的章节
3.熟悉AW60串行通信(SCI)的工作方法及编程。
4.根据实验内容要求编写好程序,为实验做充分地准备。
实验原理图如下:
三.实验设备及其连接
1.PC机 一台
2.飞思卡尔嵌入式实验开发系统 一台
3.串行通信线 一根
4.万用表 一只
四.实验内容
1.理解串行通信(SCI)原理。
2.运行与理解各子程序。
3.主程序运行课本的样例程序。
4.编制一个查询方式通信程序。
将字符通过SCI一个一个地发送,发送完一个字符后,控制接在PTB0~PTB7的8个LED灯显示被发送字符的ASCII码。
5.编制一个中断方式通信程序。
编程要求同上一条。
五.编程提示
1.按照结构要求写好编程代码和注释。
2.计算波特率,SCInInit(SCI初始化子程序)设置SCI比特率寄存器(SCInBDH,SCInBDL),设置允许SCI、正常码输出、8位数据、无校验,即设置SCI控制寄存器1(SCIxC1)相应位,设置是否允许发送与接收、是中断接收还是查询接收,即设置SCI控制寄存器2(SCIxC2)相应位。
3.查询方式通信程序的主程序主体是一个死循环,循环体中是不断检测SCI是否发送完毕,即检测SCI状态寄存器1(SCIxS1)第七位是否为1,为1则将字符的ASCII码输出到接在PTB口的LED上,并延时一会。
4.中断方式通信程序的主程序也主体是一个死循环,但该循环体是一个空循环体,所有接收和发送数据程序代码放在中断程序中,这里没有检测代码,数据开始发送和接收的条件就是中断的条件。
六.实验报告要求
1.小结AW60串行通信(SCI)的原理及编程,并画出其流程图和程序代码与硬件接线图。
2.小结中断方式和查询方式的编程方法,并画出其流程图和程序代码与硬件接线图。
3.回答下列问题
(1)串行SCI通信有哪些中断?各在什么情况下发生,作用是什么?
(2)如何知道串行口TX发送了信号?
提示:方法一,利用万用表在TX端发送0或者255持续0.5秒钟时的电压值。
方法二,在TX端发送0或255持续0.5秒钟的波形时的小灯变化。
七.参考例程:
void main(void) {
unsigned char SerialBuff[]="Hello! World!"; //初始化存放接收数据的数组
//1 关总中断
DisableInterrupts; //禁止总中断
//2 芯片初始化
MCUInit();
//3 模块初始化
SCIInit(); //串行口初始化
//4 开放中断
EnableInterrupts; //开放总中断
SCISendN(13,SerialBuff); //串口发送“Hello World!”
//5 主循环
while (1)
{
if
((SCI1S1&SCI1S1_RDRF_MASK)!=0) {
PTBD=SCI1D ;
if((SCI1S1&SCI1S1_TDRE_MASK)!=0)
SCI1D=PTBD;
}
else
PTBD=0x00;
}
}
void MCUInit(void)
{
SOPT = 0b01100000; //$70 System Options Register(write once)
ICGC2 = 0b00110000; //$30 internal clock generation 2
ICGC1 = 0b01111000; //$78 internal clock generation 1
//等待FLL稳定
while(!ICGS1_LOCK);
PTBDD=0xff ;
PTBD=0xff ;
}
void SCIInit()
{
unsigned int ubgs,baud=9600;
unsigned char sysclk=20;
//1.计算波特率并设置:ubgs = fsys/(波特率*16)(其中fsys=sysclk*1000000)
ubgs = sysclk*(10000/(baud/100))/16; //理解参考上一行,此处便于CPU运算
SCI1BDH= (unsigned char)((ubgs & 0xFF00) >> 8);
SCI1BDL= (unsigned char)(ubgs & 0x00FF);
//无校验,正常模式(开始信号 + 8位数据(先发最低位) + 停止信号)
SCI1C1= 0;
//允许发送,允许接收,查询方式收发
SCI1C2= (0
| SCI1C2_TE_MASK
| SCI1C2_RE_MASK );
}
void SCISend1(unsigned char ch)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论