飞思卡尔8位单片机MC9S08JM60开发板实践教程共40页word资料.docx
《飞思卡尔8位单片机MC9S08JM60开发板实践教程共40页word资料.docx》由会员分享,可在线阅读,更多相关《飞思卡尔8位单片机MC9S08JM60开发板实践教程共40页word资料.docx(73页珍藏版)》请在冰豆网上搜索。
飞思卡尔8位单片机MC9S08JM60开发板实践教程共40页word资料
第一章搭建实验环境
其实,任何一门学科都离不开死记硬背,关键是记忆有技巧,“死记”之后会“活用”。
不记住那些基础知识,怎么会向高层次进军?
尤其是语文学科涉猎的范围很广,要真正提高学生的写作水平,单靠分析文章的写作技巧是远远不够的,必须从基础知识抓起,每天挤一点时间让学生“死记”名篇佳句、名言警句,以及丰富的词语、新颖的材料等。
这样,就会在有限的时间、空间里给学生的脑海里注入无限的内容。
日积月累,积少成多,从而收到水滴石穿,绳锯木断的功效。
系统时钟设置
这个工作可让学生分组负责收集整理,登在小黑板上,每周一换。
要求学生抽空抄录并且阅读成诵。
其目的在于扩大学生的知识面,引导学生关注社会,热爱生活,所以内容要尽量广泛一些,可以分为人生、价值、理想、学习、成长、责任、友谊、爱心、探索、环保等多方面。
如此下去,除假期外,一年便可以积累40多则材料。
如果学生的脑海里有了众多的鲜活生动的材料,写起文章来还用乱翻参考书吗?
#include"App\Include\App.h"
单靠“死”记还不行,还得“活”用,姑且称之为“先死后活”吧。
让学生把一周看到或听到的新鲜事记下来,摒弃那些假话套话空话,写出自己的真情实感,篇幅可长可短,并要求运用积累的成语、名言警句等,定期检查点评,选择优秀篇目在班里朗读或展出。
这样,即巩固了所学的材料,又锻炼了学生的写作能力,同时还培养了学生的观察能力、思维能力等等,达到“一石多鸟”的效果。
#ifndef_MCG_C
#define_MCG_C
//oscillator12MHZ倍频为24MHZ()先8分频后16倍频
voidS_MCGInit(void)
/*theMCGisdefaultsettoFEImode,itshouldbechangetoFBEmode*/
MCGC2
[7:
6]BDIV
总线频率分频因子–选择由MCGC1寄存器中CLKS位决定的时钟源的分频。
这控制总线频率。
00编码0–时钟1分频
01编码1–时钟2分频(复位后默认)
10编码2–时钟4分频
11编码3–时钟8分频
[5]RANGE
频率范围选择–选择外部振荡器或者外部时钟源的频率范围。
1选择1MHz到16MHz外部振荡器的频率范围。
(1MHz到40MHz的外部时钟电源)的高频率范围
0选择32kHz到100kHz外部振荡器的频率范围。
(32kHz到1MHz的外部时钟电源)的低频率范围
[4]HGO
高增益振荡器选择–控制外部振荡器操作模式。
1配置外部振荡器为高增益运行
0配置外部振荡器为低功耗运行
[3]LP
低功耗选择–控制在忽略模式中FLL(或者PLL)是否为无效
1FLL(或PLL)在忽略模式(低功耗)中为无效的。
0FLL(或PLL)在忽略模式中为无效的。
[2]EREFS
外部参考时钟选择–为外部参考选择时钟源
1选择振荡器
0选择外部时钟源
[1]ERCLKEN
外部参考时钟使能–使能外部参考时钟作为MCGERCLK
1MCGERCLK激活
0MCGERCLK无效
[0]EREFSTEN
外部参考时钟停止使能
MCGC20b00110110激发外部时钟(晶振)(没有使能)
MCGC2=MCGC2_RANGE_MASK|MCGC2_HGO_MASK|MCGC2_EREFS_MASK|MCGC2_ERCLKEN_MASK;
while(!
MCGSC_OSCINIT);//MCGSC寄存器中OSCINIT(第1位)为1,表示由EREFS位选择的晶振被初始化。
MCGC1
[7:
6]
6:
CLKS0
7:
CLKS1
时钟源选择–选择系统时钟源
00编码0–FLL或者PLL被选择
01编码1–内部参考时钟被选择
10编码2–外部参考时钟被选择
11编码3–保留,默认为00
[5:
3]
3;RDIV0:
1;
4;RDIV1:
1;
5;RDIV2:
1;
参考分频因子–选择由IREFS位确定的参考时钟的分频因子。
如果FLL被选择,结果频率必须在31.25kHz到39.0625kHz范围之内内.
如果PLL被选择,结果频率必须在1MHz到2MHz之间。
000编码0–参考时钟1分频(复位默认)
001编码1–参考时钟2分频
010编码2–参考时钟4分频
011编码3–参考时钟8分频
100编码4–参考时钟16分频
101编码5–参考时钟32分频
110编码6–参考时钟64分频
111编码6–参考时钟128分频
[2]
IREFS
内部参考电源选择
1选择内部参考时钟
0选择外部参考时钟
[1]IRCLKEN
内部参考时钟使能–使能内部参考时钟用作MCGIRCLK
1MCGIRCLK激活
0MCGIRCLK禁止
[0]IREFSTEN
内部参考停止使能–控制当MCG进入停止模式的时候是否选择内部参考时钟保持使能。
1如果在进入停止模式之前IRCLKEN被设置或者是MCG在FEI,FBI,或者是BLPI模式,
在停止模式中内部参考时钟保持使能,
0内部参考时钟在停止模式中无效
MCGC1外部参考时钟;8分频;外部时钟激活;
MCGC1=MCGC1_CLKS1_MASK|MCGC1_RDIV1_MASK|MCGC1_RDIV0_MASK|
MCGC1_IRCLKEN_MASK|MCGC1_IREFSTEN_MASK;//enableexternalOscollator;8分频
[7]LOLS
锁定丢失状态–此位标志了FLL或者是PLL的锁定状态。
当在要求锁定之后,锁定使能时LOLS被置位,
FLL或者PLL输出频率降低解锁超出了频率范围
DunlLOLIE决定当通过复位或者是写逻辑以到LOLS将LOLS清除时是否中断响应。
想LOLS写0没有影响。
[6]LOCK
锁定状态–指示FLL或者是PLL要求锁定。
当FLL和PLL无效时锁定检测无效。
当改变以下任何位时锁定状态位被置位:
IREFS,PLLS,RDIV[2:
0],TRIM[7:
0(如果处于FEI或者FBI模式中),
或者是VDIV[3:
0](如果处于PBE或者PEE模式中),
将引起锁定状态为清除并且保持直到FLL或者PLL要求锁定。
进入停止模式同样能引起BCK状态位清除并保持到FLL或者PLL要求锁定。
进入BLPI或者BLPE模式将同样导致锁定位清除并保持直到MCG退出这些模式并且FLL或者PLL要求锁定。
0FLL或者PLL当前未锁定
1FLL或者PLL当前锁定
[5]PLLST
PLL选择状态–PLLST位指示了PLLS时钟的当前时钟源。
当向PLLS位写操作时PLLST位不会立即更新。
0FLL时钟作为PLLS的时钟源
1PLL时钟作为PLLS的时钟源
[4]REFST
内部参考状态–IREFST位指示了参考时钟的当前时钟源。
在向IREFS位写后,IREFST不会立即更新。
0参考时钟源是外部参考时钟(由MCGC2寄存器中EREFS位决定的振荡器或者是外部时钟源)
1参考时钟源是内部参考时钟
[3:
2]CLKST
时钟模式状态–CLKST位指示了当前时钟模式。
在想CLKS位写入后,CLKST位不会立即更新。
00编码0–FLL的输出被选择
01编码1–内部参考时钟被选择
10编码2–外部参考时钟被选择
11编码3–PLL的输出被选择
[1]SCINIT
OSC初始化–如果外部参考时钟被选择(通过置位ERCLKEN或者通过MCG处于FEE,FBE,PEE,PBE,BLPE模式中),
如果EREFS被置位,在外部振荡器时钟完成的初始化周期EREFS将被置位。
此位只有当EREFS被清除或者是当MCG在FEI,FBI,BLPI模式中并且ERCLKEN被清除的时候才会被清除。
[0]FTRIM
MCG精密校正–控制内部参考时钟频率的最小的校正。
设置FTRIM将增加周期,清除FTRIM将会降低周期。
如果FTRIM值被存储在非易失性的存储器中,用户应该将其拷贝到寄存器的FTRIM位。
MCGSC0b000111000b00001000判断是否外部时钟被选择了,没选择才选择
while((MCGSC&0x1C)!
=0x08);//0b00011100checktheexternalreferenceclockisselectedornot
/*SwitchtoPBEmodefromFBE*/
MCGC3
[7]LOLIE
锁定丢失中断使能–决定当出现丢失锁定时是否产生一个中断。
LOLIE位只有当LOLS被设置时才有作用
0不响应丢失锁定中断
1产生丢失响应中断
[6]PLLS
PPL选择–控制PLL还是FLL被选择。
如果PLLS位清除,PLL在所有模式中无效。
如果PLLS被设置,FLL在所有模式中无效。
1PLL被选择
0FLL被选择
[5]CME
时钟监视器使能|决定当丢失外部时钟出现时是否产生复位请求。
无论当MCG使用外部时钟并处于操作模式(FEE,FBE,PEE,PBE或者BLPE)
还是外部参考时钟有效(ERCLKEN=1在MCGC2寄存器中),MCE位只能被设置为逻辑1.
无论什么时候CME位被设置为逻辑1,MCGC2寄存器中RANGE位的值不应该被改变。
0时钟监视器被禁止
1当丢失外部时钟时产生一个复位请求
[3:
0]VDIV
VCO分频因子–选择PLL的输出VCO的分频因子?
DIV位确定参考时钟频率的倍频因子(M)
0000编码0-保留
0001编码1-4倍频
0010编码2–8倍频
0011编码3-12倍频
0100编码4-16倍频
0101编码5–20倍频
0110编码6–24倍频
0111编码7–28倍频
1000编码8–32倍频
1001编码9–36倍频
1010编码10–40倍频
1011编码11–保留(默认M=40)
11xx编码12-15–保留(默认M=40)
MCGC3选择PLLS16倍频0b01000100
MCGC3=MCGC3_PLLS_MASK|MCGC3_VDIV3_MASK;
while((MCGSC&0x48)!
=0x48);//waitforthePLLislocked&
//0b01001000锁定外部时钟
/*SwitchtoPEEmodefromPBEmode*/
MCGC1&=MCGC1_RDIV2_MASK|MCGC1_RDIV1_MASK|MCGC1_RDIV0_MASK|
MCGC1_IREFS_MASK|MCGC1_IRCLKEN_MASK|MCGC1_IREFSTEN_MASK;
//选定
while((MCGSC&0x6C)!
=0x6C);//0b01101100
#endif
1、实验电路图
本实验图包含两大部分,分别是CPU.SCH和实验资源.SCH。
CPU采用飞思卡尔8位单片机MC9S08JM60CLD,(电路图介绍)
图1-3
实验资源部分电路
图1-4
LCD串口1602液晶电路
图1-5
RS232接口电路
图1-6
数码管显示电路
图1-7
发光管、ad转换以及按键电路
图1-8
2、集成开发软件环境的建立
1〉运行文件CW_MCU_V6_3_SE.EXE,在电脑C盘安装飞思卡尔8位(及简化32位)单片机集成开发环境codewarrior6.3版本
2〉运行USBDM_4_7_0i_Win,这个程序会在c盘的程序文件夹下增加一个目录C:
\ProgramFiles\pgo\USBDM4.7.0,在这个目录下
a>C:
\ProgramFiles\pgo\USBDM4.7.0\FlashImages\JMxx下的文件USBDM_JMxxCLD_V4.sx是下载器的固件文件;
b>C:
\ProgramFiles\pgo\USBDM4.7.0\USBDM_Drivers\Drivers下有下载器的usb驱动.因此在插入usb下载器,电脑提示发现新的usb硬件的时候,选择手动指定驱动安装位置到以上目录即可。
3〉运行USBDM_4_7_0i_Win之后,还会在目录:
C:
\ProgramFiles\Freescale\CodeWarriorforMicrocontrollersV6.3\prog\gdi下增加一些文件,从修改时间上来看,增加了6个文件,这些文件是为了在codewarrior集成开发环境下对usb下载器的调试、下载的支持。
3、C语言编程基础
第二章LED闪烁程序编写过程
1、新建工程
运行单片机集成开发环境codewarriorIDE
出现如下界面
●CreateNewProject:
创建一个新项目工程
●LoadExampleProject:
加载一个示例工程
●LoadPreviousProject:
加载以前创建过的工程
●RunGettingstartedTutorial:
运行CodeWarrior软件帮助文档
●StartUsingCodeWarrior:
立刻使用CodeWarrior
点击CreateNewproject按钮,以创建一个新的工程,出现选择CPU的界面如下,请选择HCS08/HCS08JMFamily/MC9S08JM60,在右边的Connection窗口可以选择最后一个开源下载器HCS08OpenSourceBDM。
下一步后出现编程语言选择和指定项目名称以及存放位置界面
选择C语言,项目名称就写“LED闪烁”,保存位置自己决定,但要记住。
后面有些选项就暂时跳过,选择“完成”后,并将文件夹展开的样子如下:
点击“make”快捷按钮正确编译后,左边的钩钩全部消失,同时在Code和Data列出现了相关的代码和数据量。
2、修改主文件并下载运行
在左侧双击mian.c文件,打开该文件的编辑界面,修改文件直到下面模样:
#include/*forEnableInterruptsmacro*/
#include"derivative.h"/*includeperipheraldeclarations*/
voidmain(void){
//EnableInterrupts;//不开中断,因此将此句去掉了
wordi,j;//定义两个word(int)型的变量i和j
SOPT1=0;//关闭看门狗
PTBDD_PTBDD0=1;//设置B0为输出
PTBDD_PTBDD1=1;//设置B1为输出
for(;;){//死循环,类似while
(1)
PTBD_PTBD0=0;//B0输出“0”,点亮D1,见图1-8
PTBD_PTBD1=1;//B1输出“1”,D2灭
for(i=0;i<2000;i++){//2个for循环嵌套,延时大约半秒
for(j=0;j<100;j++){}
}
PTBD_PTBD0=1;//B0输出“1”,D1灭
PTBD_PTBD1=0;//B1输出“0”,D2亮
for(i=0;i<2000;i++){//延时
for(j=0;j<100;j++){}
}
//__RESET_WATCHDOG();//看门狗已经关闭,不需要喂狗了
}
}
修改完main.c文件后,点击最右边的debug按钮。
出现下载器配置界面,如果没出现说明下载器没有正确安装。
选择“5V”是打算让下载器给目标板供电5V。
确保其它选项都对后,选择“ok”
出现装载警告
继续“ok”后程序下载到单片机中。
在调试界面里点击运行按钮,让程序全速运行后应该看到两个LED交替点亮。
3、延伸讨论
1〉在修改主程序main.c的过程中,对寄存器SOPT1、PTBDD_PTBDD0、PTBD_PTBD0的名称问题,对于刚入手者确实有一定难度。
由于包含了文件"derivative.h",该文件又包含了“MC9S08JM60.h”,这是与选用的cpu相关的,建议打开这个cpu相关的头文件仔细阅读,对于B口数据寄存器的定义如下,如果看不懂建议要搞懂C语言的数据结构和联合的用法。
关于方向寄存器的定义与此相似。
/***PTBD-PortBDataRegister;0x00000002***/
typedefunion{
byteByte;
struct{
bytePTBD0:
1;/*PortBDataRegisterBit0*/
bytePTBD1:
1;/*PortBDataRegisterBit1*/
bytePTBD2:
1;/*PortBDataRegisterBit2*/
bytePTBD3:
1;/*PortBDataRegisterBit3*/
bytePTBD4:
1;/*PortBDataRegisterBit4*/
bytePTBD5:
1;/*PortBDataRegisterBit5*/
bytePTBD6:
1;/*PortBDataRegisterBit6*/
bytePTBD7:
1;/*PortBDataRegisterBit7*/
}Bits;
}PTBDSTR;
externvolatilePTBDSTR_PTBD@0x00000002;
#definePTBD_PTBD.Byte
#definePTBD_PTBD0_PTBD.Bits.PTBD0
#definePTBD_PTBD1_PTBD.Bits.PTBD1
#definePTBD_PTBD2_PTBD.Bits.PTBD2
#definePTBD_PTBD3_PTBD.Bits.PTBD3
#definePTBD_PTBD4_PTBD.Bits.PTBD4
#definePTBD_PTBD5_PTBD.Bits.PTBD5
#definePTBD_PTBD6_PTBD.Bits.PTBD6
#definePTBD_PTBD7_PTBD.Bits.PTBD7
2〉关于采用for循环进行延时的问题。
首先这种方法很难做到精确的延时,而且对于首次使用这款单片机的人来说,粗略延时都很难估算,这是因为for循环的延时跟系统的总线时钟有关。
虽然电路板上焊接了4MHz晶振,但上面的例子并没有用到,用的是内部缺省时钟。
内部缺省时钟在不修改参数的情况下,总线时钟是8MHz。
如果在主函数死循环前面添加修改时钟的代码,将时钟切换到外部晶振,同时启用内部的PLL锁频环,将下面的代码放在for(;;)死循环之前,将会产生24MHz的总线时钟,重新下载运行后发现LED闪烁的速度明显加快。
MCGC2=0x36;
while(!
MCGSC_OSCINIT);
MCGC1=0xB8;
while(MCGSC_IREFST);
while(MCGSC_CLKST!
=2);
MCGC1=0x88;//RDIV=2;//0x90;//RDIV=4
MCGC3=0x46;//24倍频;//0x44;//16倍频
while(!
MCGSC_PLLST);
while(!
MCGSC_LOCK);
MCGC1=0x08;//切换到PLL0x10;
while(MCGSC_CLKST!
=3);
3〉如果没有硬件,也可以完全采用软件仿真的方法进行程序设计,改动过程如下:
a〉首先确保在工程硬件连接下拉中选择第一项“FullChipSimulation”,如果有硬件,对于自制的开源下载器则应该选择“HCS08OpenSourceBDM”
b〉点击“debug”按钮后不会出现下载器配置界面,而是直接进入调试界面,在调试界面选择“Component/Open…”菜单。
在弹出的界面里,双击虚拟可视工具。
在虚拟可视工具编辑界面被打开后,就可以从主菜单栏选择“VisualizationTool/AddNewInstrument/LED”
在放好LED,并调节大小合适后,在LED上右击鼠标,选择第一项打开LED的属性页
在属性页中修改该LED对应的内存memory的地址为0x02(从讨论1中已经知道B口的数据寄存器的地址就是0x02),同时修改“Bitnumbertodisplay”为“0”,也就是该LED对应PTBD_PTBD0。
采用相同的方法放另一个LED,修改属性页使得对应PTBD_PTBD1。
放好两个LED后,在空白的地方右键鼠标并选择属性,打开属性页
在属性页的最下面选择刷新模式为周期性“Periodical”,刷新间隔可以用缺省的10ms。
全部修改完成后选择保存成文件以备后用。
既然是采用没有硬件的完全仿真模式,一定要去掉跟硬件相关的代码,比如讨论2中添加的将时钟切换到外部晶振的代码一定要去掉。
然后就可以全速运行了。
在完全仿真模式下,LED闪烁的速度跟实际硬件相比还是不一样的,只能是功能仿真。
第三章按键程序设计过程
1、按键与cpu的连接,从图1-3可以看出,按键4、按键5分别与PTB4和PTB5相连。
该款单片机MC9S08JM60一共有8个键盘输入口,从数据手册可以看出非常分散。
键盘中断输入
对应管脚
所属端口
KBIP0
PTG0
PTG
KBIP1
PTG1
KBIP2
PTD2
PTD
KBIP3
PTD3
KBIP4
PTB4
PTB
KBIP5
PTB5
KBIP6
PTG2
PTG
KBIP7
PTG3
总体来说,该款单片机的八个键盘中断输入特点如下:
1〉可以单独允许某一个中断输入脚,其他不用的做一般I/O;
2〉每个中断输入脚都可以单独编程设置为下降沿触发、上升沿触发、下降沿和低电平触发、上升沿和高电平触发;
3〉所有中断输入口公用一个中