我要加入 登录
声振论坛 返回首页

freebrother的个人空间 http://home.vibunion.com/?73814 [收藏] [复制] [分享] [RSS]

日志

freescale学习心得(ZZ)

已有 1006 次阅读2007-11-27 16:07

转自:http://www.myhcs08.com/blog/info/article_detail.aspx?id=150

MC9S08QG8和MC9S08AW60,以及和其他单片机之间的横向对比

看惯了AVR/PIC/51的手册,刚开始看HC08

的数据手册感觉不太习惯,很多地方的风格都不太一样,有个适应过程。不过只从单片机硬件结构来看,基本组成和功能都是类似的,只是个别地方有自己的独特之处。

HC08单片机硬件上和其他单片机是类似的,都分为ADC、定时器、IO、串行通信(包括串口、SPI、I2C等)、中断等几大部分,都是通过寄存器来启动、设置、关闭相应的功能模块。只是HC08单片机分得很细,寄存器非常的多,如果只看数据手册,一下可能会感到头晕的。最好是先看模块的主要介绍,再看每个模块详细的,不要想一次全部看完。很多时候都是先看大概的,具体应用时知道哪里找就行了。

软件开发基本都是使用FreeScale自己的CodeWarrior,它有特别版、标准版、完全版等几种版本。特别版的个别功能有限制(主要是PE)和代码大小有限制,而标准版则没有代码大小限制。特别版对于HC08单片机代码限制是32K,一般情况下都是足够了。

开始使用时,使用Code Warrior的PE(Processor Expert)专家,基本就是用鼠标点几下,就可以生成程序代码和框架,比较简单快速。不过这样生成的程序比较大,文件数比较多(基本一个功能模块产生2个文件,1个C文件和一个H文件),子程序调用比较多。好处是容易上手,可以很快熟悉开发流程。但是使用多了,会觉得如果PE操作再简单一些,不要过多的参数选择,会更适合于对单片机初学的人;如果功能再强一些,可以完全不用写代码,象PSoc express那样图形方式编程就更好了,适合于不了解单片机的人。

除了PE外,还有一个很有用的功能是DI(Device Initialization)设备初始化,用图形方式设置好参数后自动产生初始化的代码,但是不产生程序框架文件。这样产生的代码比PE小一些,文件结构也很紧凑。

PE和DI产生的代码,都有非常详细的注释,几乎每行自动生成的代码都有相应的注释,每个文件头有单独的说明,每个函数也有详细的说明。PE更在文件头中把引用到的寄存器名称列出来,甚至不用查看DataSheet了(如果注释能够把寄存器的每位功能也列出来的话)。

CodeWarrior的功能很强,使用几天后发现它还可以识别用户自己定义的变量和函数,按下Ctrl键后鼠标双击,可以自动跳转到变量或函数的定义。写代码时,自动将变量和函数名高亮显示,都可以体现出专业编译器厂家的风格和强大功能。

CodeWarrior覆盖了很长的产品线,它们使用相同的IDE和编程习惯,这对于程序员非常方便,从一种IC换到另外一种时会很快,无需重新学习。特别是现在FreeScale新的Flexis系列处理器,硬件上也实现了外设的兼容,会更加方便。CodeWarrior应当说是专业编译器厂家中非常成功的例子,其他的专业编译器厂家中,IAR也是一个很好的选择,覆盖了众多的产品线。IAR和很多硬件厂家合作,编译器做得很专业,代码效率很高。另外一个有着很多平台版本的编译器厂家HiTech则显得比较弱势,只有PICC一款编译器获得了真正的成功,其他的都不太为人所知(从官方论坛的每个分论坛帖子数量也可以看出)。我曾经用过PICC18编译器(公司购买的正版),出现过在不同型号的单片机的头文件中,同一个寄存器名称不同(有一处是明显的笔误,少了一个字母),还有的宏在有些头文件中定义过,再另外的头文件中又没有定义。我曾经发EMAIL提过建议,但是没有得到任何回应,后来在升级版中,发现问题依旧。严格说HiTech的编译器不差,但是一些细节处理不好,极大的影响了它的使用。在单片机容量不断增加的情况下,对编译器的效率要求已经不如以前那么高,单一产品的编译器感觉没有什么优势了,很难长久这样维持,很多厂家早已消失。51上最成功的Keil,如今也转向了ARM。

