首页 > 其他分享 >TM4C123G学习记录(1)--时钟

TM4C123G学习记录(1)--时钟

时间:2022-11-22 10:34:02浏览次数:80  
标签:pll SYSCTL clock -- SYSDIV TM4C123G 时钟 define


  • 为了准备电赛临时学一下TM4C123G,简单记录学习内容
  • 大家可以在​​这里​​下载我收集的资源,非常全面,花了很大功夫收集来的,还有书籍、例程代码等
  • 还可以在TI官网下载相关文档​​TI官网​

一、基础时钟源

TM4C123内部共有4个时钟源,见下表

时钟

简介

内部高精度振荡器(PIOSC)

内部振荡器,其频率为16MHz,精度为1%,可以用来驱动PLL

主振荡器 (MOSC)

外部高速振荡器,频率可在4-25M间选择,可以驱动PLL(此时频率在5-25M)

低频内部振荡器 (LFIOSC)

适用于深度睡眠省电模式,它的频率是会改变的,范围在10KHz-90KHz之间,标准值30KHz

休眠模块时钟源

32.768KHz晶振,用于实时时钟源或睡眠时钟

TM4C123G学习记录(1)--时钟_延时函数


TM4C123G学习记录(1)--时钟_延时函数_02

TM4C123G学习记录(1)--时钟_系统时钟_03


TM4C123G学习记录(1)--时钟_#define_04

TM4C123G学习记录(1)--时钟_系统时钟_05

二、时钟树

TM4C123的时钟树如下

TM4C123G学习记录(1)--时钟_延时函数_06


从时钟树上可以看到4个时钟源和各模块时钟的连接情况,注意

  1. MOSC和PIOSC可以用来驱动PLL
  2. PLL输出锁定在400MHz,它可以在经过二分频和SYSDIV分频(这个可以程序配置)后提供系统时钟。注意TM4C123G的最大主频为80MHz,因此配置时钟的时候,若使用的PLL,最小分频数只能是2.5分频

三、时钟配置

1、库函数

使用函数 ​​void SysCtlClockSet(uint32_t ui32Config);​​​ 进行系统时钟设置
这个函数参数是4个部分做按位与,包括

  1. 时钟分频SYSDIV设置
#define SYSCTL_SYSDIV_1         0x07800000  // Processor clock is osc/pll /1
#define SYSCTL_SYSDIV_2 0x00C00000 // Processor clock is osc/pll /2
...
#define SYSCTL_SYSDIV_62 0x9EC00000 // Processor clock is osc/pll /62
#define SYSCTL_SYSDIV_63 0x9F400000 // Processor clock is osc/pll /63
#define SYSCTL_SYSDIV_64 0x9FC00000 // Processor clock is osc/pll /64
#define SYSCTL_SYSDIV_2_5 0xC1000000 // Processor clock is pll / 2.5
#define SYSCTL_SYSDIV_3_5 0xC1800000 // Processor clock is pll / 3.5
#define SYSCTL_SYSDIV_4_5 0xC2000000 // Processor clock is pll / 4.5
...
#define SYSCTL_SYSDIV_61_5 0xDE800000 // Processor clock is pll / 61.5
#define SYSCTL_SYSDIV_62_5 0xDF000000 // Processor clock is pll / 62.5
#define SYSCTL_SYSDIV_63_5 0xDF800000 // Processor clock is pll / 63.
  1. 系统时钟来源(直接用振荡器,还是用PLL倍频过的)
#define SYSCTL_USE_PLL          0x00000000  // System clock is the PLL clock
#define SYSCTL_USE_OSC 0x00003800 // System clock is the osc clock
  1. 时钟源选择(对应上面的表2.4)
#define SYSCTL_OSC_MAIN         0x00000000  // Osc source is main osc
#define SYSCTL_OSC_INT 0x00000010 // Osc source is int. osc
#define SYSCTL_OSC_INT4 0x00000020 // Osc source is int. osc /4
#define SYSCTL_OSC_INT30 0x00000030 // Osc source is int. 30 KHz
#define SYSCTL_OSC_EXT32 0x80000038 // Osc source is ext. 32 KHz
  1. 外接晶体频率
#define SYSCTL_XTAL_1MHZ        0x00000000  // External crystal is 1MHz
#define SYSCTL_XTAL_1_84MHZ 0x00000040 // External crystal is 1.8432MHz
#define SYSCTL_XTAL_2MHZ 0x00000080 // External crystal is 2MHz
#define SYSCTL_XTAL_2_45MHZ 0x000000C0 // External crystal is 2.4576MHz
#define SYSCTL_XTAL_3_57MHZ 0x00000100 // External crystal is 3.579545MHz
...
#define SYSCTL_XTAL_24MHZ 0x00000640 // External crystal is 24.0 MHz
#define SYSCTL_XTAL_25MHZ 0x00000680 // External crystal is 25.0 MHz

2、配置示例

/* MOSC频率16M,SYSDIV5分频,系统时钟源自PLL锁相环倍频,时钟源使用MOSC */
/* 系统时钟频率400M/2/5=40M */
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_XTAL_16MHZ|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN);

