11040|20

53

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

Hanker TI M4 开发板开发应用教程第三章第二节:系统时钟设置 [复制链接]

 
第四章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 中查找源函数,详细了解寄存器分配和库函数的编写风格。各个模块的时钟控制将在以后结合例程讲解。

最新回复

求一份中文数据资料  详情 回复 发表于 2016-7-24 17:25
 
点赞 关注(4)

回复
举报

17

帖子

0

TA的资源

一粒金砂(中级)

推荐
 
乁year 发表于 2014-7-22 08:37
不是PLL就是200M么
这个是80M
但是好像不是400/2/2.5得来的?




PLL 是 400MHz. DIV400 這個 bit (RCC2 暫存器)可以控制除以 2 (寫入0)或不除以 2 (寫入1).

底下是直接操作暫存器, 80MHz, 給你參考 :

  • 設定 RCC2  -- USERCC2 (bit 31) : 寫入 1 , 也就是 0x8000.0000 .
  • 設定 RCC2  -- BYPASS2 (bit 11) : 寫入 1 , 也就是 0x0000.0800 .
  • 設定 RCC   -- XTAL (bit 10 ~ 6) : 寫入 0x15 (16MHZ) , , 也就是 0x0000.0540 . 0x15 等於 10101b, 依序放入 bit 10 ~ bit 6 為 101.0100.0000 就等於 0x540 .
  • 清除 RCC2  -- OSCSRC2 (bit 6 ~ 4) : 寫入 0x0 (選擇 main OSC). 也就是 ~0x0000.0070 .
  • 清除 RCC2  -- PWRDN2 (bit 13) : 寫入 0 (啟動 PLL). 也就是 ~0x0000.2000 .
  • 設定 RCC2  -- DIV400 (bit 30) : 寫入 1. 也就是 0x4000.0000 .
  • 設定 RCC2  -- SYSDIV2 (bit 28 ~ 22) : 寫入 n. 它會除以 n+1, 以 80MHZ 為例 , 寫入 4, 則 400MHZ/(4+1) = 80 MHZ .
  • 等待 PLL 穩定 , 讀取 SYSCTL_RIS_R 的 Bit 6, 如果是 1 就表示穩定了.
  • 清除 RCC2  -- BYPASS2 (bit 11) : 寫入 0. Enable 使用 PLL.

void PLL_Init(void){      SYSCTL_RCC2_R |=  0x80000000;    SYSCTL_RCC2_R |=  0x00000800;    SYSCTL_RCC_R = (SYSCTL_RCC_R &~0x000007C0) + 0x00000540;     SYSCTL_RCC2_R &= ~0x00000070;    SYSCTL_RCC2_R &= ~0x00002000;    SYSCTL_RCC2_R |= 0x40000000;   SYSCTL_RCC2_R = (SYSCTL_RCC2_R&~ 0x1FC00000) + (4<<22);     while((SYSCTL_RIS_R&0x00000040)==0){};     SYSCTL_RCC2_R &= ~0x00000800;}

点评

额 谢谢 都许久没看了 习惯性将400M/2记做了200M都忽略了过程 看来的引起重视了  详情 回复 发表于 2014-7-23 09:03
 
 

回复

169

帖子

1

TA的资源

纯净的硅(初级)

推荐
 

请问怎么配置才能跑到80MHz呢

请问怎么配置才能跑到80MHz呢?
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
沒錯的話應該是:
SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ)

400MHZ/2/2.5=80MHZ.

点评

不是PLL就是200M么 这个是80M 但是好像不是400/2/2.5得来的?  详情 回复 发表于 2014-7-22 08:37
请问我如果外部时钟输入为25MHz,那得到80MHz的系统频率怎么设置?  详情 回复 发表于 2014-7-15 11:38
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

4
 
好顶赞!
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

5
 
好顶赞
 
 
 

回复

705

帖子

0

TA的资源

纯净的硅(中级)

6
 
很详细,收藏学习之
 
 
 

回复

31

帖子

0

TA的资源

一粒金砂(中级)

