This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28027:TMS320f28027

Guru**** 2044370 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/983255/tms320f28027-tms320f28027

器件型号:TMS320F28027

您好!

我在其中一个应用中将跳闸区域用于 PWM。

下面是我用于配置 PWM 的代码。

GPIO_PWMconfig (空)

//使用 GPIO12作为 TZ1引脚
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;//启用 GPIO12上的上拉电阻(TZ1)
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 3;//异步输入 GPIO12 (TZ1)
GpioCtrlRegs.GPAMUX1.bit.GPIO12=1;//将 GPIO12配置为 TZ1

//使用 GPIO_0作为 PWM 的配置
GPIO_setPullUp (GpioHandle、GPIO_Number_0、GPIO_PULLUP_Enable);
GPIO_setMode (GpioHandle、GPIO_Number_0、GPIO_0_Mode_EPWM1A);


EALLOW;
EPwm1Regs.TZSEL.bit.CBC1 = 1;
//EPwm1Regs.TZSEL.bit.CBC2 = 1;

EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
//EPwm1Regs.TZCTL.bit.TSB = TZ_FORCE_LO;

//
//启用 TZ 中断
//
EPwm1Regs.TZEINT.BIT.CBC = 1;
EDIS;

EALLOW;
SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;// EPWM1
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;//在 ePWM 内启用 TBCLK


EPwm1Regs.TBPRD = 6000;//设置定时器周期
EPwm1Regs.TBPHS.Half.TBPHS = 0x0000;//相位为0
EPwm1Regs.TBCTR = 0x0000;//清除计数器

//
//设置 TBCLK
//
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4;//时钟与 SYSCLKOUT 的比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV4;//慢、只在示波器上观察

//
//设置比较
//
EPwm1Regs.CMPA.half.CMPA = 0;

//
//设置操作
//
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//将 PWM2A 设置为零
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;

EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;//将 PWM2A 设置为零
EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;

SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;//在 ePWM 内启用 TBCLK

EDIS;

PI_enableInt (PieHandle、PI_GroupNumber_2、PI_InterruptSource_TZ1);

PIE_enablePwmTzInt (PieHandle、PWM_NUMBER_1);

PI_registerPieIntHandler (PieHandle、PI_GroupNumber_2、PI_SubGroupNumber_1、
(intvec_t) epwm1_tzint_isr);

CPU_enableInt (CpuHandle、CPU_IntNumber_2);
PieCtrlRegs.PIEIER2.bit.INTx1 = 1;

/*这将启用 PWM */
void EnablePwm (void)

EPwm1Regs.AQCSFRC.bit.CSFA = 0;//禁用强制为低电平

/*这用于禁用 PWM */
void DisablePwm (void)

EPwm1Regs.AQCSFRC.bit.CSFA = 1;//使能强制为低电平

_interrupt void epwm1_tzint_ISR (void)

//
//清除标志-我们将继续获取该中断,直到 TZ
//引脚变为高电平
//

EPwm1Regs.TZCLR.bit.CBC = 1;
EPwm1Regs.TZCLR.bit.INT = 1;

//
//确认此中断以接收来自组2的更多中断
//
PieCtrlRegs.PIEACX.ALL = PIEACK_group2;

这与 C2000文件夹中的示例代码非常相似。

此代码与示例代码一起工作非常随意。

当我将其与集成时、我发现它不起作用。

为了供参考、我已经为控制器附加了内存分配、我已经完成了。

存储器

第0页:/*程序内存*/
/*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/

PRAML0:origin = 0x008000,length = 0x000800 //片上 RAM 块 L0 */
OTP:origin = 0x3D7800,length = 0x000400 //片上 OTP */
闪存:origin = 0x3F0000,length = 0x007F80 //片上闪存*/
csm_RSVD:origin = 0x3F7F80,length = 0x000076 // FLASHA 的一部分。 当 CSM 正在使用时、使用所有0x0000进行编程。 *
begin:origin = 0x3F7FF6,length = 0x000002/* FLASHA 的一部分。 用于"引导至闪存"引导加载程序模式。 *
CSM_PWL_P0:origin = 0x3F7FF8,length = 0x000008 // FLASHA 的一部分。 FLASHA 中的 CSM 密码位置*/

IQTABLES:origin = 0x3FE000,length = 0x000B50 //引导 ROM 中的 IQMath 表*/
IQTABLES2:origin = 0x3FEB50,length = 0x00008C //引导 ROM 中的 IQMath 表*
IQTABLES3:origin = 0x3FEBDC,length = 0x0000AA /*引导 ROM 中的 IQMath 表*/

ROM:origin = 0x3FF27C,length = 0x000D44 //引导 ROM */
复位:origin = 0x3FFFC0,length = 0x000002 //引导 ROM 的部分*/
向量:origin = 0x3FFFC2,length = 0x00003E //引导 ROM 的部分*/

