极品飞思卡尔8位单片机MC9S08JM60开发板实践教程.docx
- 文档编号:6253659
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:80
- 大小:4.29MB
极品飞思卡尔8位单片机MC9S08JM60开发板实践教程.docx
《极品飞思卡尔8位单片机MC9S08JM60开发板实践教程.docx》由会员分享,可在线阅读,更多相关《极品飞思卡尔8位单片机MC9S08JM60开发板实践教程.docx(80页珍藏版)》请在冰点文库上搜索。
极品飞思卡尔8位单片机MC9S08JM60开发板实践教程
第一章搭建实验环境
系统时钟设置
#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文件,打开该文件的编辑界面,修改文件直到下面模样:
修改完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语言的数据结构和联合的用法。
关于方向寄存器的定义与此相似。
2〉关于采用for循环进行延时的问题。
首先这种方法很难做到精确的延时,而且对于首次使用这款单片机的人来说,粗略延时都很难估算,这是因为for循环的延时跟系统的总线时钟有关。
虽然电路板上焊接了4MHz晶振,但上面的例子并没有用到,用的是内部缺省时钟。
内部缺省时钟在不修改参数的情况下,总线时钟是8MHz。
如果在主函数死循环前面添加修改时钟的代码,将时钟切换到外部晶振,同时启用内部的PLL锁频环,将下面的代码放在for(;;)死循环之前,将会产生24MHz的总线时钟,重新下载运行后发现LED闪烁的速度明显加快。
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〉所有中断输入口公用一个中断向量,可允许或者禁止中断;
4〉键盘中断可以将芯片从低功耗中唤醒到正常工作模式。
2、跟键盘中断相关的三个寄存器,分别为状态与控制、管脚允许、中断触发沿模式选择。
1〉KBIStatusandControlRegister(KBISC)
3KBF
键盘中断标志—当检测到键盘中断时,该只读位置“1”。
2KBACK
键盘应答—写1到KBACK是标志清除机制的一部分,读时总为0。
1KBIE
键盘中断使能—给该位置“1”允许键盘中断申请。
0KBMOD
键盘中断触发模式—该位(与BKEDG位一起)选择键盘中断触发模式:
0-只检测边沿;1-检测边沿和电平。
2〉KBIPinEnableRegister(KBIPE)
7:
0KBIPEn
对应位置“1”允许管脚的KBI功能。
PTG3,PTG2,PTB5,PTB4,PTD3,PTD2,PTG1,PTG0
3〉KBIEdgeSelectRegister(KBIES)
7:
0
KBEDGn
0-对应管脚选择下降沿或低电平;
1-对应管脚选择上升沿或高电平。
PTG3,PTG2,PTB5,PTB4,PTD3,PTD2,PTG1,PTG0
3、键盘中断使用的初始化过程;
KBI首次使用时,为了不产生错误中断,建议初始化过程如下6步:
1〉清除KBISC中的KBIE位,以屏蔽KBI中断;
2〉设置KBIES寄存器中的KBEDGn位,选择使用管脚的中断触发极性;
3〉如果需要内部上拉/下拉电阻,配置PTxPE(PTGPE、PTDPE、PTBPE)位;
4〉设置KBIPE寄存器中的KBIPEn,允许对应管脚的KBI功能;
5〉给KBISC寄存器中的KBACK位写1,以清除所有KBI中断标志;
6〉设置KBISC寄存器中的KBIE位,以允许KBI中断。
4、建立实验工程
按照第二章的步骤,建立工程“按键控制LED”,该工程的最终目的是利用两个按键控制两个LED的亮灭,当按压key4时,D1的亮灭状态发生改变;按压key5时,D2的亮灭状态发生改变。
修改主文件直到如下模样:
5、讨论
1〉该键盘中断程序与上一章程序最大的区别就是使用了中断的方法进行程序设计,主文件中有两个函数:
voidmain(void){}
interruptVectorNumber_Vkeyboardvoidkbi_isr(){}
第二个函数中,interrupt为C语言保留字,表明后面的kbi_isr()是中断函数,中间的VectorNumber_Vkeyboard是该单片机键盘中断的中断号,来自于头文件MC9S08JM60.h,在该文件开头位置有语句
#defineVectorNumber_Vkeyboard25
关于中断的更多内容,参加后续章节。
2〉由于该单片机的8个键盘中断共用一个中断号,因此为了区别到底是哪个按键被按下,还需要在中断程序里读取管脚对应的数据寄存器的数值,根据数据寄存器的数值决定哪个键被按下。
比如,为了区别key4和key5,这两个管脚分别为PTB4和PTB5,因此需要读取B口的数据寄存器PTBD,根据PTBD_PTBD4和
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 极品 卡尔 单片机 MC9S08JM60 开发 板实 教程
![提示](https://static.bingdoc.com/images/bang_tan.gif)