7
 
Mikehuang822 发表于 2014-1-15 14:42
沒錯的話應該是:
SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ)
...

请问我如果外部时钟输入为25MHz,那得到80MHz的系统频率怎么设置?

点评

試試這個 : SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_25MHZ)  详情 回复 发表于 2014-7-22 00:46
 
 
 

回复

28

帖子

0

TA的资源

一粒金砂(中级)

8
 
赞一个呀
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

9
 
swh267 发表于 2014-7-15 11:38
请问我如果外部时钟输入为25MHz,那得到80MHz的系统频率怎么设置?

試試這個 :
SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_25MHZ)
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(中级)

10
 
Mikehuang822 发表于 2014-1-15 14:42
沒錯的話應該是:
SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ)
...

不是PLL就是200M么
这个是80M
但是好像不是400/2/2.5得来的?

点评

我的时钟用SysCtlClockGet,只有66.6M,这是神马情况呢?  详情 回复 发表于 2014-8-7 17:46
[attachimg]160229[/attachimg] PLL 是 400MHz. DIV400 這個 bit (RCC2 暫存器)可以控制除以 2 (寫入0)或不除以 2 (寫入1). 底下是直接操作暫存器, 80MHz, 給你參考 : [*]設定 RCC2 -- USERCC2 (bit  详情 回复 发表于 2014-7-22 22:42
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(中级)

12
 
Mikehuang822 发表于 2014-7-22 22:42
PLL 是 400MHz. DIV400 這個 bit (RCC2 暫存器)可以控制除以 2 (寫入0)或不除以 2 (寫入1).

底 ...


谢谢
都许久没看了
习惯性将400M/2记做了200M都忽略了过程
看来的引起重视了
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

13
 
赞一个!!!!
 
 
 

回复

67

帖子

2

TA的资源

一粒金砂(中级)

14
 
怒赞!!!!!!!!!!!!!
 
 
 

回复

32

帖子

1

TA的资源

一粒金砂(中级)

15
 
乁year 发表于 2014-7-22 08:37
不是PLL就是200M么
这个是80M
但是好像不是400/2/2.5得来的?

我的时钟用SysCtlClockGet,只有66.6M,这是神马情况呢?

点评

我看了一下资料,貌似是库函数SysCtlClockGet()[/backcolor]的问题,在旧版本的数据手册中,DC1寄存器中MINSYSDIV的值为0x02时表示3分频66mhz,而在新版本的数据手册中做了修正,DC1寄存器中MINSYSDIV的值  详情 回复 发表于 2014-8-8 20:07
同问啊!!  详情 回复 发表于 2014-8-8 18:54
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

16
 
微末凡尘 发表于 2014-8-7 17:46
我的时钟用SysCtlClockGet,只有66.6M,这是神马情况呢?

同问啊!!
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

17
 
微末凡尘 发表于 2014-8-7 17:46
我的时钟用SysCtlClockGet,只有66.6M,这是神马情况呢?

       我看了一下资料,貌似是库函数SysCtlClockGet()的问题,在旧版本的数据手册中,DC1寄存器中MINSYSDIV的值为0x02时表示3分频66mhz,而在新版本的数据手册中做了修正,DC1寄存器中MINSYSDIV的值为0x02表示2.5分频80mhz。      
      

       而SysCtlClockGet()函数中有个判断是按照旧版手册本来写的,所以应该是函数的问题吧


      

点评

恩恩,谢谢,确实是这个问题……  详情 回复 发表于 2014-8-9 15:34
 
 
 

回复

32

帖子

1

TA的资源

一粒金砂(中级)

18
 
hongguifeng 发表于 2014-8-8 20:07
我看了一下资料,貌似是库函数SysCtlClockGet()的问题,在旧版本的数据手册中,DC1 ...

恩恩,谢谢,确实是这个问题……
 
 
 

回复

9

帖子

1

TA的资源

一粒金砂(中级)

19
 
好帖顶起
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

20
 
那我们在什么状态下设置怎么样的时钟速度最好?  
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表