原创 LM3s1138学习手记(3)

2009-9-25 13:32 3214 10 13 分类: MCU/ 嵌入式

今天已经是学习LM3s1138的第三天了,通过前面两天的学习大概了解了这个M3处理器的一些寄存器信息。今天努力把剩下的两个头文件搞定。


首先是sysctl.h头文件:


点击看大图


看头文件的名字就知道是系统管理的头文件。这里宏定义了一大堆的系统控制寄存器的地址,这与前面的类似,不在多说。我们先把这些地址放到一边,因为地址是不会变的。我们关心的是它下面的API原型驱动函数的用法。比较多,我们选择一部分进行分析。


d420d1ef-7a0b-46ab-a453-7445e6b1b85b.jpg


系统控制总体上包含了:LDO控制、时钟控制、复位控制、外设控制、睡眠与深度睡眠、杂项功能、中断操作、时钟验证。一般我们只用前面6个,后面两个用的不多。废话不多说了。


第一个:LDO控制。百度上面是这么描述的:


LDO是“Low Drop-Out”的缩写,是一种线性直流电源稳压器。LDO的显著特点是输入与输出之间的低压差,能达到数百毫伏,而传统线性稳压器(如7805)一般在1.5V以上。例如,Exar(原Sipex)公司的LDO芯片SP6205,当额定的输出为3.3V/500mA时,典型压差仅为0.3V,因此输入电压只要不低于3.6V就能满足要求,而效率可高达90%。这种低压差特性可以带来降低功耗、缩小体积等好处。


芯片的datasheet上面是这么描述的:


Stellaris系列ARM集成有一个内部的LDO稳压器,为处理器内核及片内外设提供稳定的电源。这样,只需要为整颗芯片提供单一的3.3V电源就能够使其正常工作,简化了系统电源设计并节省成本。LDO输出电压默认值是2.50V,通过软件可以在2.25~2.75V之间调节,步进50mV。降低LDO输出电压可以节省功耗。LDO管脚除了给处理器内核供电以外,还可以为芯片以外的电路供电,但是要注意控制电流大小和电压波动,以免干扰处理器内核的正常运行。
片内LDO输入电压是芯片电源VDD(范围3.0~3.6V),LDO输出到一个名为“LDO”的管脚。对于Fury和DustDevil家族(LM3S1000以上型号),LDO管脚要连接到内核电源VDD25管脚上,对于Sandstorm家族(LM3S1000以下型号)VDD25管脚是内置的,因此不必从外部连接。
注意:在LDO管脚和GND之间必须接一个1~3.3μF的瓷片电容。
注意:在启用片内锁相环PLL之前,必须要将LDO电压设置在2.75V


到这里,我们对LDO的功能有了大致的了解。但是具体输出LDO电压是哪个函数设置?怎么设置?LDO对应的寄存器地址是多少?带着这些问题我们再看看上面列出来的函数吧。直接看函数名肯定就是这三个了:


extern void SysCtlLDOSet(unsigned long ulVoltage);
extern unsigned long SysCtlLDOGet(void);
extern void SysCtlLDOConfigSet(unsigned long ulConfig);


第一个是设置LDO的输出电压,来看看具体的原函数:


void
SysCtlLDOSet(unsigned long ulVoltage)
{
    //
    // Check the arguments.
    //
    ASSERT((ulVoltage == SYSCTL_LDO_2_25V) ||
           (ulVoltage == SYSCTL_LDO_2_30V) ||
           (ulVoltage == SYSCTL_LDO_2_35V) ||
           (ulVoltage == SYSCTL_LDO_2_40V) ||
           (ulVoltage == SYSCTL_LDO_2_45V) ||
           (ulVoltage == SYSCTL_LDO_2_50V) ||
           (ulVoltage == SYSCTL_LDO_2_55V) ||
           (ulVoltage == SYSCTL_LDO_2_60V) ||
           (ulVoltage == SYSCTL_LDO_2_65V) ||
           (ulVoltage == SYSCTL_LDO_2_70V) ||
           (ulVoltage == SYSCTL_LDO_2_75V));


    //
    // Set the LDO voltage to the requested value.
    //
    HWREG(SYSCTL_LDOPCTL) = ulVoltage;
}


现在很好理解了,只要设置好ulVoltage的值就可以输出允许输出范围内的电压值了。这个函数表面上看起来不难理解,但是具体ASSERT()代表什么意思呢?


没关系,百度一下。搜到一篇这样的文章:


void  CRoundButton::DrawItem(LPDRAWITEMSTRUCT  lpDrawItemStruct)  
aix {  
           ASSERT(lpDrawItemStruct!=NULL);  
                 .  
                 .  
                 .  
}  
 
程序用这个函数是啥意思?起什么作用?  
---------------------------------------------------------------  
 
ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE  (0),  程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。  
 
ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。  
---------------------------------------------------------------  
 
ASSERT宏定义如下  
 
#define  ASSERT(f)  \  
do  \  
{  \  
       if  (!(f)  &&  AfxAssertFailedLine(THIS_FILE,  __LINE__))  \  
               AfxDebugBreak();  \  
}  while  (0)  \  
 
ASSERT(逻辑表达式)  
 
如果括号中的逻辑表达式值为假的话,会弹出调试命令窗口,提示具体在哪个文件的哪一行发生了断言错误!  
---------------------------------------------------------------  
 