和AVR和PIC单片机不同,HC08单片机存储器的RAM和Flash是统一编址的,还分为几段,不同容量的单片机分配的地址空间也是不同的,但是一般都是主Flash空间倒着往前分配,RAM从前往后分配的。这一点和51单片机倒有些类似。

HC08的中断和大部分单片机不同,它的中断向量是放在存储器的最后的,然后倒着往前排,每个中断向量占用2字节(空间超过64k的应该会占用3字节,不过现在我还不知道有没有这样的型号),地址越靠后的中断优先级越高。

使用Bootloader时,一般Bootloader放在了Flash存储器的最后,占用了中断向量的空间,需要对中断向量重定位。这里的重定位和AVR单片机的不同,AVR的是硬件重定位,它的中断向量在最前面,和bootloader空间是分离的。重定位可以使得bootloader程序使用中断。HC08的中断重定位和PIC18的类似,属于软件重定位,实际上就是把原中断向量指向新的位置。发生中断时,还是会先跳转到旧的中断向量,然后再跳转到新的中断向量,最后才是执行中断服务程序。


HC08的寄存器:和其他单片机类似,基本上每种功能的寄存器从寄存器名称的前缀可以区分出来,如:
P 代表IO寄存器(Port)
T 定时器寄存器(Timer)
A ADC寄存器(ADC)
I 时钟寄存器(可惜不是C)
等。

有些寄存器在复位后只能写一次(Write-once),主要是一些关键的寄存器,用于设置时钟、CPU的关键参数的,这样的好处是在运行时抗干扰能力比较好,不怕受到外面信号的干扰。这个特点在其他单片机上很少看到。

对于有些有多个的外部功能模块(如IO、定时器、ADC等),寄存器以数字方式表示来区分(如ADC1CS1、TPM1SC1)。这样的好处是如果换用新的型号CPU有更多的外设时,或者使用相同功能不同序号的外设时,只要修改寄存器标号,程序的修改工作量比较小。不过,如果能够像现在的AVR-GCC那样,对于只有一个功能模块的单片机也使用序号区分寄存器名就更好了。比如以前AVR-GCC对于只有一个串口的单片机使用UDR表示串口缓冲区,现在改为UDR0了,和多串口的单片机统一,使得寄存器命名更加清晰了。这样还有一个很大的好处是对于喜欢使用宏写程序的程序员会觉得非常方便。

和其他单片机一样,HC08支持将两个连续的8位寄存器组合成一个16位的寄存器,可以单独访问每个8位寄存器或直接访问16位寄存器。如ADC的寄存器ADCR,可以分为ADCRH和ADCRL。


IO
这是单片机最基本的功能了。现在主流的单片机IO一般都是真双向IO口,可以作为输入或输出,可以选择是否使用内部上拉或下拉电阻,某些特定的IO口还支持开漏输出、ADC输入、比较器输入、比较器输出、PWM输出、时钟输入等功能。
因为是双向IO口,所以一般至少有3个寄存器来控制一个IO口(方向、数据、上拉,有的单片机输入和输出寄存器也不同)。此外还有斜率抑制和大电流输出控制寄存器,这是HC08特有的。

端口使用字母A-Z区分不同端口(当然实际到不了字母Z的,一般的最大到G),每个端口内部用0-7代表不同的位(一些端口没有完整的8位)。端口比较复杂的地方在于很多功能是复用的,就是一个端口在设置不同寄存器参数后,可以得到不同的功能。有的功能在复位后是关闭的,使用时需要主动打开,这一点基本上所有的单片机都一样。

IO的主要寄存器(下面的字母x代表A-Z,n代表0-7,后面也是一样)
PTxD 端口数据
PTxDD 端口方向(读/写)
PTxPE 内部上拉电阻使能
PTxSE 输出斜率抑制(减少EMC)
PTxDS 大电流输出
PTxD_PTxDn 一个端口的某一位,位变量或位寻址

