TI例子请教
我用F28335的simulator调试自带TI给的例子时,系统初始化里面有个ADC_cal(),怎么每次跑到里面就又跳到codestart那个地方了,一直出不来,小弟问一下这个函数是干嘛用的,我看了一下这个函数的代码没发现问题,怎么老跳到Codestart的地方,去掉这个函数可不可以呀 没用过,不敢乱说,能不能把程序贴出来看看? 这是汇编定义.def _ADC_cal
.asg "0x711C", ADCREFSEL_LOC
;-----------------------------------------------
; _ADC_cal
;-----------------------------------------------
;-----------------------------------------------
; This is the ADC cal routine.This routine is programmed into
; reserved memory by the factory. 0xAAAA and 0xBBBB are place-
; holders for calibration data.
;The actual values programmed by TI are device specific.
;
; This function assumes that the clocks have been
; enabled to the ADC module.
;-----------------------------------------------
.sect ".adc_cal"
_ADC_cal
MOVWDP, #ADCREFSEL_LOC >> 6
MOV @28,#0xAAAA ; actual value may not be 0xAAAA
MOV @29,#0xBBBB ; actual value may not be 0xBBBB
LRETR
;eof ---------- 这是main函数调用的系统初始化程序
void InitSysCtrl(void)
{
// Disable the watchdog
DisableDog();
// Initialize the PLL control: PLLCR and DIVSEL
// DSP28_PLLCR and DSP28_DIVSEL are defined in DSP2833x_Examples.h
InitPll(DSP28_PLLCR,DSP28_DIVSEL);
// Initialize the peripheral clocks
InitPeripheralClocks();
}
void InitPeripheralClocks(void)
{
EALLOW;
// HISPCP/LOSPCP prescale register settings, normally it will be set to default values
SysCtrlRegs.HISPCP.all = 0x0001;
SysCtrlRegs.LOSPCP.all = 0x0002;
// XCLKOUT to SYSCLKOUT ratio.By default XCLKOUT = 1/4 SYSCLKOUT
// XTIMCLK = SYSCLKOUT/2
XintfRegs.XINTCNF2.bit.XTIMCLK = 1;
// XCLKOUT = XTIMCLK/2
XintfRegs.XINTCNF2.bit.CLKMODE = 1;
// Enable XCLKOUT
XintfRegs.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, whichcopies 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; // I2C
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A
SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1; // SCI-B
SysCtrlRegs.PCLKCR0.bit.SCICENCLK = 1; // SCI-C
SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1; // SPI-A
SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 1; // McBSP-A
SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 1; // McBSP-B
SysCtrlRegs.PCLKCR0.bit.ECANAENCLK=1; // eCAN-A
SysCtrlRegs.PCLKCR0.bit.ECANBENCLK=1; // eCAN-B
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // Disable TBCLK within the ePWM
SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;// ePWM1
SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;// ePWM2
SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1;// ePWM3
SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1;// ePWM4
SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1;// ePWM5
SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1;// ePWM6
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Enable TBCLK within the ePWM
SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 1;// eCAP3
SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 1;// eCAP4
SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 1;// eCAP5
SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 1;// eCAP6
SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1;// eCAP1
SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 1;// eCAP2
SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 1;// eQEP1
SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 1;// eQEP2
SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1
SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2
SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1; // DMA Clock
SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1; // XTIMCLK
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // GPIO input clock
EDIS;
} 跑到ADC_cal() 的时候会执行一些代码,然后又跳到cint00 那个地方了 这个函数就是设置0x711C和0x711D地址对应的那两个寄存器的,应该和你的硬件设置相匹配,TI的那个0xAAAA,0xBBBB只是个随便写的值(page 43 - spru812a.pdf).这个函数的调用和DSP的BOOT模式有关(page 9 - DSP2833x-HeaderFiles_QuickStart_Readme.pdf).
但这个函数就4行指令,写两个寄存器就返回,怎么样也不至于返回到cint00那里. 不知道你说的跑到ADC_cal()的时候会执行一些代码是什么意思? 能不能单步看怎么跳到cint00那里?
你运行这个程序的时候有实际的评估板连上吗? 那应该找到原因了,ADC_cal这个函数是默认在ROM里的, 看下面的CMD:
/* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */
.adc_cal : load = ADC_CAL, PAGE = 0, TYPE = NOLOAD
ADC_CAL位于0x380080, 也就是你软仿的时候,调用这个函数,会去运行地址0x380080这个地址的程序,而实际上这个地方没有程序在那里, 可能执行了一下其他的随机指令导致堆栈出问题,从而回到了cint00.
如果你有实际的评估版,0x380080地址处应该就是TI出厂时已写好ADC_cal程序在那里.
1. 这些例子应该不能用来软件仿真的, 最好是有硬件连上仿真.
2. 或者你可以改一下CMD,把ADC_cal确信能编进去,应该也没有问题. 多谢LS,今天我拿板子试了一下,可以运行的。 :) 谢谢8楼~~~ 谢谢6楼的解答 我也纠结这个问题两天了,谢谢8楼啊~ aresc 发表于 2011-3-27 22:36
那应该找到原因了,ADC_cal这个函数是默认在ROM里的, 看下面的CMD:
/* Allocate ADC_cal function (pre-p ...
就是这个问题,学习了 aresc 发表于 2011-3-27 22:36
那应该找到原因了,ADC_cal这个函数是默认在ROM里的, 看下面的CMD:
/* Allocate ADC_cal function (pre-p ...
学习了 aresc 发表于 2011-3-27 22:36
那应该找到原因了,ADC_cal这个函数是默认在ROM里的, 看下面的CMD:
/* Allocate ADC_cal function (pre-p ...
厉害!理解的很到位,这个函数用来进行AD矫正,应该厂商固化在硬件里的。 这两个系数怎样计算,谁有计算过,能否共享一下,现在我用的是内部的基准
页:
[1]