第1页:/*数据存储器*/
/*内存(RAM/FLASK/OTP)块可被移动至 PAGE0以进行程序分配*/
/*寄存器保留在第1页中*/
BOOT_RSVD:origin = 0x000000,length = 0x000050 // M0的一部分,引导 ROM 将此用于栈*/
RAMM0:origin = 0x000050、length = 0x0003B0 //片上 RAM 块 M0 *
RAMM1:origin = 0x000400、length = 0x000400 //片上 RAM 块 M1 *
DRAML1:origin = 0x3F8000、length = 0x001000
DRAML0:origin = 0x008800,length = 0x000600

CNTL2P2ZRAM:origin = 0x008E00,length = 0x000060
CNTL2P2ZBUFF:origin = 0x008EC0、length = 0x000060
PWMDRVRAM:origin = 0x008F20,length = 0x000040
ADCDRVRAM:origin = 0x008F60,length = 0x000020
DataRAM:origin = 0x008F80,length = 0x000080

/*将段分配给内存块。
注:
DSP28_CodeStartBranch.asm 中用于重定向代码的 codestart 用户定义段
闪存时执行
ramfuncs 用户定义的段来存储将从闪存复制到 RAM 中的函数
*

部分

/*分配计划领域:*/
.cinit:> FLASH,page = 0
.pinit:> FLASH,PAGE = 0
.text:> FLASH、page = 0
codestart:> begin page = 0
ramfuncs:load = flash、
运行= PRAML0、
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
run_start (_RamfuncsRunStart)、
PAGE = 0

csmpasswds:>csm_PWL_P0 page = 0
csm_rsvd:>csm_RSVD page = 0

ISRvariables:>DataRAM page = 1.
ADCDRV_5ch_Section:>ADCDRVRAM PAGE = 1.
ZeroNet_Section:> DataRAM page = 1.

CNTL_2P2Z_Section:>CNTL2P2ZRAM PAGE = 1.
CNTL_2P2Z_InternalData:>CNTL2P2ZBUFF PAGE = 1.
CNTL_2P2Z_Coef => DataRAM PAGE = 1.
PWRCAL_Section:> DataRAM page = 1.
FDB_Section:> DataRAM page = 1.
FREQDRV_FBINV_Section:>PWMDRVRAM PAGE = 1.

/*分配未初始化的数据段:*/
.stack:>RAMM0 page = 1.
.ebss:> DRAML1 page = 1.
.esysmem:>DRAML0 page = 1.
.sysmem:>DRAML0 page = 1.
.cio:>> RAMM0 | RAMM1 | DRAML0 PAGE = 1.

/*初始化段进入闪存*/
/*要使 SDFlash 对这些内容进行编程、必须将它们分配到第0页*/
econst:>闪存页= 0
.switch:>闪存页= 0

/*分配 IQ 数学区域:*/
IQMath:>闪存页= 0 /*数学代码*/
IQmathTables :>IQTABLES,PAGE = 0,TYPE = NOLOAD

/*如果调用 IQNexp()或 IQexp(),请取消注释以下部分
库中的函数、以便利用
引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
1个等待状态)。 如果此部分未注释、则为 IQmathTables2
将被加载到其他存储器(SARAM、闪存等)中并将采用
上行空间、但0等待状态是可能的。
*
/*
IQmathTables2:> IQTABLES2,PAGE = 0,TYPE = NOLOAD

IQMath.lib (IQmathTablesRam)


*
/*如果调用 IQNasin ()或 IQasin (),请取消注释以下部分
库中的函数、以便利用
引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
1个等待状态)。 如果此部分未注释、则为 IQmathTables2
将被加载到其他存储器(SARAM、闪存等)中并将采用
上行空间、但0等待状态是可能的。
*
/*
IQmathTables3:> IQTABLES3,PAGE = 0,TYPE = NOLOAD

IQMath.lib (IQmathTablesRam)


*

/*.reset 是编译器使用的标准段。 它包含*/
/* C 代码_c_int00起始地址。 /*
/*当使用引导 ROM 时,此部分和 CPU 矢量*/
/*不需要表。 因此、默认类型设置为*/
/* DSECT */
.reset:> reset,page = 0,type = DSECT
VECTORS:> VECTORS PAGE = 0,TYPE = DSECT

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Kamal、

    [引用 user="Kamal Kant"]当我将其与集成时,我发现它不起作用。

    您能不能描述一下与之集成时发生的情况... 您看到输出了吗? 如果是、跳闸功能是否不工作、或者输出是否不是您期望的?

    当我获得有关您所看到的内容的更多信息后、我将能够更好地提供帮助。

    此致、

    Marlyn