东游记白牡丹活了吗:初识C8051F500

来源:百度文库 编辑:偶看新闻 时间:2024/05/09 07:26:01

初识C8051F500

(2010-08-20 14:29:13)转载 标签:

c8051f500

杂谈

分类: C8051F系列

C8051F系列单片机有很多共通点,但是每一个具体的单片机又有其不同的地方。具体到 F500这个芯片,首先他的下载方式是C2,而前面接触到的 F020 和 F120 都是JTAG 下载方式。 在 F500 的 C2接口方式中,C2K和 RST是共用一个引脚的。在我这次的硬件设计中,本想着综合 C2 的 C2K 引脚功能和复位的 RST功能,在该引脚上配置一个上拉电阻和一个去耦电容,电容用的10uF钽电容。但是按照这种硬件方式在使用新华龙官方的软件时,芯片不能被识别。于是只能去掉RST的功能,把去耦电容给卸掉,这时候硬件板子才能被识别。 在C8051F500 的编程过程中,发现了很多不同的地方: 第一,F500的头文件不再是 C8051F500.H,而是换成了两个 compiler_defs.h 和C8051F500_defs.h   。其中,C8051F500_defs.h  是对 F500 的寄存器进行定义的一个头文件,而compiler_defs.h 则是对编译环境定义的一个头文件。里面的内容很复杂,首先有一个关于共用
体的定义:union。以下参考百度:

【共用体声明和共用体变量定义 共用体声明和共用体变量定义 共用体声明和共用体变量定义 共用体声明和共用体变量定义
  共用体(参考“共用体”百科词条)是一种特殊形式的变量,使用关键字 union 来定义 
 共用体声明和共用体变量定义与结构体十分相似。其形式为: 
   union 共用体名{ 
  数据类型 成员名; 
  数据类型 成员名; 
   ... 
  变量名; 
共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在 union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。   其次用到“#pragma”,参考百度知道: 在所有的预处理指令中,#Pragma指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作(废话)。其格式一般为: #Pragma Para,其中 Para 为参数,常用的参数有:(1)message  参数 参数 参数参数;其使用方法为:#Pragma message(“消息文本”)当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。(2)另一个使用得比较多的 pragma 参数是code_seg。格式如:#pragma code_seg( [\section-name\[,\section-class\] ]) 。它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。(3)#pragma once(比较常用)。只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在 VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。(4)#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。。。。后面还有很多,具体到应用的时候再查阅。但是在 F500 的 complier.H 中,用到的参数是PATHINCLUDE, ,,,这个参数在百度并没有查到 这个参数在百度并没有查到 这个参数在百度并没有查到 这个参数在百度并没有查到】还有一个关键词#elif,这个词也没有查到更多的详细资料。有待以后考证。
 
总结:complier.H文件中,主要是对一些编译的相关东西进行定义,另外还定义了一个函数
语句:# define SBIT(name, addr, bit) __sbit __at(addr+bit)             name
例如:sbit LED =P1.0,直接用这个即为 SBIT(LED, P1, 0),另外,对SFR的定义也不再像
F120 之类的定义:  SFR ADC0 =0xBE;在这里而是直接采用# defineSFR(name, addr) 
如 SFR(ADC0,0xBE)。
 

今天继续调试C8051F500 的 IO口,在调试过程中,主要解决的问题有两个:一,关于PORT的初始化;二,关于时钟的初始化。在 PORT 的初始化中,基本上与 F120大同小异,但是有以下不同之处:
1, 由于C8051F500 的所有 IO口都可以设置成 ADC 的输入端口,所以 F500的IO口初始化时候多了一个PnMDIN来设置输入状态为模拟输入或者数字输入。
2, F500 多了一个 PnSKIP来设置交叉开关。具体怎么设置我不太清楚,但大概意思是必须要和 XBR0,XBR1,XBR2共同来配置交叉开关。而在F120和 F020里面则只需要由XBR0~2来配置交叉开关即可。(此处可能理解有误,但是实际初始化过程中确实如此。)
3, 所有的 IO口复位初始状态默认为数字输入,而输入模式PnMDIN 设置为模拟输入状态需要配置为 PnMDIN&=0x00;故PnMDIN初始状态为高电平。 在 F500的页配置里面,与F120不同的是F500一共只有三个页,常用的有0x00和0x0F,0x0C 则是作为CAN 总线的专用配置页。


 第二个部分:关于时钟的初始化。
在F500的时钟初始化的时候,它的内部时钟的配置功能非常强大,有内部时钟的倍频或者分频,还有内部时钟的高速模式或者低速模式,如果内部时钟设置在高速模式,要求VDD电压要为2.0V以上。在我的硬件设计上,VDD 全部为 3.3V。 在 F500 的外部时钟设置时,软件设置与 F120基本相同,包括寄存器的名字等,但是在硬
件设计上则有区别:F500 在晶振硬件设计上时,需要并联一个 10M 的电阻。

 

【备注:这个电阻是反馈电阻,是为了保证反相器输入端的工作点在VDD/2,这样震荡信号反馈到输入端时,能保证反相器工作在合适的工作区。如果去掉电阻,振荡电路虽然有时候仍能继续工作,但是从示波器看到的波形肯定不一样了。而且有可能因为工作点不合适而停震。】

 

按照以上参考信息,我开始没有并联电阻的时候,F500 并不能工作,并入一个 20K的电阻之后,才开始起振。如果以后找到一个1M或者 10M的电阻,再把这个20K的电阻替换掉,观察波形以示对比。