中颖的文档写的感觉不是太清楚,以下是我个人整理的一些比较坑的地方。 一、烧录 烧录必须得买他家的,一般的jtag不能用,一个三百多块钱呢。其次烧录要么用keil4要么用Prowrite这个官方自带的烧录软件。keil4主要是仿真调试用,官方软件用于生产比较方便。 二、代码选项 这个是在烧录的时候一定要注意的问题。 第一,中颖的时钟选择并不是通过某个寄存器选择的,而是要通过代码选项OP_OSC这个来选,如果不选择等你把程序烧进去之后会发现你的外部晶振甚至没有起振(当时给我搞懵了)。 第二,中颖默认代码选项中开门狗是开的,OP_WDT一定要选择关闭。
三、bank0和bank1 从数据手册或者f3283的头文件里能看到,一些寄存器背后有备注在“bank1”,一定要注意,如果要对这些寄存器进行设置,一定要像以下配置。
这点真的是坑死我了,如果不切换的话一些寄存器的地址是重叠的,到赋值的时候就会出现莫名其妙的错误。包括P5的所有脚都是在bank1的,配置的时候一定要留意。 四、时钟 手册上并没写的太清楚外部晶振究竟能搞到一个什么范围,一会儿说12M一会儿又16M,最后我打了个电话咨询他们工程师才说外部最多12M,内部可以达到16M。 一般51都是一个机器周期=12个震荡周期,这款是1:1,不过需要注意的一点是CLKCON这个寄存器默认将时钟12分频。 使用的时候一定要记得给它设置成不分频,不然速度太慢了
五、ADC采样和串口中断 当你配置完ADC打开中断和总中断之后,一定要等待至少10us的时间再写下:ADCON|=0X01; 否则ADC模块会出现问题。 串口中断的RI和TI任意一个为1时,都不能触发串口中断。 我用了个芯片将232转485了,每次发送完成后一定要把TI这个标志清零再接收,不然根本收不到数据。 六、RAM 不得不说这个RAM实在是太小了,内部就256字节,外部撑死1k,我用的时候真的要很小心,生怕ram满了导致中断保持现场对的时候不正常。 因为自己用51比较少,所以对于keilc51的关键字不太熟悉,以下的解释各位懂行就忽略,算是我自己的理解和笔记吧。
根据数据手册,内部RAM一共有256个字节,其中低位128直接访问就行了。 啥叫直接访问呢,就是你定义一个"int a=0;"这就是直接访问了。 高位128字节的,从地址上看是和SFR相同的,SFR对应的就是我们的各个寄存器。为了区别这两个不同的区域(本身物理上也是分开的)只要你加一个关键字“idata”就可以保证定义的变量是在内部ram里。 比如"idata int a=0;"这就保证它一定在内部ram里面,至于是在00H-FFH的哪个位置,可以通过.M51文件查看。但是你不加这个idata关键字,变量就只储存在内部ram的00H-7FH里了。 接下来是外部ram,这里的文字描述就给我看的有些迷糊了。
说这这么一大堆,到底是啥意思呢。他的意思是说,咱们外部RAM支持传统的用汇编指令访问外部ram,也支持用XPAGE寄存器访问外部RAM,我是没弄明白这个XPAGE寄存器怎么用,因为它写的比较模糊,而且我对51真的不怎么了解。 最后我发现: 实际上你只要加一个关键字"xdata"就可以直接把变量定义在外部ram了,例如"xdata int i=0;" 就这么简单,真的。 至于你想验证我定义完之后是不是能正常给这个变量赋值,很简单,你插上这个东西的仿真器,跑一个最简单的i++;语句,看看在watch窗口这个i有没有增加就是了。 另外关于外部ram的访问,我也查到了一些别的资料。在自带的ABSACC.H文件中有这么一个关键字XBATE,可以实现定位储存。具体的用法呢我就贴个网址,大家看看。 https://blog.csdn.net/shenhuxi_yu/article/details/54344362
|