1飞思卡尔8位单片机MC9S08JM60开发板实践教程60页word资料文档格式.docx
《1飞思卡尔8位单片机MC9S08JM60开发板实践教程60页word资料文档格式.docx》由会员分享,可在线阅读,更多相关《1飞思卡尔8位单片机MC9S08JM60开发板实践教程60页word资料文档格式.docx(52页珍藏版)》请在冰豆网上搜索。
![1飞思卡尔8位单片机MC9S08JM60开发板实践教程60页word资料文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/23/6e060b5c-387d-4c28-9070-1c67a7de4e2c/6e060b5c-387d-4c28-9070-1c67a7de4e2c1.gif)
加载一个示例工程
●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
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)
KBEDGn
0-对应管脚选择下降沿或低电平;
1-对应管脚选择上升沿或高电平。
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和PTBD_PTBD5的值可以知道key4或者key5是否被按下。
3〉在读取相应的数据寄存器前,可以有小的延时,以便去除按键的机械抖动。
4〉在键盘中断程序的最后语句KBISC=0x06;
是为了对KBACK写“1”以便清除中断标志。
第四章SCI串口通讯程序设计过程
1、搞清楚SCI串口通讯的硬件连接,从图1-3和1-6中可以看出,实验板使用了第一个串口,对应管脚PTE0(发送)、PTE1(接收),经过RS232电平转换芯片ICL3232E之后,连接到9针接口COM0上。
2、SCI串口的初始化
Sci串口初始化主要是设置波特率,jm60单片机的波特率设置寄存器有SCI1BDH
和SCI1BDL
波特率设置遵循公式:
SCI波特率=BUSCLK/(16×
BR),公式里的BR就是需要初始化设置给SCI1BDH、SCI1BDL的13位数值。
由于头文件的帮忙,对SCI1BDH、SCI1BDL的设置可以用一条语句整体赋值就是SCI1BD=BUSCLK/16/SCI波特率;
比如要设置成9600的波特率,而且知道总线时钟为8MHz,则波特率设置语句为:
SCI1BD=8000000/16/9600;
3、SCI寄存器设置
SCIxC1
7LOOPS
LOOPS=1时,发送器输出与接收器输入内部连接。
6
SCISWAI
0――在等待模式下,SCI时钟继续运行,因而SCI可以作为唤醒CPU中断的源。
1――当CPU处于等待模式时,SCI时钟停止。
5
RSRC
接收器源选择—只有LOOPS位被设置为1,该位才有意义或有效。
当LOOPS=1时,接收器输入与发送器输出内部连接。
RSRC的作用是确定此连接是否与TxD管脚连接。
0―此时LOOPS=1,RSRC=0选择内部回送模式,TxD管脚不与发送器输出和接收器输入连接。
1―此时LOOPS=1,RSRC=1为单线SCI模式,TxD管脚与发送器输出和接收器输入连接。
4
M
9位或8位模式
0――正常,起始位+8个数据位(首先是LSB)+停止位。
1――接收器和发送器使用9位数据字符。
起始位+8个数据位(首先是LSB)+第9位数据位+停止位。
3
WAKE
接收器唤醒方法(一般用在多机处理系统中)
0――空闲线唤醒。
1――地址位唤醒。
2
ILT
空闲线类型选择
0――空闲字符位计数在起始位后启动。
1――空闲字符位计数在停止位后启动。
1
PE
奇偶校验使能——使能硬件奇偶校验产生和检查。
当奇偶检验使能时,数据字符的MSB(第8或第9数据位)被视为奇偶校验位。
0――无硬件奇偶校验产生和检测。
1――奇偶校验被使能。
PT
奇偶校验类型——如果奇偶校验被使能(PE=1),该位用于选择偶校验或奇校验。
偶校验指的是数据字符中1的总数量(包括奇偶校验位)为偶数。
奇校验指的是数据字符中1的总数量(包括奇偶校验位)为奇数。
0――偶校验。
1――奇校验。
SCIxC2
7
TIE
发送中断使能(针对于状态位TDRE)
0―不启动TDRE中断(使用查询方式)。
1―启动TDRE中断,当TDRE标志为1时,产生硬件中断请求。
TCIE
发送完成中断使能(针对于TC)
0―启动TC中断,当TC标志为1时,进行硬件中断请求;
1―不启动TC中断(使用查询方式)
RIE
接收器中断使能(对于RDRF)
0―不启动RDRF中断(使用查询方式);
1―启动RDRF中断,当RDRF标志为1时,产生硬件中断请求。
ILIE
空闲线中断使能(对于IDLE)
0―来自IDLE的硬件中断被禁止(使用查询方式)。
1―当IDLE标志为1时,进行硬件中断请求。
3TE
发送器使能:
0―发送器关闭;
1―发送器打开
2RE
接收器使能――当SCI接收器关闭时,RxD管脚重新成为通用目的端口I/O管脚。
0―接收器关闭;
1―接收器打开
RWU
接收器唤醒控制—可被改写为1,用于将SCI接收器设置为等待状态,等待选中的唤醒条件满足才工作。
唤醒条件由WAKE决定。
用户设置RWU后,唤醒条件满足后,硬件会自动清除RWU。
0―SCI接收器正常工作;
1―SCI接收器等待唤醒条件才工作。
SBK
发送中断—向SBK写1再写0,会将中断字符(10位或11位的0)插进正在发送的数据流中。
只要SBK=1,附加的由10位或11位的逻辑0组成的中断字符就插进了数据流中。
根据设置和清除SBK的时间长短,第二个中断字符可能也被插进数据流中。
0―正常发送器操作。
1―将中断字符(10位或11位的0)插进正在发送的数据流中。
SCIxS1
TD
RE
发送数据寄存器空标志——复位,或者当数据从发送数据缓冲器转移到发送移位器时,TDRE自动置1,为了清除TDRE,对SCIS1进行读操作,然后写SCI数据寄存器(SCID)。
0―发送数据寄存器(缓存区)满。
1―发送数据寄存器(缓存区)空。
TC
发送完成标志—复位、或者当TDRE=1,且没有数据、前导符或中断字符正在被发送时,TC被置位。
0―发送器正在工作(发送数据、或中断)。
1―发送器空闲(发送操作结束)。
TC=1时,通过对SCIS1进行读操作,然后完成下列三件事情中的任何一件,可以自动清除TC:
1)写SCID,发送新数据;
2)通过将TE写0再写1,发送一个前导符;
3)通过向SCIC2的SBK写1,发送一个中断字符。
RDRF
接收数据寄存器满标志——当一个字符从接收移位器传输至接收数据寄存器(SCID)时,RDRF变为1状态。
RDRF=1时,为了清除RDRF,要读取SCIS1然后再读取SCI数据寄存器(SCID)。
IDLE
空闲线标志——在一个活动周期后,当SCI接收线在一个全字符周期内成为空闲状态时,IDLE被置位。
当ILT=0时,在起始位后,接收器开始对空闲位的周期个数(即出现了多少个空闲位)进行计数。
因此,如果接收字符都为1,这些位周期和停止位周期将一直被计数,直到接收到的个数满足了接收器所需的、可以确定这是一个空闲字符的条件。
这个条件是:
10位或是11位的“1”(是10位还是11位取决于M控制位)。
当ILT=1时,只有在停止位后,接收器才会启动空闲位周期计数。
因此,前一字符最后的停止位和任意逻辑高电平位不会被纳入计数范围。
要清除IDLE,在IDLE=1时,先读取SCIS1,再读取SCI数据寄存器(SCID)。
IDLE被清除后,只有在一个新字符被接收且RDRF被设置后,IDLE才可以被再次设置。
即使接收线在一个额外周期内保持空闲状态,IDLE也仅能被设置一次。
0―无空闲线检测。
1―空闲线被检测。
OR
接收丢包标志——当一个新的字符准备被转移至接收数据寄存器时,发现先前接收到的字符还没从SCID中读走,OR被置位。
此时新字符(即相关错误信息)将丢失。
先读取SCIS1,再读取数据寄存器(SCID)清除OR标志。
0――无丢包。
1――接收丢包(新SCI数据丢失)。
NF
噪声标志——接收器对起始位采样7次,而对其它数据位和停止位采样3次。
如果这些采样不是完全一致,则表示有噪声,RDRF被置位时,NF也被置位。
先读取SCIS1,再读取数据寄存器(SCID)清除该标志。
0――无噪声被检测到。
1――当前对应的SCID数据存在接受噪声,可能不可靠。
FE
帧错误标志——当接收器在停止位应该出现的地方检测到逻辑0时,认为数据帧没对齐,RDRF置位时会同时置位PE。
0――无帧错误被检测到,但这并不意味着没有帧错误。
1――有帧错误。
PF
奇偶校验错误标志——当奇偶校验使能(PE=1),但接收到的字符中的奇偶校验位与所期望的奇偶校验值不一致时,PF被置位。
0――无奇偶校验错误。
1――奇偶校验错误。
SCIxS2
LBKDIF
LINBreak检测中断标志—当LINbreak检测电路被允许并且检测到一个LINbreak字符时,LBKDIF被置1,对该位写1可清除。
0——没有检测到LINbreak字符;
1——检测到LINbreak字符。
RXEDGIF
RxD有效边沿检测中断标志—当接收管脚出现有效的边沿(RXINV=0时是下降沿,RXINV=1时则为上升沿)时RXEDGIF被置1,写1可清除该标志。
4RXINV
接收数据极性取反—该位置1将会导致接收的数据信息按位取反。
RWUID
接收空闲标志位控制—RWUID位控制接收空闲是否使IDLE位置位。
0——接收空闲状态下(RWU=1),即使检测到空闲字符,IDLE位也不置位;
1——接收空闲状态下(RWU=1),检测到空闲字符时会导致IDLE位置位。
BRK13
中断字符长度——BRK13用于选择更长的中断字符长度。
帧错误的检测并不受该位状态的影响。
0――中断字符为10位周期(如果M=1则为11位)
1――中断字符为13位周期(如果M=1则为14位)
LBKDE
LINBreak检测允许设置—LBKDE位用来选择更长的break字符长度.
0——定义Break字符长度为10bit(如果M=1则为11位).
1——定义Break字符长度为11bit(如果M=1则为12位).
RAF
接收器激活标志——当SCI接收器检测到一个有效起始位开始时,RAF被置位,并且,当接收器检测到一个空闲线时,RAF被自动清除。
在命令MCU为停止模式前,此状态标志可用于检查是否有一个SCI字符正在被接收。
0――SCI接收器空闲,等待一个起始位。
1――SCI接收器激活(RxD输入不空闲)。
SCIxC3
7
R8
接收器的第9个数据位——当SCI配置为9个数据位时(M=1),R8可被认为是第9个接收数据位。
应在读SCID之前读取R8值,因为读取SCID操作会启动标志清除过程,标志清除后可能有新数据写入R8和SCID。
6
T8
发送器的第9个数据位——当SCI配置为9个数据位时(M=1),T8作为第9个发送数据位,应在写SCID之前写T8(如果T8需要写入新值)。
5
TXDIR
单线模式下TxD管脚方向——当SCI被配置为单线半双工操作(LOOPS=RSRC=1)时,该位决定TxD管脚的数据方向。
0――单线模式下TxD管脚为输入;
1――单线模式下TxD管脚为输出。
4TXINV
发送数据倒置—设置此位使得被发送数据输出的极性反转。
3:
SCIS1中接收丢包、噪声、帧错误、奇偶校验出错中断允许设置。
0—中断禁止;
1—中断允许。
4、实用的串口通讯程序设计子程序
由于JM60单片机有两路SCI串口,实验电路板上用到了第一路,因此下面针对第一路进行设计,读者只要稍微改动就可以用到第二路。
1〉发送一个字符
2〉数字转换成对应的ASCII码
3〉发送可以在文本文件中显示成十六进制的数据
4〉发送字符串
5〉接收一个字符
5、与xp超级终端构建人机界面实验设计
假设编写程序,在硬件连接正常的情况下,开机运行时超级终端显示菜单
用户在超级终端激活状态下,敲击键盘数字1将使得D1的亮灭状态转换一次,敲击键盘数字2将使得D2的亮灭状态转换一次,敲击键盘数字3将使得D1和D2的亮灭状态同时转换一次。
1〉硬件连接如下图
2〉建立软件工程
新建工程“超级终端”
点完成后出现集成开发环境,点击编译(make)按钮一次。
然后选择新建文本文件,将“实用的串口通讯程序设计子程序”中的所有子程序全部拷贝到新建的文本文件中,点击保存菜单,选择Sources目录,文件命名为sci.h。
回到集成开发环境,鼠标右击Includes目录选择AddFiles…,将刚才新建的文本文件加入到工程中。
回到main.c文件中,修改主文件直到如下模样。
3〉配置超级终端
下面描述主要针对xp系统,如果不是,请自行安装相应的串口调试软件。
按照程序/附件/通讯/超级终端打开超级终端设置窗口,给这个连接命名“JM60SCI_9600”,这个根据个人随便命名,建议带上9600波特率。
“确定”后根据实际硬件选择串口号,在后面的端口设置里选择9600的波特率,数据位为8,无奇偶校验,停