ASSERT  
Evaluates  an  expression,  and  displays  a  diagnostic  message  if  the  expression  is  FALSE.  Ignored  in  retail  builds.  
 
Syntax  
 
ASSERT(  
       cond  
);  
 
Parameters  
 
cond  
 
Expression  to  evaluate.  
 
Remarks  
 
In  debug  builds,  if  the  expression  is  FALSE,  this  macro  displays  a  message  box  with  the  text  of  the  expression,  the  name  of  the  source  file,  and  the  line  number.  The  user  can  ignore  the  assertion,  enter  the  debugger,  or  quit  the  application.  
 
Example  
 
ASSERT(rtStartTime  <=  rtEndTime);  
 
 
---------------------------------------------------------------  
 
断言(ASSERT)的使用,方法很简单。为什么要用,初学者可能比较迷惑。  
契约式编程讲的比较清楚,建议可以先看看这类书。  
一个函数由前置条件、后置条件和不变式组成。在VC中,我们可以通过断言来保证这三个条件。可以大大提高了软件的质量。  
---------------------------------------------------------------  
 
如果ASSERT()中的条件不成立(比如  ASSERT(0)  ;    ),会弹出一个比较吓人的对话框。  
 
点击重试,可以到达  ASSERT  断言不成立的那一行,  
 
此时可以在watch窗口查看变量值,找出出错的原因。  
 
如果程序能够继续运行,可以按F5继续调试


 


这位兄台说的很明白了,就是当ASSERT的()里面为1是,就执行下面的程序,为0是终止程序。好,我们再看看这个SYSCTL_LDO_2_25V    是不是就代表了输出电压是2.25V,链接它的定义出处,果然如此。它实际上是一个寄存器的的值:#define SYSCTL_LDO_2_25V        0x00000005  // LDO output of 2.25V 


好了,这个sysclt.h头文件里面还有很多的宏和外部API原函数。这里就不一一例举了,我们旨在走通这个基本的函数框架,以后遇到问题在来深究。


接着看下面的jpio.h头文件:


同理,有了对上面各个头文件的理解过程,在这里就不在一一的说明,这是大概的理解就行了。I/O(Input/Output)接口是一颗微控制器必须具备的最基本外设功能。在Stellaris系列ARM里,所有I/O都是通用的,称为GPIO(General Purpose Input/Output)。GPIO模块由3~8个物理GPIO块组成,一块对应一个GPIO端口(PA、PB、PC、PD、PE、PF、PG、PH)。每个GPIO端口包含8个管脚,如PA端口是PA0~PA7。GPIO模块遵循FiRM(Foundation IP for Real-Time Microcontrollers)规范,并且支持多达60个可编程输入/输出管脚(具体取决于与GPIO复用的外设的使用情况)。


好了,关于对LM3s1138的寄存器学习先告一段落。下面我要开始自己动手写程序了。我的想法是遇到问题,然后解决问题,再把解决这个问题的过程写出来,和大家一起交流。icon

文章评论3条评论)

登录后参与讨论

用户377235 2013-3-25 11:15

兄台,可否交流一下???

用户178146 2009-10-13 10:14

不好意思,痛痛快快的踢了一场足球,结果把脚给扭伤了,又患上感冒,所以这几天一直休息。不过,承蒙兄台看的起,小弟虽不才但还是会努力继续写下去的。

用户1479044 2009-10-12 16:49

楼主怎么不更新了啊,我一直追寻着楼主的学习步伐呢,呵呵!
相关推荐阅读
用户178146 2009-12-23 17:03
个人简历
个人资料                                  姓名:YGM                  性别:男                籍贯:湖南学历:本科        ...
用户178146 2009-11-16 11:09
8*8点阵
https://static.assets-stash.eet-china.com/album/old-resources/2009/11/16/7ac6100e-4813-496c-ade3-cc1...
用户178146 2009-10-27 08:27
DSP最小系统
经过几天的努力,终于画完了这个TMS320C55X系列的最小系统。核心板上主要是DSP芯片TMS320VC5501,Flash(AT25F512),SDRAM(HY57V6416),还有JTAG接口。...
用户178146 2009-10-26 15:02
如何学习嵌入式系统(基于ARM平台)---转自kinreven 的Blog
关于嵌入式系统--献给热爱此道的初学者们前言   网上看到众多网友都问了关于嵌入式系统方面的很多问题,很多都可在这里找到答案,希望我的这篇文章能给他们以启发。也请大家不要轻易转载。一、嵌入式系统的概念...
用户178146 2009-10-16 14:49
LM3s1138学习手记(4)之玩转LED
好久没写东西了,不是我偷懒,而是最近很背。不说了,开始我们的LED吧!先上硬件电路图:既然是玩转LED,那么设计任务就不能草率。我的设计要求是:先依次点亮LED1,LED2,LED3,时间间隔为1s,...
用户178146 2009-09-26 18:39
DDS基本完工了!
经过将近一个月的努力,基于FPGA的正弦信号发生器终于完工了。我做是硬件部分,我同学写软件。硬件包括如下几个部分:1.高速数模转换DAC2.低通滤波部分3.信号放大部分最后用示波器观察波形如下:   ...
我要评论
3
10
关闭 站长推荐上一条 /2 下一条