您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页3_系统控制(SysCtl)(免费下载)

3_系统控制(SysCtl)(免费下载)

来源:意榕旅游网
目 录

第1章 系统控制(SysCtl).........................................................................................1

1.1 LDO控制.....................................................................................................................2 1.2 时钟控制.......................................................................................................................4 1.3 复位控制.....................................................................................................................11 1.4 外设控制.....................................................................................................................14 1.5 睡眠与深度睡眠.........................................................................................................17 1.6 杂项功能.....................................................................................................................22 1.7 中断操作.....................................................................................................................24 1.8 时钟验证.....................................................................................................................25

i

第1章 系统控制(SysCtl)

函 数 原 型

void SysCtlLDOSet(unsigned long ulVoltage) unsigned long SysCtlLDOGet(void)

void SysCtlLDOConfigSet(unsigned long ulConfig) void SysCtlClockSet(unsigned long ulConfig) unsigned long SysCtlClockGet(void)

void SysCtlPWMClockSet(unsigned long ulConfig) unsigned long SysCtlPWMClockGet(void) void SysCtlADCSpeedSet(unsigned long ulSpeed) unsigned long SysCtlADCSpeedGet(void) void SysCtlUSBPLLEnable(void) void SysCtlUSBPLLDisable(void) void SysCtlReset(void)

void SysCtlResetCauseClear(unsigned long ulCauses) unsigned long SysCtlResetCauseGet(void)

void SysCtlBrownOutConfigSet(unsigned long ulConfig, unsigned long ulDelay) void SysCtlPeripheralEnable(unsigned long ulPeripheral) void SysCtlPeripheralDisable(unsigned long ulPeripheral) void SysCtlPeripheralReset(unsigned long ulPeripheral) tBoolean SysCtlPeripheralPresent(unsigned long ulPeripheral) void SysCtlPeripheralSleepEnable(unsigned long ulPeripheral) void SysCtlPeripheralSleepDisable(unsigned long ulPeripheral) void SysCtlPeripheralDeepSleepEnable(unsigned long ulPeripheral) void SysCtlPeripheralDeepSleepDisable(unsigned long ulPeripheral) void SysCtlPeripheralClockGating(tBoolean bEnable) void SysCtlSleep(void) void SysCtlDeepSleep(void)

void SysCtlDelay(unsigned long ulCount) unsigned long SysCtlFlashSizeGet(void) unsigned long SysCtlSRAMSizeGet(void) tBoolean SysCtlPinPresent(unsigned long ulPin)

void SysCtlGPIOAHBEnable(unsigned long ulGPIOPeripheral) void SysCtlGPIOAHBDisable(unsigned long ulGPIOPeripheral) void SysCtlIntRegister(void (*pfnHandler)(void)) void SysCtlIntUnregister(void)

void SysCtlIntEnable(unsigned long ulInts) void SysCtlIntDisable(unsigned long ulInts) unsigned long SysCtlIntStatus(tBoolean bMasked) void SysCtlIntClear(unsigned long ulInts)

void SysCtlIOSCVerificationSet(tBoolean bEnable)

1

页码2 3 3 6 8 9 9 9 9 10 10 12 12 13 13 14 15 15 16 16 16 16 16 16 17 17 22 22 23 23 24 24 24 24 25 25 25 25 26

void SysCtlMOSCVerificationSet(tBoolean bEnable) void SysCtlPLLVerificationSet(tBoolean bEnable) void SysCtlClkVerificationClear(void)

26 26 26

系统控制部分看起来是由诸多功能杂乱的函数组成的,但是经过仔细分析后,大体上可以划分为8个比较清晰的部分:LDO控制、时钟控制、复位控制、外设控制、睡眠与深度睡眠、杂项功能、中断操作、时钟验证。这其中比较常用和重要的函数并不多,掌握它们的具体用法也不复杂,尤其是最后两个部分通常情况下都用不到。

1.1 LDO控制

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

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。

表1.1 函数SysCtlLDOSet( )

功能 原型

设置LDO的输出电压

void SysCtlLDOSet(unsigned long ulVoltage)

ulVoltage:要设置的LDO输出电压,应当取下列值之一: SYSCTL_LDO_2_25V // LDO输出2.25V SYSCTL_LDO_2_30V // LDO输出2.30V SYSCTL_LDO_2_35V // LDO输出2.35V SYSCTL_LDO_2_40V // LDO输出2.40V

参数

SYSCTL_LDO_2_45V // LDO输出2.45V SYSCTL_LDO_2_50V // LDO输出2.50V SYSCTL_LDO_2_55V // LDO输出2.55V SYSCTL_LDO_2_60V // LDO输出2.60V SYSCTL_LDO_2_65V // LDO输出2.65V SYSCTL_LDO_2_70V // LDO输出2.70V

2

SYSCTL_LDO_2_75V // LDO输出2.75V

返回

表1.2 函数SysCtlLDOGet( )

功能 原型 参数 返回

获取LDO的电压输出值 =unsigned long SysCtlLDOGet(void) 无

LDO当前电压值,与表1.1当中参数ulVoltage的取值相同

表1.3 函数SysCtlLDOConfigSet( )

功能 原型

配置LDO失效控制

void SysCtlLDOConfigSet(unsigned long ulConfig)

ulConfig:所需LDO故障控制的配置,应当取下列值之一:

参数

SYSCTL_LDOCFG_ARST // 允许LDO故障时产生复位 SYSCTL_LDOCFG_NORST // 禁止LDO故障时产生复位

返回

程序清单1.1是控制LDO输出电压的示例。在程序中,数组ulTab[ ]保存所有LDO可

能的设置电压,在主循环里,每隔3.5秒利用SysCtlLDOSet( )函数修改一次LDO输出电压值,同时发送到UART显示。在3.5秒间隔里,我们可以拿万用表来测量LDO管脚的实际电压值大小。

程序清单1.1 SysCtl例程:控制LDO输出电压

#include \"systemInit.h\" #include \"uartGetPut.h\" #include

// 主函数(程序入口) int main(void) {

const unsigned long ulTab[11] // 定义LDO电压数值表 {

SYSCTL_LDO_2_25V, SYSCTL_LDO_2_30V, SYSCTL_LDO_2_35V, SYSCTL_LDO_2_40V, SYSCTL_LDO_2_45V, SYSCTL_LDO_2_50V, SYSCTL_LDO_2_55V, SYSCTL_LDO_2_60V, SYSCTL_LDO_2_65V, SYSCTL_LDO_2_70V,

3

SYSCTL_LDO_2_75V };

short i; char s[40];