在CodeWarrior中,支持IO端口的直接操作,比如定义一个端口变量,然后直接赋值,和PIC和51中一样。如果使用习惯了AVR-GCC,也可以继续使用AVR-GCC的风格(这可以使程序有很好的移植特性),通过(1<<n)来修改端口的状态。


ADC
和其它单片机一样,需要设置ADC时钟源、时钟频率、分频比、通道、中断、工作模式(连续转换/单次转换)。HC08与其他单片机不同的是还有一个自动采样结果比较功能,当ADC采样的值大于或小于一个预设定的门限时才产生中断。这在连续采样时可以自动滤掉无效数据。HC08的ADC有一个长时间采样模式,对于采样信号输出是高阻抗时比较有用处,可以省掉一个跟随器。

ADC采样可以使用查询模式或中断模式(串口、定时器、SPI等也是一样),和其他单片机一样,没有很特别的地方。

关闭ADC模块是将通道选择设置为全1,这一点和大部分单片机不同(一般是专门一个寄存器位控制)。此外内部有一个通道(通常是通道26)接到温度传感器,可以测量温度。不过温度系数m实在太小(不同型号的参数还不同),还需要分段进行复杂的浮点数除法,10位AD很难准确测量,误差会较大,使用不方便(温度传感器估计是二极管)。感觉最好的办法是查表,避免复杂的浮点运算,这个和ATmega168P类似(内部温度传感器1mv/C),当个温度开关还可以。

QG8相关寄存器:
ADCSC1 ADC通道选择和状态,写入这个寄存器选择通道后就会启动ADC转换
ADCSC2 设置自动比较,一般不用
ADCR ADC结果(可以分别访问ADCRH和ADCRL。高位只有两位,不能选择左对齐,但是可以选择8位模式)
ADCCV 结果比较寄存器,和上面类似,也是两个8位寄存器组成
ADCCFG 设置ADC时钟、低功耗方式、长时间采样等
APCTL1/APCTL2/ACPTL3 禁止IO功能

AW60相关寄存器:
ADC1SC1
ADC1SC2
ADC1R
ADC1CV
ADC1CFG
APCTL1/APCTL2/ACPTL3 注意这几个寄存器名称没有变化
(从这里可以看出,如果将QG8的寄存器名中增加数字1,就可以和AW60的统一了,这样会更方便一些的。)


定时器
和AVR/PIC18的定时器类似。除了可以做常规的定时器功能外,还可以做捕捉、PWM等。

PWM
PWM的输出可以映射到IO上,直接驱动LED或者做为其他器件的驱动信号,也可以做为DA(当然还需要滤波)。当一个TPM有多个PWM通道时,所有通道的PWM频率是相同的,但是可以单独设置每个通道的占空比和工作模式。HC08的PWM有一个中间对齐模式,这样在占空比不变的情况下,降低一半输出频率。

QG8相关寄存器:
TPMSC 时钟和中断选择
TPMMOD 定时器计数,决定PWM或定时器的周期
TPMCNT TPM计数
TPMCxSC 通道模式选择
TPMCxV 通道计数,决定PWN占空比

AW60相关寄存器:
TPMxSC
TPMxMOD
TPMxCNT
TPMxCnSC
TPMxCnV


时钟
分为CPU时钟、总线时钟等。HC08的时钟寄存器非常多,不太容易看明白,需要慢慢仔细琢磨。FreeScale还专门有一篇应用笔记介绍HC08的时钟,可以好好看看。

HC08的时钟通过寄存器来配置工作模式,而不像AVR、PIC那样主要是直接写入熔丝位来选择,寄存器只是微调或分频。在HC08的某些时钟寄存器中,需要注意到有些位属于write-once,就是每次复位后只能写入一次,或者说只有第一次写入的结果是有效的。

相关寄存器
ICGC1 设置时钟频率、模式等
ICGC2 FLL和RFD控制
ICGS1 时钟状态寄存器1
ICGS2 时钟状态寄存器2
ICGFLTU
ICGFLTL
ICGTRM 微调调内部时钟频率,用于校正内部时钟频率

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 我要加入

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-25 04:58 , Processed in 0.035932 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部