所谓PLL电路,就是锁相环电路(Phase-Locked Loop)。电路通过比较复杂的原理可以将低频信号进行倍频与分频处理。F28335的工作最高频率为150MHz,而一般在电路设计中,一般采用的晶振频率为30MHz。之所以不直接采用150MHz晶振,一方面是价格高昂,另一方面还要对电路做EMI处理。因此,为了让DSP能够工作在最高频率,需要对晶振信号频率进行5倍频处理。通常采用的方案是通过PLL电路先进行10倍频处理,再2分频处理。

通常用PLL来产生倍频,倍频有2、4、6、8、10这几个等级,那么我们要让CPU运行在150MHz,通常选用的倍频是10,这样通过PLL出来的VCOCLK的频率为300MHz,但是不能让300MHz直接进入CPU,而是要对其再进行分频,PLLSTS.DIVSEL设置为2分频,这样CLKIN就是150MHz,即系统的时钟频率为150MHz。

void InitPll(Uint16 val, Uint16 divsel)
{// Make sure the PLL is not running in limp modeif (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0){// Missing external clock has been detected// Replace this line with a call to an appropriate// SystemShutdown(); function.asm("        ESTOP0");}// DIVSEL MUST be 0 before PLLCR can be changed from// 0x0000. It is set to 0 by an external reset XRSn// This puts us in 1/4if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0){EALLOW;SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;EDIS;}// Change the PLLCRif (SysCtrlRegs.PLLCR.bit.DIV != val){EALLOW;// Before setting PLLCR turn off missing clock detect logicSysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;SysCtrlRegs.PLLCR.bit.DIV = val;EDIS;// Optional: Wait for PLL to lock.// During this time the CPU will switch to OSCCLK/2 until// the PLL is stable.  Once the PLL is stable the CPU will// switch to the new PLL value.//// This time-to-lock is monitored by a PLL lock counter.//// Code is not required to sit and wait for the PLL to lock.// However, if the code does anything that is timing critical,// and requires the correct clock be locked, then it is best to// wait until this switching has completed.// Wait for the PLL lock bit to be set.// The watchdog should be disabled before this loop, or fed within// the loop via ServiceDog().// Uncomment to disable the watchdogDisableDog();while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1){// Uncomment to service the watchdog// ServiceDog();}EALLOW;SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;EDIS;}// If switching to 1/2if((divsel == 1)||(divsel == 2)){EALLOW;SysCtrlRegs.PLLSTS.bit.DIVSEL = divsel;EDIS;}// If switching to 1/1// * First go to 1/2 and let the power settle//   The time required will depend on the system, this is only an example// * Then switch to 1/1if(divsel == 3){EALLOW;SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;DELAY_US(50L);SysCtrlRegs.PLLSTS.bit.DIVSEL = 3;EDIS;}
}

系统时钟是在InitSysCtrl();进行初始化的,进入这个函数,系统初始化函数默认不使用看门狗。

高速时钟和低速时钟的分频初始化设置是↓↓

SysCtrlRegs.HISPCP.all = 0x0001;
SysCtrlRegs.LOSPCP.all = 0x0002;

即高速时钟默认为系统时钟的二分频,低速时钟默认为系统时钟的四分频。

可以发现,高速外设时钟频率是对系统频率进行2分频,即为150/2=75MHz;同理,可以求得低速外设时钟频率为150/4=37.5MHz;

初始化高速和低速时钟之后,将外设的时钟进行使能,一般默认都是使能的。

