这是一周来学习HC08单片机时的一点心得体会,也是一个小结。HC(S)08单片机学习心得: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<
0
投票