打印

TI例子请教

[复制链接]
8743|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jlgcumt|  楼主 | 2011-3-26 08:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用F28335的simulator调试自带TI给的例子时,系统初始化里面有个ADC_cal(),怎么每次跑到里面就又跳到codestart那个地方了,一直出不来,小弟问一下这个函数是干嘛用的,我看了一下这个函数的代码没发现问题,怎么老跳到Codestart的地方,去掉这个函数可不可以呀

相关帖子

沙发
aresc| | 2011-3-27 09:03 | 只看该作者
没用过,不敢乱说,能不能把程序贴出来看看?

使用特权

评论回复
板凳
jlgcumt|  楼主 | 2011-3-27 15:42 | 只看该作者
这是汇编定义
.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
    MOVW  DP,   #ADCREFSEL_LOC >> 6
    MOV   @28,  #0xAAAA            ; actual value may not be 0xAAAA
    MOV   @29,  #0xBBBB             ; actual value may not be 0xBBBB
    LRETR
;eof ----------

使用特权

评论回复
地板
jlgcumt|  楼主 | 2011-3-27 15:44 | 只看该作者
这是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, 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;   // 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;
}

使用特权

评论回复
5
jlgcumt|  楼主 | 2011-3-27 15:45 | 只看该作者
跑到ADC_cal() 的时候会执行一些代码,然后又跳到cint00 那个地方了

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
李晓倩 + 1 藏獒新闻 www.zhaoao.cc/xinwen/
6
aresc| | 2011-3-27 19:45 | 只看该作者
这个函数就是设置0x711C和0x711D地址对应的那两个寄存器的,应该和你的硬件设置相匹配,TI的那个0xAAAA,0xBBBB只是个随便写的值(page 43 - spru812a.pdf).  这个函数的调用和DSP的BOOT模式有关(page 9 - DSP2833x-HeaderFiles_QuickStart_Readme.pdf).

但这个函数就4行指令,写两个寄存器就返回,怎么样也不至于返回到cint00那里. 不知道你说的跑到ADC_cal()的时候会执行一些代码是什么意思? 能不能单步看怎么跳到cint00那里?

你运行这个程序的时候有实际的评估板连上吗?

使用特权

评论回复
7
aresc| | 2011-3-27 22:36 | 只看该作者
那应该找到原因了,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确信能编进去,应该也没有问题.

使用特权

评论回复
8
jlgcumt|  楼主 | 2011-3-29 18:45 | 只看该作者
多谢LS,今天我拿板子试了一下,可以运行的。

使用特权

评论回复
9
黄jiajia| | 2011-3-29 20:49 | 只看该作者
:)

使用特权

评论回复
10
parezl| | 2011-3-29 21:36 | 只看该作者
谢谢8楼~~~

使用特权

评论回复
11
hong7817| | 2012-11-13 15:17 | 只看该作者
谢谢6楼的解答

使用特权

评论回复
12
NYBatnwpu| | 2014-3-8 20:07 | 只看该作者
我也纠结这个问题两天了,谢谢8楼啊~

使用特权

评论回复
13
稳稳的蜗牛| | 2015-2-13 13:51 | 只看该作者
aresc 发表于 2011-3-27 22:36
那应该找到原因了,ADC_cal这个函数是默认在ROM里的, 看下面的CMD:
   /* Allocate ADC_cal function (pre-p ...

就是这个问题,学习了

使用特权

评论回复
14
稳稳的蜗牛| | 2015-2-13 13:51 | 只看该作者
aresc 发表于 2011-3-27 22:36
那应该找到原因了,ADC_cal这个函数是默认在ROM里的, 看下面的CMD:
   /* Allocate ADC_cal function (pre-p ...

学习了

使用特权

评论回复
15
海中水| | 2015-2-13 14:29 | 只看该作者
aresc 发表于 2011-3-27 22:36
那应该找到原因了,ADC_cal这个函数是默认在ROM里的, 看下面的CMD:
   /* Allocate ADC_cal function (pre-p ...

厉害!理解的很到位,这个函数用来进行AD矫正,应该厂商固化在硬件里的。

使用特权

评论回复
16
blessdxp| | 2016-1-15 15:51 | 只看该作者
这两个系数怎样计算,谁有计算过,能否共享一下,现在我用的是内部的基准

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:善攻者,动于九天之上,善守者,藏于九地之下!

183

主题

733

帖子

4

粉丝