第四章Hanker TM4C123 外设应用
4.2 TM4C123 的系统时钟分析
4.21 原理分析:
今天我们来讨论下TM4C123 的系统时钟如何设置。大家需要了解的其实就是在什么状态下设置怎么样的时钟速度,保证我们系统能够正常工作。
ARM CORTEX M 系列核心要比51 单片机工作速度快的多。通过设置系统时钟,来确定核心的工作频率是我们在编程之前的首要问题。TM4C123 Cortex-M4 内核最高运行频率为80MHz,当然我们可以设置相应在不同频率下工作。首先我们看看下面的时钟结构图,看懂结构图是我们学习的第一步:
现在我一起来看看这个结构图,TM4C123 系列ARM 集成有两个内部振荡器,一个是16MHz 的高速精确振荡器OSC,一个是30KHz 低速振荡器INTOSC。
外部时钟主振荡器可以接外部晶振,TM4C123 有一个休眠模式时钟32.768KHZ的外部时钟源。在休眠备用电源管脚VBAT 正常供电的情况下,可以从冬眠专用的晶振管脚XOSC0 输入32.768KHz 的外部有源振荡信号。也就是说TM4C123 系列支持外接慢速时钟源。
另一个外部时钟可以外接石英晶体做为主时钟,也可以外接有源晶振做为时钟源。
精确的内部振荡器是片上时钟的时钟源。它不需要任何外部元件的使用,并提供在室温下的时钟是16MHz 的±1%,不同温度下的温度和±3% 。PIOSC 允许在更低的系统成本需要一个精确的时钟源的应用,就是说不需要外加晶振。如果需要主振荡器,软件必须使主振荡器复位后,允许主振荡器稳定之前改变时钟基准。如果休眠模块的时钟源是一个32.768kHz 的振荡器,那么其可以参考精确的内部振荡器时钟通过软件修剪提高精度。PIOSC 可以被配置为ADC 时钟源以及波特率时钟UART 和SSI 。
主振荡器提供一个频率精确的时钟源两个途径:外部单端时钟源连接到OSC0 输入引脚或OSC0 输入和OSC1 输出管脚之间连接一个外部晶体。如果PLL 正在使用,晶体的值必须是5 兆赫之间的支持频率为25 MHz(含)。如果PLL 不使用,晶体可能是支持频率4 MHz 至25 MHz 中的任何一个。通过指定的单端时钟源的范围控制微控制器的速度。请注意, MOSC 提供的USB PLL 的时钟源必须连接到一个晶体或振荡器。
4.22 硬件设计:
考虑到通用性,2 个外部时钟我们都外加晶体,如图所示:
分别外接16MHZ 和32.768KHZ 晶振
4.23 软件设计:
外设库函数设计说明:
系统时钟设置函数为:viod SysCtlClockSet( unsigned long ulConfig)
ulConfig:时钟配置字,应当取下列各组数值之间的“或运算”组合形式:
1.系统时钟分频值
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
2.使用OSC 还是PLL
SYSCTL_USE_PLL // 采用锁相环PLL 作为系统时钟源
SYSCTL_USE_OSC // 采用OSC(主振荡器或内部振荡器)作为系统时钟源
3.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
4.外接晶体频率
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 5.振荡源禁止
SYSCTL_INT_OSC_DIS // 禁止内部振荡器
SYSCTL_MAIN_OSC_DIS // 禁止主振荡器
5 振荡源禁止
SYSCTL_INT_OSC_DIS // 禁止内部振荡器
SYSCTL_MAIN_OSC_DIS // 禁止主振荡器
举个例子:采用16MHz 晶振4 分频作为系统时钟,设置如下:
SysCtlClockSet(SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ
|SYSCTL_SYSDIV_4);
设置系统工作时间在设计程序最开始就需要完成,大家如果想了解更多寄存器的信息,可以在KEIL 中查找源函数,详细了解寄存器分配和库函数的编写风格。各个模块的时钟控制将在以后结合例程讲解。