今天已经是学习LM3s1138的第三天了,通过前面两天的学习大概了解了这个M3处理器的一些寄存器信息。今天努力把剩下的两个头文件搞定。
首先是sysctl.h头文件:
看头文件的名字就知道是系统管理的头文件。这里宏定义了一大堆的系统控制寄存器的地址,这与前面的类似,不在多说。我们先把这些地址放到一边,因为地址是不会变的。我们关心的是它下面的API原型驱动函数的用法。比较多,我们选择一部分进行分析。
系统控制总体上包含了: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)
{
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的寄存器学习先告一段落。下面我要开始自己动手写程序了。我的想法是遇到问题,然后解决问题,再把解决这个问题的过程写出来,和大家一起交流。
用户377235 2013-3-25 11:15
用户178146 2009-10-13 10:14
用户1479044 2009-10-12 16:49