2025年TivaC学习笔记

TivaC学习笔记一 基础时钟源 TM4C123 内部共有 4 个时钟源 见下表 时钟 简介 内部高精度振荡器 PIOSC 内部振荡器 其频率为 16MHz 精度为 1 可以用来驱动 PLL 主振荡器 MOSC 外部高速振荡器 频率可在 4 25M 间选择 可以驱动 PLL 此时频率在 5 25M

大家好,我是讯享网,很高兴认识大家。

一、基础时钟源

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

时钟 简介
内部高精度振荡器(PIOSC) 内部振荡器,其频率为16MHz,精度为1%,可以用来驱动PLL
主振荡器 (MOSC) 外部高速振荡器,频率可在4-25M间选择,可以驱动PLL(此时频率在5-25M)
低频内部振荡器 (LFIOSC) 适用于深度睡眠省电模式,它的频率是会改变的,范围在10KHz-90KHz之间,标准值30KHz
休眠模块时钟源 32.768KHz晶振,用于实时时钟源或睡眠时钟

在这里插入图片描述
讯享网
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

二、时钟树

TM4C123的时钟树如下
在这里插入图片描述
从时钟树上可以看到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 0x0 // 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 0x9F // Processor clock is osc/pll /63 #define SYSCTL_SYSDIV_64 0x9FC00000 // Processor clock is osc/pll /64 #define SYSCTL_SYSDIV_2_5 0xC // Processor clock is pll / 2.5 #define SYSCTL_SYSDIV_3_5 0xC // Processor clock is pll / 3.5 #define SYSCTL_SYSDIV_4_5 0xC // Processor clock is pll / 4.5 ... #define SYSCTL_SYSDIV_61_5 0xDE // Processor clock is pll / 61.5 #define SYSCTL_SYSDIV_62_5 0xDF000000 // Processor clock is pll / 62.5 #define SYSCTL_SYSDIV_63_5 0xDF // 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 12 
  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 0x // Osc source is ext. 32 KHz 12345 
  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.MHz ... #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); 1112 

四、延时函数

1、库函数

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

讯享网__asm void SysCtlDelay(uint32_t ui32Count) 1 

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

2、改进的延时函数

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

 uint32_t SysCtlClockGet(void) 1 

(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)); 12 

但是要注意:

  • 不管用哪个时钟源,只要工作频率高于40MHz,就会导致实际延时时间大于设置值。原因好像是芯片内部Flash的读取频率最大只能达到40M,
  • 当工作频率大于40MHz时,通过预取两个字的指令来达到80M的运行主频。但是,当遇到SysCtlDelay函数这种短跳转时这个特性并不能很好的工作,每次都需要读取指令,所以时间就延长了
  • 也就是说如果主频大于40M,SysCtlDelay(n*(SysCtlClockGet()/3000))这个方法也不是很准,可以考虑用ROM_SysCtlDelasy()
//延时函数定义不管用哪个时钟源,只要工作频率高于40MHz,就会导致实际延时时间大于设置值。原因好像是芯片内部Flash的读取频率最大只能达到40M, #define SYSTEM_CLOCK_80M SysCtlClockSet(SYSCTL_OSC_MAIN|SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ) //FLASH系统时钟低于40M的延时#define delay_ms(n) SysCtlDelay(n*(SysCtlClockGet()/3000)) #define delay_us(n) SysCtlDelay(n*(SysCtlClockGet()/3)) //ROM系统时钟高于80m用的延时 #define rom_delay_ms(n) ROM_SysCtlDelay(n*(SysCtlClockGet()/3000)) #define rom_delay_us(n) ROM_SysCtlDelay(n*(SysCtlClockGet()/3)) 
小讯
上一篇 2025-03-07 13:11
下一篇 2025-03-03 17:52

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/62199.html