C6748_EMIF时钟配置
来源:互联网 发布:h2o 数据挖掘 编辑:程序博客网 时间:2024/05/21 09:15
创龙TL6748开发板中,EMIFA模块使用默认的PLL0_SYSCLK3时钟,使用AISgen for D800K008工具加载C6748配置文件C6748AISgen_456M_config(Configuration files,在TL_TMS6748/images文件夹下),由图可以看到DIV3等于4,注意这里的DIV3就是实际的分频值(x),而不是写入相应PLL寄存器的值(x-1)。
(Using the TMS320C6748C6746C6742 Bootloader (Rev. F)P15)
因此在设置CPU主频为456MHz的情况下,PLL0_SYSCLK1等于456MHz,PLL0_SYSCLK3应该等于PLL0_SYSCLK1/4(456MHz/4=114MHz),即114MHz。在默认情况下,EMIFA时钟输入来自PLL0_SYSCLK3(见下图),因此EMIFA模块时钟EMA_CLK应为114MHz,而不是程序代码所注释的91MHz。
// NAND模块时钟
#defineNAND_MODULE_CLK ((91u)*(1000u)*(1000u))
#defineNAND_MODULE_CLK_IN_MHZ (NAND_MODULE_CLK/1000000)
(手册P90)
上面说的是用BootLoader脚本工具AISgen for D800K008生成固件(.ais文件)中初始化代码(即启动代码,BootLoader) 情况下,使用创龙提供的配置文件EMIFA模块的时钟。这里稍微介绍一下AISgen for D800K008,这个小软件是基于Windows环境的工具,它可以对DSP的各个时钟模块如PLL0、PLL1、SDRAM时钟、DDR时钟以及PSC模块进行配置,生成一段初始化代码,并嵌入到CCS生成的.out文件中,最终转换生成.AIS格式文件(这个文件可以认为是启动代码,BootLoader,也叫boot镜像,boot image)。
(Using the TMS320C6748C6746C6742 Bootloader (Rev. F)P12)
AISgen问题
下面再看看仿真时,Gel文件对PLL初始化,EMIF模块时钟是多少。在创龙的Gel文件中,有以下代码段:
Set_Core_456MHz() {
device_PLL0(0,18,0,0,1,3,9);
GEL_TextOut("\tPLL0 init done for Core:456MHz, EMIFA:114MHz\n","Output",1,1,1);
}
由代码中的提示可以猜出EMIFA的输入时钟应该是114MHz,再看device_PLL0函数,代码如下:
Set_Core_456MHz() {
device_PLL0(unsignedint CLKMODE, unsignedint PLLM,unsignedint POSTDIV,unsignedint PLLDIV1, unsignedint PLLDIV2,unsignedint PLLDIV3,unsignedint PLLDIV7 ) {
unsignedint i=0;
/* Clear PLL lock bit */
CFGCHIP0&=~(0x00000010);
/* Set PLLENSRC '0',bit 5, PLL Enable(PLLEN) selection is controlled through MMR */
PLL0_PLLCTL&=~(0x00000020);
/* PLLCTL.EXTCLKSRC bit 9 should be left at 0 for Freon */
PLL0_PLLCTL&=~(0x00000200);
/* Set PLLEN=0 to put in bypass mode*/
PLL0_PLLCTL&=~(0x00000001);
/*wait for 4 cycles to allow PLLEN mux switches properly to bypass clock*/
for(i=0; i<PLLEN_MUX_SWITCH; i++) {;}
/* Select the Clock Mode bit 8 as External Clock or On Chip Oscilator*/
PLL0_PLLCTL&=0xFFFFFEFF;
PLL0_PLLCTL|= (CLKMODE <<8);
/*Clear PLLRST bit to reset the PLL */
PLL0_PLLCTL&=~(0x00000008);
/* Disable the PLL output*/
PLL0_PLLCTL|= (0x00000010);
/* PLL initialization sequence
Power up the PLL by setting PWRDN bit set to 0 */
PLL0_PLLCTL&=~(0x00000002);
/* Enable the PLL output*/
PLL0_PLLCTL&=~(0x00000010);
/*PLL stabilisation time- take out this step , not required here when PLL in bypassmode*/
for(i=0; i<PLL_STABILIZATION_TIME; i++) {;}
/*Program the required multiplier value in PLLM*/
PLL0_PLLM= PLLM;
/*If desired to scale all the SYSCLK frequencies of a given PLLC, program the POSTDIV ratio*/
PLL0_POSTDIV=0x8000| POSTDIV;
/*Check for the GOSTAT bit in PLLSTAT to clear to 0 to indicate that no GO operation is currently in progress*/
while(PLL0_PLLSTAT&0x1==1){}
/*Program the RATIO field in PLLDIVx with the desired divide factors. In addition, make sure in this step you leave the PLLDIVx.DxEN bits set so clocks are still enabled (default).*/
PLL0_PLLDIV1=0x8000| PLLDIV1;// Fixed Ratio /1
PLL0_PLLDIV2=0x8000| PLLDIV2;// Fixed Ratio /2
PLL0_PLLDIV4=0x8000| (((PLLDIV1+1)*4)-1);// Fixed Ratio /4
PLL0_PLLDIV6=0x8000| PLLDIV1;// Fixed Ratio /1
PLL0_PLLDIV3=0x8000| PLLDIV3;// Variable Ratio (EMIF)
PLL0_PLLDIV7=0x8000| PLLDIV7;// Variable Ratio (RMII)
/*Set the GOSET bit in PLLCMD to 1 to initiate a new divider transition.*/
PLL0_PLLCMD|=0x1;
/*Wait for the GOSTAT bit in PLLSTAT to clear to 0 (completion of phase alignment).*/
while(PLL0_PLLSTAT&0x1==1) { }
/*Wait for PLL to reset properly.*/
for(i=0; i<PLL_RESET_TIME_CNT; i++) {;}
/*Set the PLLRST bit in PLLCTL to 1 to bring the PLL out of reset*/
PLL0_PLLCTL|=0x8;
/*Wait for PLL to lock.*/
for(i=0; i<PLL_LOCK_TIME_CNT; i++) {;}
/*Set the PLLEN bit in PLLCTL to 1 to remove the PLL from bypass mode*/
PLL0_PLLCTL|=0x1;
}(0,18,0,0,1,3,9);
GEL_TextOut("\tPLL0 init done for Core:456MHz, EMIFA:114MHz\n","Output",1,1,1);
}
其中对PLL0各分频值设置如下:
/*Program the RATIO field in PLLDIVx with the desired divide factors. In addition, make sure in this step you leave the PLLDIVx.DxEN bits set so clocks are still enabled (default).*/
PLL0_PLLDIV1=0x8000| PLLDIV1;// Fixed Ratio /1
PLL0_PLLDIV2=0x8000| PLLDIV2;// Fixed Ratio /2
PLL0_PLLDIV4=0x8000| (((PLLDIV1+1)*4)-1);// Fixed Ratio /4
PLL0_PLLDIV6=0x8000| PLLDIV1;// Fixed Ratio /1
PLL0_PLLDIV3=0x8000| PLLDIV3;// Variable Ratio (EMIF)
PLL0_PLLDIV7=0x8000| PLLDIV7;// Variable Ratio (RMII)
PLLDIV3为参数变量,传入的参数为3,可以看出PLL0_PLLDIV3被设置为3|0x8000,即PLL0的PLLDIV3寄存器的RATIO位被设为3,则PLL0_SYSCLK3分频值应为4,即PLL0_SYSCLK1/4(456MHz/4=114MHz),故EMIFA输入时钟应为114MHz。
(指南P145)
使用PLL0的OBSCLK时钟输出功能,输出时钟源选择PLL0_SYSCLK3,OSCDIV选择为0x19即25(则实际分频数为26,则输出的PLL0 OBSCLK时钟应等于PLL0_SYSCLK3/26),如果PLL0_SYSCLK3为114MHz,则输出的PLL0 OBSCLK应为4.4MHz左右(114MHz/26=4.4MHz)。使用示波器观察输出,可看到图中所示:
由图所示,输出的OBSCLK时钟频率的确是4.4MHz左右(见CH1,黄色线),验证了EMIF的输入时钟PLL0_SYSCLK3的确是114MHz,而不是创龙代码所注释的91MHz。
(指南P148)
(指南P140)
(指南P130)
- C6748_EMIF时钟配置
- 时钟配置
- S3C2440的时钟配置
- lm3s时钟配置
- MSP430x2xx的时钟配置
- STM32定时器时钟配置
- C8051F340系统时钟配置
- win2003时钟服务配置
- linux时钟服务器配置
- stm32 时钟配置方式
- S5PC100 时钟配置
- s3c2440时钟配置
- S5PV210 时钟配置解析
- OK6410时钟配置
- STM8时钟配置
- MSP430F149基础时钟配置
- STM32时钟配置
- MSP430x2xx的时钟配置
- “黑科技”餐具,让洗碗变得so easy~ | 钛空舱双十二特惠
- 第50周收录98起融资,国内低靡,国外智能硬件火热 | 潜在周报
- java 发牌洗牌 重新排序
- 这批钛媒体90后已经瞎了、秃了、腰椎间盘突出了
- 深入浅出ES6(七):箭头函数 Arrow Functions
- C6748_EMIF时钟配置
- 解析Qt内省机制
- Pinyin4j的基本用法
- 欢迎使用CSDN-markdown编辑器
- UE4蓝图节点文档翻译【目录】--- Add Event/Game
- 【论文阅读笔记】RETAIN: An Interpretable Predictive Model for Healthcare using Reverse Time Attention Mechan
- Linux入门基础教程
- Mysql数据库的安装与配置(Windows系统)
- 富文本