/* MOSC频率16M,SYSDIV2.5分频,系统时钟源自PLL锁相环倍频,时钟源使用MOSC */
/* 系统时钟频率400M/2/2.5=80M , 注意这是上限了*/
SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);

/* MOSC频率16M,SYSDIV不分频,系统时钟来自时钟源,时钟源使用MOSC */
/* 系统时钟频率16M/1=16M */
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);

四、延时函数

1、库函数

TM4C库提供了一个延时函数,它利用汇编,提供了跨越工具链时恒定的延迟。延时3*ui32Count个时钟周期

__asm void SysCtlDelay(uint32_t ui32Count)

但若系统时钟频率不同,一个时钟周期的长度也不同,一旦改了系统时钟频率,延时就会变化,如何改进?

2、改进的延时函数

(1)利用以下函数获取系统时钟频率(单位Hz)

uint32_t SysCtlClockGet(void)

(2)改进延时函数

  • 假设系统时钟频率为nHz,即(n/1000)KHz,设cnt=(n/1000),每秒有1000cnt个周期,每个cnt长1ms。
    SysCtlDelay(Count)可以延时3
    Count个周期,令Count=cnt/3,即可延时1个cnt长(即1ms)
//延时n毫秒,不用考虑时钟频率
#define delay_ms(n); SysCtlDelay(n*(SysCtlClockGet()/3000));

但是要注意:

  • 不管用哪个时钟源,只要工作频率高于40MHz,就会导致实际延时时间大于设置值。原因好像是芯片内部Flash的读取频率最大只能达到40M,
  • 当工作频率大于40MHz时,通过预取两个字的指令来达到80M的运行主频。但是,当遇到SysCtlDelay函数这种短跳转时这个特性并不能很好的工作,每次都需要读取指令,所以时间就延长了
  • 也就是说如果主频大于40M,SysCtlDelay(n*(SysCtlClockGet()/3000))这个方法也不是很准,可以考虑用ROM_SysCtlDelasy()


标签:pll,SYSCTL,clock,--,SYSDIV,TM4C123G,时钟,define
From: https://blog.51cto.com/u_15887260/5876714

相关文章

  • MD5,SHA1,SHA256等 哈希散列工具类
    MD5,SHA1,SHA256等哈希散列工具类packagecom.wbc.utils;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;/***MD5,SHA1,SH......
  • 论文理解【IL - BC】—— An autonomous land vehicle in a neural network
    标题:Anautonomouslandvehicleinaneuralnetwork发表:AdvancesinNeuralInformationProcessingSystems,1989(NIPS对应的期刊)文章链接:这篇文章1989年的,上古文章了属......
  • 用 python 和 java 实现线性代数计算(1)—— 矩阵基本操作
    参考:《机器学习算法框架实战:Java和Python实现》python实现主要是调用NumPy库做的;java实现基本没有调库文章目录​​1.说明​​​​1.1程序组织​​​​1.2数据结构​​......
  • 泛型
    在定义时不指定具体的类型,在使用时才指定具体的类型。一.泛型类1-1基本使用在类上使用类型参数时,用尖括号括住,放在类名后面,如果有多个类型参数,则使用逗号隔开。然后在使......
  • 微星电脑安装win10+ubuntu16.04双系统遇到的各种坑
    最近尝试在微星电脑安装ubuntu,遇到各种问题,在此记录一下已有win10,安装ubuntu16.04LTS版本微星ge73RaiderRGB8RF显卡:GTX1070硬盘:1T机械+256固态+13g固态,使用intel的RST技......
  • 渝北巴南游戏网站高防物理机租用
    2、针对谷歌做SEO,香港免备案服务器极具地理优势,因为google中国即在香港,具有先天优势;3、弹性付费,同等性能价格更低;4、从硬件级别上实现故障和安全性的隔离,平台内置ARP......
  • Jensen 不等式
    参考:《数值最优化方法》——高立​​Jensen不等式初步理解及证明​​​​Jensen不等式讲解与证明​​文章目录​​1.凸集与凸函数​​​​1.1凸集​​​​1.2凸函数......
  • 论文翻译 —— Adversarial Imitation Learning with Trajectorial Augmentation and
    文章目录​​I.INTRODUCTION​​​​II.RELATEDWORK​​​​III.PROPOSEDMETHOD​​​​III.A.FrameworkOverview​​​​III.B.CorrectedAugmentationforTrajec......
  • 多元函数泰勒展开与黑塞矩阵
    文章目录​​1.引入:函数展开​​​​2.泰勒展开​​​​2.1一元函数泰勒展开​​​​2.2二元函数泰勒展开​​​​2.3n元函数泰勒展开​​​​3.黑塞矩阵(海森矩阵)​​......
  • 线性代数拾遗(1)—— 行列式的三种公理化构造
    在前文​​线性代数(1)——行列式​​中,我们已经对行列式有了比较直观的理解。行列式最初用于表示线性方程组的系数,其值可以用于判别齐次线性方程组的解情况,也可以用于......