先说说系统时钟设置
系统时钟的获取如下所示:
基础时钟源-------->[PLL锁相环倍频(400M/2)]-------->系统分频-------->系统时钟
其中PLL倍频部分是可选的。
在设置系统时钟的时候我们必需指定四个参数:
1)系统的基础时钟源(外部晶振还是内部振荡器);
2)外部晶振的频率是多少;
3)系统时钟源(是否使用锁相环);
4)系统分频系数;
LM3S8962的基础时钟源可以是外部主振荡器,12M内部振荡器,12M内部振荡器/4,30K内部振荡器。
支持的主振荡器频率值参考8962的数据手册,板子上用的是8MHZ的。
内部振荡器频率为12MHZ,但是有30%的误差。
如果既要使用内部振荡器又要使用锁相环,那么必须使用内部振荡器/4作为时钟源。
内部30K时钟源主要用于睡眠模式。
基础时钟源的参数可以是:
SYSCTL_OSC_MAIN 使用主振荡器
SYSCTL_OSC_INT 使用12M内部振荡器
SYSCTL_OSC_INT4 使用12M内部振荡器/4
SYSCTL_OSC_INT30 使用30K内部振荡器
(注:中文版数据手册在寄存器描述部分没有对时钟源的描述有误,见下图)
中文版
英文原版
使用外部振荡器时需要指定主振荡器频率,这样PLL倍频的时候才能提供比较准确的400M时钟。
外部振荡器频率的参数为如下格式:SYSCTL_XTAL_**MHZ,**为晶振的频率值(详细信息可以看sysctl.h文件)。
系统时钟源的参数可以是:
SYSCTL_USE_OSC:直接使用振荡器
SYSCTL_USE_PLL:使用锁相环倍频
如果使用锁相环,外部振荡器频率必须是3.5795M到8.192M之间,内部振荡器必须是12M内部振荡器/4。
PLL输出的频率是200M。
系统分频系数的参数为如下格式:SYSCTL_SYSDIV_**,**为分频系数,可以是1-64。需要注意的是在使用PLL的情况下分频系数必须是4以上。
我们通过SysCtlClockSet(unsigned long ulConfig)来实现系统时钟的设置。ulConfig以上四个参数进行逻辑或运算组成的。举几个例子
如果我们想用外部8MHZ振荡器做系统时钟,可以写
SysCtlClockSet(SYSCTL_OSC_MAIN|SYSCTL_XTAL_8MHZ|SYSCTL_USE_OSC|SYSCTL_SYSDIV_1);
如果想用25M的时钟,那么可以写
SysCtlClockSet(SYSCTL_OSC_MAIN|SYSCTL_XTAL_8MHZ|SYSCTL_USE_PLL|SYSCTL_SYSDIV_8);
可以通过SysCtlClockGet()函数来获取系统当前时钟频率。
下面说说Oled的使用
板上有一个宽x高=128x96的oled屏,每个点有4bit的灰度,也就是16阶灰度。处理器通过SSI总线控制Oled。
在StellarisWare\boards\el-lm3s8962\drivers里有rit128x96x4.h和rit128x96x4.c两个文件,这就是Oled的驱动了。它为我们提供了如下API。
void RIT128x96x4Clear(void);//清屏
void RIT128x96x4StringDraw(const char *pcStr,unsigned long ulX,unsigned long ulY,unsigned char ucLevel);//显示写字符串
void RIT128x96x4ImageDraw(const unsigned char *pucImage,unsigned long ulX,unsigned long ulY,unsigned long ulWidth,unsigned long ulHeight);//显示图像
void RIT128x96x4Init(unsigned long ulFrequency);//初始化Oled,参数为SSI总线的时钟频率
void RIT128x96x4Enable(unsigned long ulFrequency);//使能连接Oled的SSI总线
void RIT128x96x4Disable(void);//禁能SSI总线
void RIT128x96x4DisplayOn(void);//显示开
void RIT128x96x4DisplayOff(void);//显示关
在使用时先调用RIT128x96x4Init(unsigned long ulFrequency)来初始化Oled,Frequency一般设为1M。
之后就可以调用其它函数了,最常用的就是RIT128x96x4StringDraw(const char *pcStr,unsigned long ulX,unsigned long ulY,unsigned char ucLevel)。它的四个参数分别是要显示的字符串指针,X坐标,Y坐标,灰度(0-15)。
下面这个程序简单演示了系统时钟设置和Oled使用。