刚开始学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;
}
Green Deng:你好,没有看到你传上来的程序中有SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 0这个语句,但是程序中SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 1;就表示看门狗使用外部时钟源。
可以在官方的GPIO翻转例程上修改,通过观察GPIO口的电平变化来判断是否运行。例程位置:
C:\ti\controlSUITE\device_support\f2803x\v130\DSP2803x_examples_ccsv5\gpio_toggle
刚开始学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;
}
Serenity_pjb:
回复 Green Deng:
我传上来的是我修改过的,系统默认的XtalOscSel (void)这个函数中就是SysCtrlRegs.CLKCTL.bit.WDCLKSRCSEL = 0; SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;那么按照你说的意思就是这里就是看门狗使用内部晶振1产生的时钟,而其他部分用的是外部晶振产生的时钟,对么?我在原提问中有提到过,DSP系统是可以同时使用外部时钟和内部时钟的么?请解答一下这个问题,谢谢。
还有我的问题已经解决了,是我原提问的一个猜想,因为这个板子是公司做好的系统板子,pwm输出是经过锁存器的,要在程序中加入使能锁存器的语句,才可以在锁存器输出端看到pwm波,其实昨天要是在锁存器输入侧看波形应该是能看到波形的。
谢谢您的解答。祝好!
刚开始学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;
}
Serenity_pjb:
回复 Green Deng:
谢谢解答。