前一阵说要写的,最近这几天不是很忙。抽时间写了一下。最近在整ARM7,过一阵再写个LPC23XX系列的开发笔记。
首先说一下 Microchip的datasheet的问题,各个寄存器都没给出复位后的值。这是一个让人很难受的事情。
关于硬件设计:
PIC的硬件设计很简单,其实比51还简单。可以选择内部或外部的晶振。管脚分配比较自由,所有的外设功能都能随意分配到RPn上。烧写电路是必须的,烧写电路有5个管脚和ICD相连。分别是MCLR、VDD、GND、PGDx、PGCx.
其中PGDx和PGCx可以选择任意一个组合,只要x值相同即可。
关于振荡器:
有4个振荡源:主振荡器、FRC振荡器、LPRC振荡器、辅助振荡器。
最常用的是主振荡器和FRC振荡器。主振荡器为外接的晶振、如果对振荡精度要求不高的话则使用内部振荡器(FRC振荡器)。
举一个内部振荡器的例子。FRC振荡器的输出为8MHz。然后经过一个可设置的后分频器,一个可选择的4×PLL,最后到达CPU。
值得一提的是,PIC的一个指令周期是两个CPU时钟输入周期。定时器在分频器前端的频率也是同样。
关于配置字:
配置字命令属于伪指令,在C语言中,需写在main函数开始之外。PIC24FJXX有两个配置字:配置字1和配置字2。他们的复位值为0xFFFF。配置字1可以配置JTAG、看门狗、仿真器(注意不是编程器)引脚选择等功能。配置字2主要配置的是时钟源和PLL倍频。
下面给出一个我使用的配置命令
_CONFIG1(WDTPS_PS512 & JTAGEN_OFF & GCP_ON & GWRP_ON); //内部看门狗设置&关闭JTAG
_CONFIG2(FNOSC_FRCPLL); //FRC_PLL*4
初次使用PIC不建议使用内部看门狗,不熟悉时莫名其妙的复位会使人很抓狂。
可以使用下面的配置命令
_CONFIG1(FWDTEN_OFF & JTAGEN_OFF & GCP_ON & GWRP_ON)
_CONFIG2(FNOSC_FRCPLL); //FRC_PLL*4
关于IO口:
在使用IO口之前,需要将相应的管脚配置为数字模式。因为带有ANX的管脚默认的功能选择都是AD转换。这一点跟大多数处理器外设功能选择都不一样。很多刚接触PIC的人都会遇到这个问题。在datasheet中,在AD转换章节的某一个角落才介绍了这个几乎每个人都会遇到的问题,真不明白编写手册的人是怎么想的。
关于IO的寄存器有以下:
TRISx是输入输出选择寄存器。0为输出、1为输入。很好记,0很像O,Output;1很像I,Input。
PORTx是引脚寄存器。
LATx是锁存器寄存器。
ODCx是数字开漏选择寄存器。0代表正常的数字输出;1代表OD门输出。
很多人搞不懂PORTx和LATx的区别,其实不用搞懂。只要记住下面一句话就好。采集的时候读PROTx寄存器,输出的时候写LATx寄存器。不然的话在高速的IO时,会出现一些奇怪的错误。
IO口功能配置:PIC的管脚外设功能配置很不一样。输入和输出功能配置截然不同。输入的配置是将输入映射到功能,即在固定功能的寄存器写入管脚的编号。与输入相反,输出是在固定管脚的寄存器写入功能的编号。
关于中断:
PIC的中断并没有太麻烦的地方。先将关于中断的寄存器进行配置使能之类的。然后遇到中断的条件,程序就会跑进去了。
在MPLAB C30环境中,中断的向量名是已经被定义好的。可以在相关的文档中查询(MPLAB C30 C编译器用户指南)。
举个例子:void _ISR _T2Interrupt();就是timer2的中断函数声明。