void InitPeripheralClocks(void)//初始化外设时钟
{EALLOW;// HISPCP/LOSPCP prescale register settings, normally it will be set to default valuesSysCtrlRegs.HISPCP.all = 0x0001;SysCtrlRegs.LOSPCP.all = 0x0002;// XCLKOUT to SYSCLKOUT ratio.  By default XCLKOUT = 1/4 SYSCLKOUT// XTIMCLK = SYSCLKOUT/2XintfRegs.XINTCNF2.bit.XTIMCLK = 1;// XCLKOUT = XTIMCLK/2XintfRegs.XINTCNF2.bit.CLKMODE = 1;// Enable XCLKOUTXintfRegs.XINTCNF2.bit.CLKOFF = 0;// Peripheral clock enables set for the selected peripherals.
// If you are not using a peripheral leave the clock off
// to save on power.
//
// Note: not all peripherals are available on all 2833x derivates.
// Refer to the datasheet for your particular device.
//
// This function is not written to be an example of efficient code.SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    // ADC// *IMPORTANT*// The ADC_cal function, which  copies the ADC calibration values from TI reserved// OTP into the ADCREFSEL and ADCOFFTRIM registers, occurs automatically in the// Boot ROM. If the boot ROM code is bypassed during the debug process, the// following function MUST be called for the ADC to function according// to specification. The clocks to the ADC MUST be enabled before calling this// function.// See the device data manual and/or the ADC Reference// Manual for more information.ADC_cal();SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1;   // I2CSysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;   // SCI-ASysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1;   // SCI-BSysCtrlRegs.PCLKCR0.bit.SCICENCLK = 1;   // SCI-CSysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;   // SPI-ASysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 1; // McBSP-ASysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 1; // McBSP-BSysCtrlRegs.PCLKCR0.bit.ECANAENCLK=1;    // eCAN-ASysCtrlRegs.PCLKCR0.bit.ECANBENCLK=1;    // eCAN-BSysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;   // Disable TBCLK within the ePWMSysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;  // ePWM1SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;  // ePWM2SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1;  // ePWM3SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1;  // ePWM4SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1;  // ePWM5SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1;  // ePWM6SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;   // Enable TBCLK within the ePWMSysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 1;  // eCAP3SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 1;  // eCAP4SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 1;  // eCAP5SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 1;  // eCAP6SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1;  // eCAP1SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 1;  // eCAP2SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 1;  // eQEP1SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 1;  // eQEP2SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1;       // DMA ClockSysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;     // XTIMCLKSysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // GPIO input clockEDIS;
}

如果要对系统时钟频率进行修改,也就是InitPll函数,函数有两个参数:val和divsel,val是用来设置PLL的倍频系数,divsel是用来设置分频系数:

InitPll(DSP28_PLLCR,DSP28_DIVSEL);
----------
void InitPll(Uint16 val, Uint16 divsel)

所以将DSP_PLLCR传递给val,将DSP_DIVSEL传递给divsel。

按住Ctrl点击DSP_PLLCR,就可以发现DSP_PLLCR的值设置的是10:

#define DSP28_PLLCR  10//#define DSP28_PLLCR  9//#define DSP28_PLLCR  8//#define DSP28_PLLCR  7//#define DSP28_PLLCR  6//#define DSP28_PLLCR  5//#define DSP28_PLLCR  4//#define DSP28_PLLCR  3//#define DSP28_PLLCR  2//#define DSP28_PLLCR  1//#define DSP28_PLLCR  0 // PLL is bypassed in this mode

按住Ctrl点击DSP_DIVSEL,就可以发现DSP_DIVSEL的值设置的是2:

//#define DSP28_DIVSEL  0  // Enable /4 for SYSCLKOUT//#define DSP28_DIVSEL  1 // Disable /4 for SYSCKOUT#define DSP28_DIVSEL   2 // Enable /2 for SYSCLKOUT//#define DSP28_DIVSEL   3 // Enable /1 for SYSCLKOUT

即将晶振频率30MHz通过PLL倍频10倍后,再分频2倍,即系统时钟频率默认是150MHz。

所以使用Ti默认提供的系统初始化函数InitSysCtrl(),调用的c文件为DSP2833x_SysCtrl.c,初始化之后的频率是经过PLL10倍频后再分频2倍,得到系统时钟频率为150MHz。

