2011年1月11日星期二

GPIO用做输入的问题

今天在使用TMS320F28035这款MCU的时候,出现了一个问题:
被用做输入的端口无法真实反映出外部的高低电平状态。

排除了外部的因素后,发现GPIO用做输入的时候,MCU内部的上拉电路仍然在起作用,并且影响着输入信号的电平状态。

解决方法:

由于GPIO端口(除了可以用作ePWM的端口)默认开启了内部上拉功能,因此:

用做输入端口时一定要关闭对应管脚内部的上拉功能

涉及到的寄存器为:GPAPUD / GPBPUD

2011年1月5日星期三

28035之时钟选择

TMS320F28035这款DSP(现在应该是MCU了)具有2个片内时钟振荡器,同时具有1个晶振输入和1个外部时钟输入。

INTOSC1:片内时钟振荡器1(10MHz),可以为看门狗、系统内核、CPU定时器2提供时钟基准。

INTOSC2:片内时钟振荡器2(10MHz),可以为看门狗、系统内核、CPU定时器2提供时钟基准。

Crystal / Resonator:采用外部晶振作为时钟基准(XTAL),硬件上连接在X1 / X2脚。

External Clock Source:外部时钟源(XCLK – GPIO19 / GPIO38),如果没有使用外部晶振,那么可以使用一个外部的时钟源接入到XCLKIN管脚上,提供时钟基准。

默认情况下,系统内核时钟是由INTOSC1提供的,经过实际使用下来,片内的INTOSC1INTOSC2并不是很精确,并且受温度影响较大。如果使用外部晶振,应该如何切换呢?

1. 启用编辑受保护的寄存器;

EALLOW;


2. 将CLKCTL[XTALOSCOFF]设置为0,启用外部晶振;并将CLKCTL[XCLKINOFF]设置为1,禁用外部时钟输入;
参考操作:

SysCtrlRegs.CLKCTL.all = 0x2400;


3. 将CLKCTL[OSCCLKSRCSEL] 设置为1,使用外部晶振作为系统时钟源;此时,系统时钟无分频和倍频,需要重新设置PLLCR;
参考操作:

SysCtrlRegs.CLKCTL.all = 0x2401;


4. 重新设置PLLCR,并等待设置完毕;
参考操作:
if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 1)
{
    SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;
    SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;
    SysCtrlRegs.PLLCR.bit.DIV = 0x000C;
    while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1)
    {
        SysCtrlRegs.WDKEY = 0x0055;
        SysCtrlRegs.WDKEY = 0x00AA;
    }
    SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;
    DelayUs(20/2);
    SysCtrlRegs.PLLSTS.bit.DIVSEL = 0x2;
}
else
{
    asm(" ESTOP0");
}

5. 关闭内部晶振INTOSC1;
参考操作:

SysCtrlRegs.CLKCTL.all = 0x2501;

6. 禁止编辑受保护的寄存器;

EDIS;


这样DSP可以工作在一个相对稳定和精确地时钟基准下。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
参考文档:
P43 - TMS320x2803x Piccolo System Control and Interrupts Reference Guide (Rev. B)
From Ti.com