for (;;) {

for (i = 0; i < 11; i++) {

sprintf(s, \"LDO = 2.%d(V)\\r\\n\

// 显示LDO电压值

jtagWait( ); clockInit( ); uartInit( );

// 防止JTAG失效,重要! // 时钟初始化:晶振,6MHz // UART初始化

SysCtlLDOSet(ulTab[i]); // 设置LDO输出电压 uartPuts(s);

SysCtlDelay(3500 * (TheSysClock / 3000)); // 延时约3500ms

uartPuts(\"\\r\\n\"); } }

}

1.2 时钟控制

MOSCIOSCIOSC/4USESYSDIVOSCPLL系统时钟SYSDIV内部振荡器12MHz±30%OSCSRCPWMDIVOENXTALPWRDN恒定分频16.667MHz输出ADC时钟USEPWMDIV÷4PLL输出200MHzOSC0OSC1主振荡器1~8MHzBYPASSPWM时钟 图1.1 LM3S615时钟系统结构图

如图1.1所示,为LM3S615芯片的时钟系统结构图。时钟来源是主振荡器(MOSC)或12MHz内部振荡器(IOSC),最终产生的系统时钟(System Clock)用于Cortex-M3处理器内核以及大多数片内外设,PWM(脉宽调制)时钟在系统时钟基础上进一步分频获得,ADC(模-数转换)时钟是恒定分频的16.667MHz输出(要求必须启用锁相环PLL)。

Sandstorm家族上电默认采用MOSC,如果不接晶振也不提供外部振荡信号输入,则无法启动。Fury和DustDevil家族上电默认采用IOSC,如果软件上没有配置MOSC,则外部

4

晶振不会起振。

图1.2 LM3S1138时钟系统结构图

如图1.2所示,为LM3S1138芯片的时钟系统结构图,要比LM3S615复杂些。时钟来源除了MOSC和IOSC以外,还可以是30KHz内部振荡器(INT30),以及来自冬眠模块的32.768kHz外部有源振荡器(EXT32)。ADC时钟有两个来源可以选择。

C1OSC018~24pFY11~8MHzR13.3MΩC2StellarisMCUOSC118~24pF 图1.3 MOSC外接晶振典型用法 主振荡器MOSC可以连接一个1~8.192MHz的外部晶体(2008年新出型号可以支持到16.384MHz)。典型接法如图1.3所示。如果不使用晶体,则外部的有源振荡信号也可以从OSC0管脚输入,要求信号幅度介于0~3.3V之间,此时OSC1管脚应当悬空。 Stellaris系列ARM集成有两个内部振荡器,一个是12MHz高速振荡器IOSC,一个是30KHz低速振荡器INT30(Sandstorm家族没有30KHz振荡器)。内部振荡器误差较大,约±30%,这是由于IC制造工艺的特点形成的,因此对时钟精度有要求严格的场合不适宜采用内部振荡器。IOSC经4分频后(IOSC/4)标称为3MHz,也可以作为系统时钟的一个来源。芯片在较低的时钟速率下运行能够明显节省功耗。 5对于集成有冬眠模块(Hibernation Module)的型号(Sandstorm家族都没有冬眠模块),在冬眠备用电源管脚VBAT正常供电的情况下,可以从冬眠专用的晶振管脚XOSC0输入32.768KHz的外部有源振荡信号(不直接支持32.768KHz晶体)作为系统时钟源。

Stellaris系列ARM内部集成有一个PLL(Phase Locked Loop,锁相环)。PLL输出频率固定为400MHz(Sandstorm家族为200MHz),误差±1%。如果选用PLL,则MOSC频率必须在3.579545~8.192MHz之间才能使PLL精确地输出400MHz。

经OSC或PLL产生的时钟可以经过1~64分频(Sandstorm家族只能支持到16分频)后得到系统时钟(System Clock),分频数越大越省电。

注意:由于Cortex-M3内核最高运行频率为50MHz,因此如果要使用PLL,则至少要进行4以上的分频(硬件会自动阻止错误的软件配置)。启用PLL后,系统功耗将明显增大。

注意:在所有型号中,不论PLL输出是200MHz还是400MHz,只要分频数相同,则对PLL的分频结果都是一样的,统一按照200MHz进行计算。例如,LM3S615芯片的PLL是200MHz输出,LM3S1138芯片的PLL是400MHz输出,但执行以下函数调用后,最终的系统时钟都是20MHz:

SysCtlClockSet(SYSCTL_USE_PLL |

SYSCTL_OSC_MAIN |

SYSCTL_XTAL_6MHZ | SYSCTL_SYSDIV_10);

PWM(脉宽调制)模块的时钟(PWM Clock)是在系统时钟基础上经进一步分频得到的,允许的分频数是:1、2、4、8、16、32、64。参见函数SysCtlPWMClockSet( )。

Stellaris系列ARM内部集成有10位ADC模块,不同型号的采样速率也不同:125K、250K、500K、1M,单位:sps(次采样/秒)。例如LM3S1138的ADC采样速率是1M。ADC模块要求工作在额定的16MHz时钟下才能保证±1LSB的精度(IC工艺原因),而每采样一次需要16个时钟周期。对于实际采样速率达不到1M的型号,ADC模块还可以对输入的16MHz时钟进行分频以获得恰当的工作时钟速率,参见函数SysCtlADCSpeedSet( )。

针对ADC时钟有16MHz额定输入的这一要求,可以采用两种方法提供:一是启用PLL单元,固定的分频数可以保证ADC时钟在16MHz左右(参见图1.1和图1.2),可能存在的问题是功耗比较大;二是采用16MHz或16.384MHz晶振,好处是功耗较低。当然,有很多型号直接支持的晶振只能达到8.192MHz,对于这种情况可以考虑从OSC0管脚直接输入16MHz的有源振荡信号。

表1.4 函数SysCtlClockSet( )

功能 原型

系统时钟设置

void SysCtlClockSet(unsigned long ulConfig)

ulConfig:时钟配置字,应当取下列各组数值之间的“或运算”组合形式: ● 系统时钟分频值

SYSCTL_SYSDIV_1 // 振荡器不分频(不可用于PLL) SYSCTL_SYSDIV_2 // 振荡器 2分频(不可用于PLL)

参数

SYSCTL_SYSDIV_3 // 振荡器 3分频(不可用于PLL)

SYSCTL_SYSDIV_4 // 振荡器 4分频,或对PLL的分频结果为50MHz SYSCTL_SYSDIV_5 // 振荡器 5分频,或对PLL的分频结果为40MHz

……

SYSCTL_SYSDIV_64 // 振荡器64分频,或对PLL的分频结果为3.125MHz

6

注:对Sandstorm家族最大分频数只能取到16。不同型号PLL输出为200MHz或400MHz,但分频时都按200MHz进行计算,这保持了软件上的兼容性。由于Cortex-M3内核最高工作频率为50MHz,因此启用PLL时必须进行4以上的分频(硬件会自动阻止错误的软件配置)。 ● 使用OSC还是PLL

SYSCTL_USE_PLL // 采用锁相环PLL作为系统时钟源

SYSCTL_USE_OSC // 采用OSC(主振荡器或内部振荡器)作为系统时钟源 注:如果选用PLL作为系统时钟,则本函数将轮询PLL锁定中断状态位来确定PLL是何时锁定的,PLL锁定时间最多不会超过0.5ms。由于启用PLL时会消耗较大的功率,因此在启用PLL之前,要求必须先将LDO电压设置在2.75V,否则可能造成芯片工作不稳定。 ● OSC时钟源选择

SYSCTL_OSC_MAIN // 主振荡器作为OSC

SYSCTL_OSC_INT // 内部12MHz振荡器作为OSC SYSCTL_OSC_INT4 // 内部12MHz振荡器4分频后作为OSC SYSCTL_OSC_INT30 // 内部30KHz振荡器作为OSC SYSCTL_OSC_EXT32 // 外接32.768KHz有源振荡器作为OSC

注:内部12MHz、30KHz振荡器有±30%的误差,对时钟精度有要求严格的场合不适宜采用。采用内部30KHz和外部32.768KHz振荡器,能够明显节省功耗,但是Sandstorm家族不支持这两种低频振荡器。采用外部32.768KHz振荡器时,不能直接用晶体而必须是从XOSC0管脚输入的有源振荡信号,并且要保证冬眠模块(Hibernation Module)VBAT管脚的正常供电。 ● 外接晶体频率

SYSCTL_XTAL_1MHZ // 外接晶体 1MHz SYSCTL_XTAL_1_84MHZ // 外接晶体 1.8432MHz SYSCTL_XTAL_2MHZ // 外接晶体 2MHz SYSCTL_XTAL_2_45MHZ // 外接晶体 2.4576MHz SYSCTL_XTAL_3_57MHZ // 外接晶体 3.579545MHz SYSCTL_XTAL_3_68MHZ // 外接晶体 3.6864MHz SYSCTL_XTAL_4MHZ // 外接晶体 4MHz SYSCTL_XTAL_4_09MHZ // 外接晶体 4.096MHz SYSCTL_XTAL_4_91MHZ // 外接晶体 4.9152MHz SYSCTL_XTAL_5MHZ // 外接晶体 5MHz SYSCTL_XTAL_5_12MHZ // 外接晶体 5.12MHz SYSCTL_XTAL_6MHZ // 外接晶体 6MHz SYSCTL_XTAL_6_14MHZ // 外接晶体 6.144MHz SYSCTL_XTAL_7_37MHZ // 外接晶体 7.3728MHz SYSCTL_XTAL_8MHZ // 外接晶体 8MHz SYSCTL_XTAL_8_19MHZ // 外接晶体 8.192MHz SYSCTL_XTAL_10MHZ // 外接晶体 10MHz SYSCTL_XTAL_12MHZ // 外接晶体 12MHz SYSCTL_XTAL_12_2MHZ // 外接晶体 12.288MHz SYSCTL_XTAL_13_5MHZ // 外接晶体 13.56MHz SYSCTL_XTAL_14_3MHZ // 外接晶体 14.31818MHz SYSCTL_XTAL_16MHZ // 外接晶体 16MHz SYSCTL_XTAL_16_3MHZ // 外接晶体 16.384MHz

注:对于2008年新推出的型号,外接晶体频率可以达到16.384MHz,以前的型号只能达到

7

8.192MHz,详细情况请以具体型号的《数据手册》为准。启用PLL时,所支持的晶振频率必须在3.57~8.192MHz之间,否则可能造成失锁。 ● 振荡源禁止

SYSCTL_INT_OSC_DIS // 禁止内部振荡器 SYSCTL_MAIN_OSC_DIS // 禁止主振荡器

注:禁止不用的振荡器可以节省功耗。为了能够使用外部时钟源,主振荡器必须被使能,试图禁止正在为芯片提供时钟的振荡器会被硬件阻止。

返回

// 采用6MHz晶振作为系统时钟 SysCtlClockSet(SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ | SYSCTL_SYSDIV_1);

// 采用16MHz晶振4分频作为系统时钟 SysCtlClockSet(SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ | SYSCTL_SYSDIV_4);

// 采用内部12MHz振荡器作为系统时钟

示例

SysCtlClockSet(SYSCTL_USE_OSC | SYSCTL_OSC_INT | SYSCTL_SYSDIV_1);

// 采用内部12MHz振荡器4分频作为系统时钟

SysCtlClockSet(SYSCTL_USE_OSC | SYSCTL_OSC_INT4 | SYSCTL_SYSDIV_1);

// 采用内部30KHz振荡器作为系统时钟

SysCtlClockSet(SYSCTL_USE_OSC | SYSCTL_OSC_INT30 | SYSCTL_SYSDIV_1);

// 外接6MHz晶体,采用PLL作为系统时钟,分频结果为20MHz SysCtlLDOSet(SYSCTL_LDO_2_75V); SysCtlClockSet(SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ | SYSCTL_SYSDIV_10);

表1.5 函数SysCtlClockGet( )

功能 原型 参数

获取系统时钟速率

unsigned long SysCtlClockGet(void) 无

返回当前配置的系统时钟速率,单位:Hz

返回

注:如果在调用本函数之前,从没有通过调用函数SysCtlClockSet( )来配置时钟,或者时钟直接由一个晶体(或外部时钟源)来提供而该晶体(或外部时钟源)并不属于支持的标准晶体频率(参

8

考表1.4),则不会返回精确的结果。

表1.6 函数SysCtlPWMClockSet( )

功能 原型

设置PWM时钟的预分频数

void SysCtlPWMClockSet(unsigned long ulConfig) ulConfig:PWM时钟配置,应当取下列值之一:

SYSCTL_PWMDIV_1 // PWM时钟预先进行1分频(不分频) SYSCTL_PWMDIV_2 // PWM时钟预先进行2分频

参数

SYSCTL_PWMDIV_4 // PWM时钟预先进行4分频 SYSCTL_PWMDIV_8 // PWM时钟预先进行8分频 SYSCTL_PWMDIV_16 // PWM时钟预先进行16分频 SYSCTL_PWMDIV_32 // PWM时钟预先进行32分频 SYSCTL_PWMDIV_64 // PWM时钟预先进行64分频

返回

表1.7 函数SysCtlPWMClockGet( )

功能 原型 参数 返回

获取PWM时钟的预分频数

unsigned long SysCtlPWMClockGet(void) 无

返回PWM时钟的预分频数,与表1.6当中参数ulConfig的取值相同

表1.8 函数SysCtlADCSpeedSet( )

功能 原型

设置ADC的采样速度

void SysCtlADCSpeedSet(unsigned long ulSpeed) ulSpeed:采样速度,取下列值之一:

SYSCTL_ADCSPEED_1MSPS // 采样速率:1M次采样/秒

参数

SYSCTL_ADCSPEED_500KSPS // 采样速率:500K次采样/秒 SYSCTL_ADCSPEED_250KSPS // 采样速率:250K次采样/秒 SYSCTL_ADCSPEED_125KSPS // 采样速率:125K次采样/秒

返回

表1.9 函数SysCtlADCSpeedGet( )

功能 原型 参数 返回

获取ADC的采样速度

unsigned long SysCtlADCSpeedGet(void) 无

返回ADC的采样速度,与表1.8当中参数ulSpeed的取值相同

9

表1.10 函数SysCtlUSBPLLEnable( )

功能 原型 参数 返回 说明

使能USB模块专用的PLL单元 void SysCtlUSBPLLEnable(void) 无 无

2008年新推出的LM3S3xxx和5xxx系列芯片集成有USB 2.0全速/OTG/Host/Device功能,其PLL单元是专用的,输出240MHz,经固定的4分频后作为USB模块的工作时钟。

表1.11 函数SysCtlUSBPLLDisable( )

功能 原型 参数 返回

禁止USB模块专用的PLL单元 void SysCtlUSBPLLDisable(void) 无 无

程序清单1.2演示了系统时钟设置函数SysCtlClockSet( )函数的用法。在程序中,函数ledFlash( )可以使LED指示灯闪烁数次,采用固定周期数的延时函数delay( )。在主循环里,系统时钟采用不同的配置,结果LED闪烁速度随着变快或者变慢。要注意设置PLL的要点:必须首先将LDO的输出电压设置在2.75V。这是因为启用PLL后系统功耗会立即增大许多,如果LDO电压不够高则容易造成芯片工作不稳定。

程序清单1.2 SysCtl例程:系统时钟设置

#include \"systemInit.h\"

// 定义LED

#define LED_PERIPH SYSCTL_PERIPH_GPIOG #define LED_PORT GPIO_PORTG_BASE #define LED_PIN GPIO_PIN_2 // 延时

void delay(unsigned long ulVal) { }

// LED闪烁usN次

void ledFlash(unsigned short usN) {

do {

GPIOPinWrite(LED_PORT, LED_PIN, 0x00); // 点亮LED delay(200000UL);

while (--ulVal != 0);

10

GPIOPinWrite(LED_PORT, LED_PIN, 1 << 2); // 熄灭LED delay(300000UL); }

// 主函数(程序入口) int main(void) {

SysCtlPeriEnable(LED_PERIPH); // 使能LED所在的GPIO端口 GPIOPinTypeOut(LED_PORT, LED_PIN); // 设置LED所在管脚为输出

for (;;) {

SysCtlLDOSet(SYSCTL_LDO_2_50V); // 设置LDO输出电压

SysCtlClockSet(SYSCTL_USE_OSC | // 系统时钟设置

SysCtlClockSet(SYSCTL_USE_OSC | // 系统时钟设置

SysCtlLDOSet(SYSCTL_LDO_2_75V); // 配置PLL前须将LDO设为2.75V

SysCtlClockSet(SYSCTL_USE_PLL | // 系统时钟设置,采用PLL }

ledFlash(12);

// 20MHz系统时钟,快速闪烁

}

SYSCTL_OSC_MAIN |

// 主振荡器 // 外接6MHz晶振

SYSCTL_XTAL_6MHZ |

ledFlash(8);

// 6MHz系统时钟,较快闪烁

SYSCTL_OSC_INT |

// 内部振荡器(12MHz±30%)

SYSCTL_SYSDIV_2); // 2分频

ledFlash(5);

// 2MHz系统时钟,缓慢闪烁

SYSCTL_OSC_MAIN |

// 采用主振荡器 // 外接6MHz晶体

SYSCTL_XTAL_6MHZ |

jtagWait( );

// 防止JTAG失效,重要!

} while (--usN != 0);

SYSCTL_SYSDIV_3); // 3分频

SYSCTL_SYSDIV_10); // 分频结果为20MHz

1.3 复位控制

在Stellaris系列ARM有多种复位源,所有复位标志都集中保存在一个复位原因寄存器(RSTC)里。

11

z 上电复位(POR)

上电时,芯片自动复位,称为“上电复位”(Power On Reset)。上电复位后,POR标志置位。

z 外部复位(EXT)

芯片正在工作时,如果复位管脚/RST被拉低、延迟、再拉高,则芯片产生复位。这种复位称为“外部复位”(External Reset)。外部复位后,EXT标志置位,其它标志(POR除外)都被清零。

z 软件复位(SW)

芯片正在工作时,执行函数SysCtlReset( )会产生“软件复位”(Software Reset)。软件复位后,SW标志置位,其它复位标志不变。

z 看门狗复位(WDT)

如果使能了看门狗模块的复位功能,则因为没有及时“喂狗”而产生的复位称为“看门狗复位”(WatchDog Reset)。看门狗复位后,WDT标志置位,其它复位标志不变。

z 掉电复位(BOR)

掉电检测的结果可以用来触发中断或产生复位,如果用于产生复位,则这种复位称为“掉电复位”(Brown Out Reset)。掉电复位后,BOR标志被置位,其它复位标志不变。

注意:“掉电”不是“断电”。“掉电”一词的英文是“Brown Out”,其本意是“把灯火弄暗”(不是“弄灭”)。“断电”指芯片的供电被彻底切断,没有了电源,芯片的一切功能都谈不上了;掉电指芯片原先供电正常,后来供电跌落到某个较低的电压值时的工作状态。掉电检测功能能够自动查知掉电过程(门槛电压标称值为2.9V)。

z LDO复位(LDO)

当LDO供电不可调整时,例如LDO输出管脚在短时间内被强制接到GND,芯片所产生的复位称为LDO供电不可调整复位(LDO power not OK reset),简称LDO复位。LDO复位后,LDO标志置位,其它标志不变。

表1.12 函数SysCtlReset( )

功能 原型 参数 返回

软件复位

void SysCtlReset(void) 无

该函数不会返回,一旦调用就会使整个芯片产生复位

表1.13 函数SysCtlResetCauseClear( )

功能 原型

清除芯片的复位原因

void SysCtlResetCauseClear(unsigned long ulCauses)

ulCauses:要清除的复位源,应当取下列值之一或者它们之间的任意“或运算”组合形式: SYSCTL_CAUSE_LDO // LDO供电不可调整引起的复位 SYSCTL_CAUSE_SW // 软件复位

参数

SYSCTL_CAUSE_WDOG // 看门狗复位 SYSCTL_CAUSE_BOR // 掉电复位 SYSCTL_CAUSE_POR // 上电复位 SYSCTL_CAUSE_EXT // 外部复位

返回

12

=

功能 原型 参数 返回

获取芯片复位的原因

unsigned long SysCtlResetCauseGet(void) 无

复位的原因,与表1.14当中参数ulCauses的取值相同

表1.14 函数SysCtlResetCauseGet( )

表1.15 函数SysCtlBrownOutConfigSet( )

功能 原型

配置掉电控制

void SysCtlBrownOutConfigSet(unsigned long ulConfig, unsigned long ulDelay) ulConfig:希望的掉电控制的配置,应当取下列值之间的任意“或运算”组合形式: SYSCTL_BOR_RESET // 复位代替中断

参数

SYSCTL_BOR_RESAMPLE // 在生效之前重新采样BOR

ulDelay:重新采样一个有效的掉电信号之前要等待的内部振荡器周期数,该值只在 SYSCTL_BOR_RESAMPLE被设置后并且小于8192时才有意义

返回

程序清单1.3演示了几个系统复位控制函数的用法。首次上电时,通过UART显示“Power

on reset”和“External reset”;如果按下复位按钮,则显示“External reset”;不去按键,稍等一会儿会自动执行软件复位,显示“Software reset”。如果还存在其它可能的复位方式,也会正确显示出来。

程序清单1.3 SysCtl例程:系统复位控制

#include \"systemInit.h\" #include \"uartGetPut.h\" #include

// 主函数(程序入口) int main(void) {

ulCauses SysCtlResetCauseGet( ); // 读取复位原因

// 判断具体是哪个复位源

if (ulCauses & SYSCTL_CAUSE_LDO) uartPuts(\"LDO power not OK reset\\r\\n\"); if (ulCauses & SYSCTL_CAUSE_SW) uartPuts(\"Software reset\\r\\n\"); if (ulCauses & SYSCTL_CAUSE_WDOG) uartPuts(\"Watchdog reset\\r\\n\"); jtagWait( ); clockInit( ); uartInit( );

// 防止JTAG失效,重要! // 时钟初始化:晶振,6MHz // UART初始化

unsigned long ulCauses;

13

if (ulCauses & SYSCTL_CAUSE_BOR) uartPuts(\"Brown-out reset\\r\\n\"); if (ulCauses & SYSCTL_CAUSE_POR) uartPuts(\"Power on reset\\r\\n\"); if (ulCauses & SYSCTL_CAUSE_EXT) uartPuts(\"External reset\\r\\n\");

uartPuts(\"\\r\\n\");

SysCtlResetCauseClear(SYSCTL_CAUSE_LDO | // 清除所有复位源

SYSCTL_CAUSE_SW | SYSCTL_CAUSE_WDOG |

SYSCTL_CAUSE_BOR | SYSCTL_CAUSE_POR | SYSCTL_CAUSE_EXT);

SysCtlDelay(4500 * (TheSysClock / 3000)); // 延时约3500ms

for (;;)

// 不会执行到这里

{ } }

SysCtlReset( );

// 软件复位

1.4 外设控制

Stellaris系列ARM所有片内外设只有在使能后才可以工作,如果直接对一个尚未使能的外设进行操作,则会进入硬故障中断。使能片内外设的函数是SysCtlPeripheralEnable( ),对该函数我们已经非常熟悉了。如果一个片内外设暂时不被使用,则可以用函数SysCtlPeripheralDisable( )将其禁止,以节省功耗。其它外设控制还包括外设复位、确认外设是否存在、睡眠与深度睡眠等。

表1.16 函数SysCtlPeripheralEnable( )

功能 原型

使能一个片内外设

void SysCtlPeripheralEnable(unsigned long ulPeripheral) ulPeripheral:要使能的片内外设,应当取下列值之一:

SYSCTL_PERIPH_PWM // PWM (脉宽调制) SYSCTL_PERIPH_ADC // ADC (模-数转换)

SYSCTL_PERIPH_HIBERNATE // Hibernation module (冬眠模块) SYSCTL_PERIPH_WDOG // Watchdog (看门狗)

参数

SYSCTL_PERIPH_UART0 // UART 0 (串行异步收发器0) SYSCTL_PERIPH_UART1 // UART 1 (串行异步收发器1) SYSCTL_PERIPH_UART2 // UART 2 (串行异步收发器2) SYSCTL_PERIPH_SSI // SSI (同步串行接口)

SYSCTL_PERIPH_SSI0 // SSI 0 (同步串行接口0,与SSI等同) SYSCTL_PERIPH_SSI1 // SSI 1 (同步串行接口1) SYSCTL_PERIPH_QEI // QEI (正交编码接口)

14

SYSCTL_PERIPH_QEI0 // QEI 0 (正交编码接口0,与QEI等同) SYSCTL_PERIPH_QEI1 // QEI 1 (正交编码接口1) SYSCTL_PERIPH_I2C // I2C (互联IC总线)

SYSCTL_PERIPH_I2C0 // I2C 0 (互联IC总线0,与I2C等同) SYSCTL_PERIPH_I2C1 // I2C 1 (互联IC总线1) SYSCTL_PERIPH_TIMER0 // Timer 0 (定时器0) SYSCTL_PERIPH_TIMER1 // Timer 1 (定时器1) SYSCTL_PERIPH_TIMER2 // Timer 2 (定时器2) SYSCTL_PERIPH_TIMER3 // Timer 3 (定时器3)

SYSCTL_PERIPH_COMP0 // Analog comparator 0 (模拟比较器0) SYSCTL_PERIPH_COMP1 // Analog comparator 1 (模拟比较器1) SYSCTL_PERIPH_COMP2 // Analog comparator 2 (模拟比较器2) SYSCTL_PERIPH_GPIOA // GPIO A (通用输入/输出端口A) SYSCTL_PERIPH_GPIOB // GPIO B (通用输入/输出端口B) SYSCTL_PERIPH_GPIOC // GPIO C (通用输入/输出端口C) SYSCTL_PERIPH_GPIOD // GPIO D (通用输入/输出端口D) SYSCTL_PERIPH_GPIOE // GPIO E (通用输入/输出端口E) SYSCTL_PERIPH_GPIOF // GPIO F (通用输入/输出端口F) SYSCTL_PERIPH_GPIOG // GPIO G (通用输入/输出端口G) SYSCTL_PERIPH_GPIOH // GPIO H (通用输入/输出端口H) SYSCTL_PERIPH_CAN0 // CAN 0 (控制局域网总线0) SYSCTL_PERIPH_CAN1 // CAN 1 (控制局域网总线1) SYSCTL_PERIPH_CAN2 // CAN 2 (控制局域网总线2) SYSCTL_PERIPH_ETH // ETH (以太网) SYSCTL_PERIPH_IEEE1588 // IEEE1588

SYSCTL_PERIPH_UDMA // uDMA controller (µDMA控制器) SYSCTL_PERIPH_USB0 // USB0 controller (USB0控制器)

返回

表1.17 函数SysCtlPeripheralDisable( )

功能 原型 参数 返回

禁止一个片内外设

void SysCtlPeripheralDisable(unsigned long ulPeripheral)

ulPeripheral:要禁止的片内外设,与表1.16当中参数ulPeripheral的取值相同 无

表1.18 函数SysCtlPeripheralReset( )

功能 原型 参数 返回

复位一个片内外设

void SysCtlPeripheralReset(unsigned long ulPeripheral)

ulPeripheral:要复位的片内外设,与表1.16当中参数ulPeripheral的取值相同 无

15

表1.19 函数SysCtlPeripheralPresent( )

功能 原型

确认某个片内外设是否存在

tBoolean SysCtlPeripheralPresent(unsigned long ulPeripheral)

ulPeripheral:要确认的片内外设,与表1.16当中参数ulPeripheral的取值相同,并增加以下几个:

参数

SYSCTL_PERIPH_PLL // PLL (锁相环)

SYSCTL_PERIPH_TEMP // Temperature sensor (温度传感器)

SYSCTL_PERIPH_MPU // Cortex M3 MPU (Cotex-M3存储器保护单元)

返回

要确认的外设如果实际存在则返回true,如果不存在则返回false

表1.20 函数SysCtlPeripheralSleepEnable( )

功能 原型 参数 返回

使能一个在睡眠模式下工作的片内外设

void SysCtlPeripheralSleepEnable(unsigned long ulPeripheral)

ulPeripheral:要使能的片内外设,与表1.16当中参数ulPeripheral的取值相同 无

表1.21 函数SysCtlPeripheralSleepDisable( )

功能 原型 参数 返回

禁止一个在睡眠模式下工作的片内外设

void SysCtlPeripheralSleepDisable(unsigned long ulPeripheral)

ulPeripheral:要禁止的片内外设,与表1.16当中参数ulPeripheral的取值相同 无

表1.22 函数SysCtlPeripheralDeepSleepEnable( )

功能 原型 参数 返回

使能一个在深度睡眠模式下工作的片内外设

void SysCtlPeripheralDeepSleepEnable(unsigned long ulPeripheral)

ulPeripheral:要使能的片内外设,与表1.16当中参数ulPeripheral的取值相同 无

表1.23 函数SysCtlPeripheralDeepSleepDisable( )

功能 原型 参数 返回

禁止一个在深度睡眠模式下工作的片内外设

void SysCtlPeripheralDeepSleepDisable(unsigned long ulPeripheral)

ulPeripheral:要禁止的片内外设,与表1.16当中参数ulPeripheral的取值相同 无

表1.24 函数SysCtlPeripheralClockGating( )

功能 原型 参数 返回

控制睡眠或深度睡眠模式中的外设时钟选择 void SysCtlPeripheralClockGating(tBoolean bEnable)

bEnable:如果在睡眠或深度睡眠下的外设被配置为应该使用时取值true,否则取值false 无

16

1.5 睡眠与深度睡眠

Stellaris系列ARM主要有3种工作模式:运行模式(Run-Mode)、睡眠模式(Sleep-Mode)、深度睡眠模式(Deep-Sleep-Mode)。有许多型号还单独具有极为省电的冬眠模块(Hibernation Module)。

运行模式是正常的工作模式,处理器内核将积极地执行代码。在睡眠模式下,系统时钟不变,但处理器内核不再执行代码(内核因不需要时钟而省电)。在深度睡眠模式下,系统时钟可变,处理器内核同样也不再执行代码。深度睡眠模式比睡眠模式更为省电。有关这3种工作模式的具体区别请参见表1.25的描述。

表1.25 运行、睡眠、深度睡眠对照表

处理器模式 比较项目 处理器、存储器 功耗大小 运行模式 (Run-Mode) 活动 大 所有时钟源都可用,包括晶振、内部12MHz外设时钟源 振荡器、内部30KHz振荡器、PLL,以及外部32.768KHz有源时钟信号。

由运行模式进入睡眠模式时,系统时钟的配置保持不变。 睡眠模式 (Sleep-Mode) 停止 (存储器内容保持不变)小 深度睡眠模式 (Deep-Sleep-Mode) 停止 (存储器内容保持不变) 很小 在进入深度睡眠后可自动关闭功耗较高的主振荡器,改用功耗较低的内部振荡器。 若使用PLL,则进入深度睡眠后PLL可以被自动断电,改用OSC的16或64分频作为系统时钟。 处理器被唤醒后,首先恢复原先的时钟配置,再执行代码。 调用函数SysCtlSleep( )可以使处理器进入睡眠模式,调用函数SysCtlDeepSleep( )可以

使处理器进入深度睡眠模式。处理器进入睡眠或深度睡眠后,就停止活动。当出现一个中断时,可以唤醒处理器,使其从睡眠或深度睡眠模式返回到正常的运行模式。因此在进入睡眠或深度睡眠之前,必须配置某个片内外设的中断并允许其在睡眠或深度睡眠模式下继续工作,如果不这样,则只有复位或重新上电才能结束睡眠/深度睡眠状态。处理器唤醒后首先执行中断服务程序,退出后接着执行主程序当中后续的代码。

表1.26 函数SysCtlSleep( )

功能 原型 参数 返回

使处理器进入睡眠模式 void SysCtlSleep(void) 无

无(在处理器未被唤醒前不会返回)

表1.27 函数SysCtlDeepSleep( )

功能 原型

使处理器进入深度睡眠模式 void SysCtlDeepSleep(void)

17

参数 返回

无(在处理器未被唤醒前不会返回)

程序清单1.4是睡眠模式的实例。程序在初始化时点亮LED,表明处于运行模式;此后进入睡眠模式,处理器暂停运行,并以熄灭LED来指示;当出现KEY中断时,处理器被唤醒,先执行中断服务函数,退出中断后接着执行主程序当中的后续代码;按照程序的安排,唤醒后点亮LED,延时一段时间后再次进入睡眠模式,等待KEY中断唤醒,如此反复。

程序清单1.4 SysCtl例程:睡眠省电模式

#include \"systemInit.h\"

#define SysCtlPeriClkGating

// 定义LED

#define LED_PERIPH SYSCTL_PERIPH_GPIOG #define LED_PORT GPIO_PORTG_BASE #define LED_PIN GPIO_PIN_2

// 定义KEY

#define KEY_PERIPH

SYSCTL_PERIPH_GPIOD

#define KEY_PORT GPIO_PORTD_BASE #define KEY_PIN GPIO_PIN_1

// 按键初始化 void keyInit(void) {

SysCtlPeriEnable(KEY_PERIPH);

// 使能KEY所在的GPIO端口 // 设置KEY的中断类型 // 使能GPIOD中断 // 使能处理器中断

GPIOPinTypeIn(KEY_PORT, KEY_PIN); // 设置KEY所在管脚为输入 GPIOIntTypeSet(KEY_PORT, KEY_PIN, GPIO_LOW_LEVEL); }

// 主函数(程序入口) int main(void) {

SysCtlPeriEnable(LED_PERIPH); // 使能LED所在的GPIO端口 GPIOPinTypeOut(LED_PORT, LED_PIN); // 设置LED所在管脚为输出

jtagWait( ); clockInit( ); keyInit( );

// 防止JTAG失效,重要! // 时钟初始化:晶振,6MHz // 按键初始化

IntEnable(INT_GPIOD); IntMasterEnable( );

GPIOPinIntEnable(KEY_PORT, KEY_PIN); // 使能KEY中断

SysCtlPeripheralClockGating

#define SysCtlPeriSlpEnable SysCtlPeripheralSleepEnable

18

GPIOPinWrite(LED_PORT, LED_PIN, 0x00); // 点亮LED,表示工作状态

// 允许在睡眠模式下外设采用寄存器SCGCn配置时钟 SysCtlPeriClkGating(true);

// 允许KEY所在GPIO端口在睡眠模式下继续工作 SysCtlPeriSlpEnable(KEY_PERIPH);

for (;;) {

GPIOPinWrite(LED_PORT, LED_PIN, 1 << 2); // 熄灭LED,表示进入睡眠

= SysCtlSleep( ); // 使处理器进入睡眠模式 GPIOPinWrite(LED_PORT, LED_PIN, 0x00); // 点亮LED,表示已被唤醒 SysCtlDelay(2500 * (TheSysClock / 3000)); // 工作一段时间后,再次睡眠 } }

// GPIOD的中断服务函数 void GPIO_Port_D_ISR(void) {

ulStatus GPIOPinIntStatus(KEY_PORT, true); // 读取中断状态 GPIOPinIntClear(KEY_PORT, ulStatus); // 清除中断状态,重要

if (ulStatus & KEY_PIN) // 如果KEY中断状态有效 {

SysCtlDelay(10 * (TheSysClock / 3000)); // 延时,以消除按键抖动

SysCtlDelay(10 * (TheSysClock / 3000)); // 延时,以消除松键抖动 } }

while (GPIOPinRead(KEY_PORT, KEY_PIN) == 0);

// 等待按键抬起

unsigned long ulStatus;

SysCtlDelay(2500 * (TheSysClock / 3000));

程序清单1.5是深度睡眠模式的实例。为了便于演示深度睡眠模式下系统时钟的变化,

在例程中增加了蜂鸣器的驱动函数sound( )。在这里采用的是交流蜂鸣器,也称无源蜂鸣器,发声频率等于驱动它的方波频率。产生方波的方法是利用Timer的16位PWM功能。有关Timer模块的用法我们将在后续章节里详细讨论。

在程序清单1.5里,初始化时Timer模块的时钟(等同于系统时钟)设置为PLL输出12.5MHz(请修改systemInit.c里的clockInit( )函数),蜂鸣器发声频率为2500Hz,表现为尖叫。在进入深度睡眠模式后,PLL被自动禁止,Timer模块的时钟改由IOSC的16分频来提供,此时蜂鸣器的发声频率变成约150Hz,表现为低沉的叫声。按下KEY以后,处理器会

19

被唤醒,Timer模块的时钟恢复为原来的配置,于是蜂鸣器重新尖叫。

程序清单1.5 SysCtl例程:深度睡眠省电模式

#include \"systemInit.h\" #include #include

#define SysCtlPeriClkGating

// 定义KEY

#define KEY_PERIPH

SYSCTL_PERIPH_GPIOD

#define KEY_PORT GPIO_PORTD_BASE #define KEY_PIN GPIO_PIN_1

// 按键初始化 void keyInit(void) {

SysCtlPeriEnable(KEY_PERIPH);

// 使能KEY所在的GPIO端口 // 设置KEY的中断类型 // 使能GPIOD中断 // 使能处理器中断

GPIOPinTypeIn(KEY_PORT, KEY_PIN); // 设置KEY所在管脚为输入 GPIOIntTypeSet(KEY_PORT, KEY_PIN, GPIO_LOW_LEVEL); }

// 在PG4/CCP3管脚产生2500KHz方波,使蜂鸣器发声 void sound(void) {

SysCtlPeriEnable(SYSCTL_PERIPH_TIMER1); // 使能TIMER1模块

SysCtlPeriEnable(SYSCTL_PERIPH_GPIOG); // 使能CCP3所在的GPIO端口 GPIOPinTypeTimer(GPIO_PORTG_BASE, GPIO_PIN_4); // 配置相关管脚为Timer功能

TimerConfigure(TIMER1_BASE, TIMER_CFG_16_BIT_PAIR | // 配置TimerB为16位PWM

TimerLoadSet(TIMER1_BASE, TIMER_B, 5000); // 设置TimerB初值 TimerMatchSet(TIMER1_BASE, TIMER_B, 2500); // 设置TimerB匹配值 TimerEnable(TIMER1_BASE, TIMER_B); }

// 主函数(程序入口) int main(void) {

TIMER_CFG_B_PWM);

IntEnable(INT_GPIOD); IntMasterEnable( );

GPIOPinIntEnable(KEY_PORT, KEY_PIN); // 使能KEY中断

SysCtlPeripheralClockGating SysCtlPeripheralDeepSleepEnable

#define SysCtlPeriDSlpEnable

20

jtagWait( ); clockInit( ); keyInit( );

=

// 防止JTAG失效,重要! // 时钟初始化:PLL,12.5MHz // 按键初始化

// 允许Timer1模块在深度睡眠模式下继续工作 SysCtlPeriDSlpEnable(SYSCTL_PERIPH_TIMER1);

// 允许Buzzer所在的GPIO端口在深度睡眠模式下继续工作 SysCtlPeriDSlpEnable(SYSCTL_PERIPH_GPIOG);

// 允许KEY所在GPIO端口在深度睡眠模式下继续工作 SysCtlPeriDSlpEnable(KEY_PERIPH);

// 允许在深度睡眠下外设采用寄存器DCGCn配置时钟 SysCtlPeriClkGating(true);

// 置位DSLPCLKCFG寄存器中的IOSC位,将来进入深度睡眠模式后,系统时钟改由IOSC提供

sound( ); // 蜂鸣器发声2500Hz,尖叫

for (;;) {

// 延时一段时间,此时Timer模块的时钟由PLL提供

// 进入深度睡眠,等待按键唤醒,PLL被禁止,Timer模块的时钟改由IOSC/16提供 }

// GPIOD的中断服务函数 void GPIO_Port_D_ISR(void) {

ulStatus GPIOPinIntStatus(KEY_PORT, true); // 读取中断状态 GPIOPinIntClear(KEY_PORT, ulStatus); // 清除中断状态,重要

if (ulStatus & KEY_PIN) // 如果KEY中断状态有效 {

SysCtlDelay(10 * (TheSysClock / 3000)); // 延时,以消除按键抖动

while (GPIOPinRead(KEY_PORT, KEY_PIN) == 0);

// 等待按键抬起

unsigned long ulStatus;

SysCtlDeepSleep( );

// 蜂鸣器发声约150Hz,低沉

}

SysCtlDelay(2500 * (TheSysClock / 3000)); HWREGBITW(SYSCTL_DSLPCLKCFG, 0) = 1;

21

SysCtlDelay(10 * (TheSysClock / 3000)); // 延时,以消除松键抖动 } }

1.6 杂项功能

这是一组杂项功能的函数,包括延时、存储器大小、特定管脚是否存在、高速GPIO等。

函数SysCtlDelay( )提供一个产生一个固定长度延时的方法。它是用内嵌汇编语言的方式来编写的,可以在使用不同软件开发工具情况下而让程序的延时保持一致,具有较好的可移植性。以下是实现SysCtlDelay( )函数的汇编源代码,每个循环花费3个系统时钟周期:

SysCtlDelay

SUBS R0, #1 ; R0减1,R0实际上就是参数ulCount BNE SysCtlDelay ; 如果结果不为0则跳转到SysCtlDelay

BX

LR

; 子程序返回

函数SysCtlFlashSizeGet( )和SysCtlSRAMSizeGet( )用来获取当前芯片的Flash和SRAM存储器大小,返回的单位是byte(字节)。

函数SysCtlPinPresent( )用来确认非GPIO片内外设的特定功能管脚是否存在。

函数SysCtlGPIOAHBEnable( )和SysCtlGPIOAHBDisable( )用来管理GPIO高速访问总线的使用。

在2008年新推出的型号(LM3S3xxx/5xxx系列,以及部分LM3S1xxx/2xxx型号)里,新增了一项GPIO高速总线访问(GPIO peripheral for Access from the High speed Bus,AHB)的功能。在原来的型号里,访问一次外设需要花费2个系统时钟,在50MHz的主频下采用执行汇编指令的方法不断翻转GPIO,获得的方波频率最高为50MHz÷4=12.5MHz。而通过AHB,访问一次GPIO仅需花费1个系统时钟周期,此时通过汇编指令翻转GPIO获得的方波频率最高可达25MHz。

复位时GPIO高速总线访问功能是禁止的,可以通过调用函数SysCtlGPIOAHBEnable( )来使能。原来操作GPIO时,在相关函数里采用的GPIO端口基址是GPIO_PORTA_BASE、GPIO_PORTB_BASE等,在使能AHB功能后要相应地换成GPIO_PORTA_AHB_BASE、GPIO_PORTB_AHB_BASE等,才能正确地使用AHB功能。

表1.28 函数SysCtlDelay( )

功能 原型 参数 返回 示例

延时

void SysCtlDelay(unsigned long ulCount)

ulCount:延时周期计数值,延时长度=3×ulCount×系统时钟周期 无

SysCtlDelay(20); // 延时60个系统时钟周期 SysCtlDelay(150 * (SysCtlClockGet( ) / 3000));

// 延时150ms

表1.29 函数SysCtlFlashSizeGet( )

功能 原型

获取片内Flash的大小

unsigned long SysCtlFlashSizeGet(void)

22

参数 返回

Flash的大小,单位:字节

表1.30 函数SysCtlSRAMSizeGet( )

功能 原型 参数 返回

获取片内SRAM的大小

unsigned long SysCtlSRAMSizeGet(void) 无

SRAM的大小,单位:字节

表1.31 函数SysCtlPinPresent( )

功能 原型

确认非GPIO片内外设的特定功能管脚是否存在 tBoolean SysCtlPinPresent(unsigned long ulPin) ulPin:待断定的管脚,应当取下列值之一:

SYSCTL_PIN_PWM0 // PWM0 管脚 SYSCTL_PIN_PWM1 // PWM1 管脚 SYSCTL_PIN_PWM2 // PWM2 管脚 SYSCTL_PIN_PWM3 // PWM3 管脚 SYSCTL_PIN_PWM4 // PWM4 管脚 SYSCTL_PIN_PWM5 // PWM5 管脚 SYSCTL_PIN_PWM6 // PWM6 管脚 SYSCTL_PIN_PWM7 // PWM7 管脚

参数

SYSCTL_PIN_C0MINUS SYSCTL_PIN_C0PLUS

// C0- 管脚 // C0+ 管脚 // C1- 管脚 // C1+ 管脚 // C2- 管脚 // C2+ 管脚

SYSCTL_PIN_C0O // C0o 管脚

SYSCTL_PIN_C1MINUS SYSCTL_PIN_C1PLUS

SYSCTL_PIN_C1O // C1o 管脚

SYSCTL_PIN_C2MINUS SYSCTL_PIN_C2PLUS

SYSCTL_PIN_C2O // C2o 管脚 SYSCTL_PIN_MC_FAULT0 // MC0 Fault 管脚 SYSCTL_PIN_ADC0 // ADC0 管脚 SYSCTL_PIN_ADC1 // ADC1 管脚 SYSCTL_PIN_ADC2 // ADC2 管脚 SYSCTL_PIN_ADC3 // ADC3 管脚 SYSCTL_PIN_ADC4 // ADC4 管脚 SYSCTL_PIN_ADC5 // ADC5 管脚 SYSCTL_PIN_ADC6 // ADC6 管脚 SYSCTL_PIN_ADC7 // ADC7 管脚 SYSCTL_PIN_CCP0 // CCP0 管脚 SYSCTL_PIN_CCP1 // CCP1 管脚

23

SYSCTL_PIN_CCP2 // CCP2 管脚 SYSCTL_PIN_CCP3 // CCP3 管脚 SYSCTL_PIN_CCP4 // CCP4 管脚 SYSCTL_PIN_CCP5 // CCP5 管脚 SYSCTL_PIN_32KHZ // 32kHz 管脚

返回

如果要确认的外设管脚存在则返回true,否则返回false

表1.32 函数SysCtlGPIOAHBEnable( )

功能 原型

使能GPIO模块通过高速总线来访问

void SysCtlGPIOAHBEnable(unsigned long ulGPIOPeripheral) ulGPIOPeripheral:要使能的GPIO模块,应当取下列值之一:

SYSCTL_PERIPH_GPIOA // GPIO A (通用输入/输出端口A) SYSCTL_PERIPH_GPIOB // GPIO B (通用输入/输出端口B) SYSCTL_PERIPH_GPIOC // GPIO C (通用输入/输出端口C)

参数

SYSCTL_PERIPH_GPIOD // GPIO D (通用输入/输出端口D) SYSCTL_PERIPH_GPIOE // GPIO E (通用输入/输出端口E) SYSCTL_PERIPH_GPIOF // GPIO F (通用输入/输出端口F) SYSCTL_PERIPH_GPIOG // GPIO G (通用输入/输出端口G) SYSCTL_PERIPH_GPIOH // GPIO H (通用输入/输出端口H)

返回

表1.33 函数SysCtlGPIOAHBDisable( )

功能 原型 参数 返回

禁止GPIO模块通过高速总线来访问

void SysCtlGPIOAHBDisable(unsigned long ulGPIOPeripheral) ulGPIOPeripheral:要禁止的GPIO模块 无

1.7 中断操作

系统控制中断的操作是比较简单的,在早期的型号里,实际编程可能用到的中断源只有

PLL锁定中断和掉电复位中断,并且也不常用。因此这些中断控制函数一般不要使用。

表1.34 函数SysCtlIntRegister( )

功能 原型 参数 返回

注册一个系统控制中断的服务函数

void SysCtlIntRegister(void (*pfnHandler)(void)) pfnHandler:函数指针,指向中断产生时被调用函数 无

表1.35 函数SysCtlIntUnregister( )

功能 原型

注销系统控制中断的服务函数 void SysCtlIntUnregister(void)

24

参数 返回

无 无

表1.36 函数SysCtlIntEnable( )

功能 原型

使能指定的系统控制中断源

void SysCtlIntEnable(unsigned long ulInts)

ulInts:要使能的中断源,应当取下列值之一或者它们之间的任意“或运算”组合形式: SYSCTL_INT_PLL_LOCK // PLL锁定中断

SYSCTL_INT_CUR_LIMIT // 电流限制中断(不要用) SYSCTL_INT_IOSC_FAIL // 内部振荡器失效中断(不要用)

参数

SYSCTL_INT_MOSC_FAIL // 主振荡器失效中断(不要用) SYSCTL_INT_POR // 上电复位中断(不要用)

SYSCTL_INT_BOR

// 掉电复位中断

SYSCTL_INT_PLL_FAIL // PLL失效中断(不要用)

注:标明“不要用”的中断源在早期的型号里存在但不常用,而在后续的型号里已取消

返回

表1.37 函数SysCtlIntDisable( )

功能 原型 参数 返回

禁止指定的系统控制中断源

void SysCtlIntDisable(unsigned long ulInts) ulInts:要禁止的中断源 无

表1.38 函数SysCtlIntStatus( )

功能 原型 参数 返回

获取当前系统控制中断的状态

unsigned long SysCtlIntStatus(tBoolean bMasked)

bMasked:屏蔽标志,如果是true则返回屏蔽的中断状态,如果是false则返回原始的中断状态 原始的中断状态或允许反映到处理器中的中断状态,与表1.36当中参数ulInts的取值相同

表1.39 函数SysCtlIntClear( )

功能 原型 参数 返回

清除指定的系统控制中断源

void SysCtlIntClear(unsigned long ulInts)

ulInts:要清除的中断源,与表1.36当中参数ulInts的取值相同 无

1.8 时钟验证

下面几个函数可以提供对内部振荡器IOSC、主振荡器MOSC、锁相环PLL的时钟验证功能,但都不常用。

25

表1.40 函数SysCtlIOSCVerificationSet( )

功能 原型 参数 返回

配置内部振荡器验证定时器

void SysCtlIOSCVerificationSet(tBoolean bEnable)

bEnable:当内部振荡器验证定时器应当被使能时取值true 无

表1.41 函数SysCtlMOSCVerificationSet( )

功能 原型 参数 返回

配置主振荡器验证定时器

void SysCtlMOSCVerificationSet(tBoolean bEnable) bEnable:当主振荡器验证定时器应当被使能时取值true 无

表1.42 函数SysCtlPLLVerificationSet( )

功能 原型 参数 返回

配置PLL验证定时器

void SysCtlPLLVerificationSet(tBoolean bEnable) bEnable:当PLL验证定时器应该被使能时取值true 无

表1.43 函数SysCtlClkVerificationClear( )

功能 原型 参数 返回

清除时钟验证状态

void SysCtlClkVerificationClear(void) 无 无

26

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务