修改系统时钟

如果要修改系统时钟,让其不再是150MHz,那么我们就需要修改DSP_PLLCR和DSP_DIVSEL的值,比如设置DSP_PLLCR=3,DSP_DIVSEL=2,即:

//#define DSP28_PLLCR  10//#define DSP28_PLLCR  9//#define DSP28_PLLCR  8//#define DSP28_PLLCR  7//#define DSP28_PLLCR  6//#define DSP28_PLLCR  5//#define DSP28_PLLCR  4#define DSP28_PLLCR  3//#define DSP28_PLLCR  2//#define DSP28_PLLCR  1
//#define DSP28_DIVSEL  0  // Enable /4 for SYSCLKOUT//#define DSP28_DIVSEL  1 // Disable /4 for SYSCKOUT#define DSP28_DIVSEL   2 // Enable /2 for SYSCLKOUT//#define DSP28_DIVSEL   3 // Enable /1 for SYSCLKOUT

即晶振频率为30MHz,经过3倍频,2分频,系统时钟频率此时为45MHz。

小技巧:将代码注释快捷键:Ctrl+/

外设时钟控制寄存器有三个PCLKCR0、PCLKCR1、PCLKCR3,三个寄存器控制的外设的时钟不一样,注意区分:

   SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1;   // I2CSysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;   // SCI-ASysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1;   // SCI-BSysCtrlRegs.PCLKCR0.bit.SCICENCLK = 1;   // SCI-CSysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;   // SPI-ASysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 1; // McBSP-ASysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 1; // McBSP-BSysCtrlRegs.PCLKCR0.bit.ECANAENCLK=1;    // eCAN-ASysCtrlRegs.PCLKCR0.bit.ECANBENCLK=1;    // eCAN-BSysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;   // Disable TBCLK within the ePWMSysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;  // ePWM1SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;  // ePWM2SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1;  // ePWM3SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1;  // ePWM4SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1;  // ePWM5SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1;  // ePWM6SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;   // Enable TBCLK within the ePWMSysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 1;  // eCAP3SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 1;  // eCAP4SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 1;  // eCAP5SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 1;  // eCAP6SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1;  // eCAP1SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 1;  // eCAP2SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 1;  // eQEP1SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 1;  // eQEP2SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1;       // DMA ClockSysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;     // XTIMCLKSysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // GPIO input clock

