刚开始学DSP,用的是28034芯片,目前只想输出一个PWM波,占空比50%,频率10k。是在公司产品的板子上调试的,我的想法是只要系统初始化,然后再配置一下EPwm1模块,就能输出。后来发现公司板子用的外部石英晶振,于是修改系统初始化的时候晶振源选择的函数,即将IntOsc1Sel();改为XtalOscSel();然后修改了PLL倍频系数,因为外部晶振用的20M,28034最高60M,把DSP28_PLLCR改为6,然后2分频就是60M。但是发现还是没有输出,请问是哪里有问题呢?
而且关于XtalOscSel()函数,系统默认的程序中有这两句SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 0;SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;我的问题是都使用外部晶振了,为什么还会用到内部晶振1呢,DSP中难道可以同时有两个晶振源么?那是不是还存在优先级的问题?
首先我不太确定系统有没有跑起来?如果是这个问题,请问应该如何确定系统跑起来了?
还有公司板子上还集成了其他电路(板子上还有一块28069,还有一块stm32的芯片),有没有可能是这块板子是一个整体,即使我上面的配置正确,也会有可能输出不了波形?如果是这个问题,那又应该怎么解决呢?
我的程序如下(删去注释了):
#include "DSP28x_Project.h"
void InitEPwm1Example(void)
void main(void)
{
void main(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
InitEPwm1Gpio();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
InitEPwm1Example();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
for(;;)
{
__asm(" NOP");
}
{
__asm(" NOP");
}
}
void InitEPwm1Gpio(void)
{
EALLOW;
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; // Disable pull-up on GPIO0 (EPWM1A)
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; // Disable pull-up on GPIO1 (EPWM1B)
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; // Disable pull-up on GPIO1 (EPWM1B)
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // Configure GPIO0 as EPWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // Configure GPIO1 as EPWM1B
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // Configure GPIO1 as EPWM1B
EDIS;
}
}
void XtalOscSel (void) {
EALLOW;
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 0;
DELAY_US(1000L);
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 1; // Turn off XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1; // Clock Watchdog off of INTOSC1
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1; // Leave INTOSC1 on
EDIS;
}
EALLOW;
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF = 0;
DELAY_US(1000L);
SysCtrlRegs.CLKCTL.bit.XCLKINOFF = 1; // Turn off XCLKIN
SysCtrlRegs.CLKCTL.bit.OSCCLKSRC2SEL = 0; // Switch to external clock
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 1; // Switch from INTOSC1 to INTOSC2/ext clk
SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1; // Clock Watchdog off of INTOSC1
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF = 1; // Turn off INTOSC2
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 1; // Leave INTOSC1 on
EDIS;
}