关于DSP系统时钟的一些理解相关推荐

  1. DSP学习笔记之系统时钟、定时器、GPIO篇

    \qquad写在前面,不管是C51.MSP430.32也好,DSP也好,总要有一个掌握的比较熟练,不能每次都复制粘贴别人的代码然后修修补补吧.不要再做Ctrl +C.Ctrl+V工程师.主要参考来自于 ...

  2. 寄存器(R0~R16)以及从SysTick系统时钟理解RTOS移植初始化

    移植系统最重要的细节之一就是配置系统时钟 第一次玩RT-Thread,发现同样的程序逻辑,测试现象不一样,从现象很明显看出来是时钟频率配置不一样. 由于之前玩STM32几乎没有关注过系统时钟的初始化, ...

  3. STM32—时钟树(结合系统时钟函数理解)

    时钟树的概念: 我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处.心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来 ...

  4. DSP系统开发工程师—高级培训班

    DSP系统开发工程师-高级培训班  >>> 课程目标 通过该培训班培训后,可从事DSP应用系统的软件开发.硬件开发以及DSP的算法设计等多方面工作.我们还会在培训中根据个人的特点,建 ...

  5. 【 FPGA 】FIR滤波器的采样速率与系统时钟速率不同时的资源消耗分析

    目录 MATLAB操作 Vivado操作 MATLAB操作 在matlab中命令窗口中输入:filterDesigner,设计如下参数的带通滤波器: 在左侧第三个功能设置:Set quantizati ...

  6. 【小梅哥SOPC学习笔记】系统时钟的使用

    给NIOS II CPU添加一颗澎湃的心--系统时钟的使用 本实验介绍如何在Qsys中添加一个定时器作为NIOS II的心跳定时器,并在NIOS II中软件编程使用该定时器. 将上一个实验watchd ...

  7. 系统时钟(汇编语言程序设计)

    系统时钟(汇编语言程序设计)-① 一直不知道该怎么描述S3C6410的PLL(锁相环),表示很难理解,我也算是瞎猫去碰"死耗子"吧. 我就去按照韦东山老师讲述的Clock去大概描述 ...

  8. 汇编实现时钟设置代码理解

    汇编实现时钟设置代码理解 下面的笔记是我在看<朱老师物联网大讲堂>(www.zhulaoshi.org)之后所做的笔记,只是大概根据自己看了视频与朱老师上课做的笔记而有的理解记录下来. 写 ...

  9. DSP之时钟与定时器之一时钟发生器

        时钟与定时器包括时钟产生器.通用定时器.实时时钟以及看门狗定时器等. 时钟产生器的功能是产生CPU的工作时钟,并提供CLKOUT时钟输出:通用定时器.实时时钟及看门狗定时器的功能是通过计数器为 ...

  10. DSP28377s系统时钟配置注意事项

    DSP28377s系统时钟配置注意事项 问题一脸嫣然的向我们走来... 近日,一个兄弟在配置基于28377s芯片的主控系统时钟时,遇到点困难. 具体是这样的,原来的主控板使用的是20MHz外部晶振,为 ...

最新文章

  1. 2018 中国AI人才大调查:14张图表解读他们来自何处,又将去往何方?
  2. Transformer变体为何无法应用于多种任务?谷歌:这些架构更改不能有效迁移
  3. Zabbix+shell监控报警任意web
  4. Py之gym:gym的简介、安装、使用方法之详细攻略
  5. CodeForces - 798D Mike and distribution(构造+思维/玄学随机数)
  6. count 和列不能一起查am_AM-RB 003 会不会让 Aston Martin 变成下一个法拉利?
  7. oracle的共享内存段,oracle共享内存段手工清理
  8. php框架 dirname,PHP目录函数basename()与dirname()
  9. python自学网站-自学Python网站推荐 从入门到精通
  10. 甘肃教师学苑2020文章代码_【重磅通知】甘肃省电化教育中心 关于聘任教育信息化研究员的通知...
  11. SLAM方向国内有哪些优秀的公司?
  12. 介绍一个很好的英语学习软件——单词风暴
  13. 摸索Detours 3:使用Detours 采用dll 方式进行Hook
  14. Echarts 2dMap阴影,多个map分层现象以及飞线飞机航线
  15. 彻底解决Chrome自动更新方案
  16. 科研狗citavi/mendeley+word使用技巧外加读论文瞎琢磨
  17. 达人评测 i511400h和i710875h哪个好
  18. linux切换ip地址脚本,批处理实现的ip地址切换的复杂脚本
  19. java判断车牌号正确性
  20. 震惊世界的25张照片

热门文章

  1. 战略分析师/商业分析师需要掌握的技能
  2. application octet stream java_java – JSP下载 – application / octet-stream
  3. go 运行代码遇到的问题(同一个包,不同包 之间的引用报错)
  4. Java中的数组注意点
  5. java 对接微信公众号(二)获取关注取关事件/用户回复消息
  6. Android qq 登录 界面 圆头像
  7. [zz] 导致你创业失败的18个错误 [2007-05-03]
  8. Blockchain Meets Edge Computing: A Distributed and Trusted Authentication System
  9. 壮游奇迹哪个服务器稳定,壮游奇迹MU官方选哪个区好呢?
  10. 拼音搜索 -- 自动解析拼音汉子组合(包含多音字,拼音缩写)