elvike 发表于 2016-7-15 15:57 你怎么不参考官方的例程,ramfuncs不需要修改,直接用可以的。然后自己再定义一个跟ramfuncs类似的段名搬你 ...我没修改ramfuncs啊,我也是按例程做的,不知问题出在哪?
以下有问题吗?ENTRY POINT SYMBOL: "_c_int00" address: 003f67bf MEMORY CONFIGURATION name origin length used unused attr fill ---------------------- -------- --------- -------- -------- ---- -------- PAGE 0: PRAML0 00008000 00000800 0000001f 000007e1 RWIX OTP 003d7800 00000400 00000000 00000400 RWIX FLASHD 003f0000 00002000 00000000 00002000 RWIX FLASHC 003f2000 00002000 00000000 00002000 RWIX FLASHA 003f6000 00001f80 00000a22 0000155e RWIX CSM_RSVD 003f7f80 00000076 00000000 00000076 RWIX BEGIN 003f7ff6 00000002 00000002 00000000 RWIX CSM_PWL_P0 003f7ff8 00000008 00000000 00000008 RWIX IQTABLES 003fe000 00000b50 00000000 00000b50 RWIX IQTABLES2 003feb50 0000008c 00000000 0000008c RWIX IQTABLES3 003febdc 000000aa 00000000 000000aa RWIX ROM 003ff27c 00000d44 00000000 00000d44 RWIX RESET 003fffc0 00000002 00000000 00000002 RWIX VECTORS 003fffc2 0000003e 00000000 0000003e RWIX PAGE 1: BOOT_RSVD 00000000 00000050 00000000 00000050 RWIX RAMM0 00000050 000003b0 00000300 000000b0 RWIX RAMM1 00000400 00000400 00000000 00000400 RWIX DEV_EMU 00000880 00000105 00000004 00000101 RWIX SYS_PWR_CTL 00000985 00000003 00000003 00000000 RWIX FLASH_REGS 00000a80 00000060 00000008 00000058 RWIX CSM 00000ae0 00000010 00000010 00000000 RWIX ADC_RESULT 00000b00 00000020 00000020 00000000 RWIX CPU_TIMER0 00000c00 00000008 00000008 00000000 RWIX CPU_TIMER1 00000c08 00000008 00000008 00000000 RWIX CPU_TIMER2 00000c10 00000008 00000008 00000000 RWIX PIE_CTRL 00000ce0 00000020 0000001a 00000006 RWIX PIE_VECT 00000d00 00000100 00000100 00000000 RWIX COMP1 00006400 00000020 00000011 0000000f RWIX COMP2 00006420 00000020 00000011 0000000f RWIX EPWM1 00006800 00000040 00000040 00000000 RWIX EPWM2 00006840 00000040 00000040 00000000 RWIX EPWM3 00006880 00000040 00000040 00000000 RWIX EPWM4 000068c0 00000040 00000040 00000000 RWIX ECAP1 00006a00 00000020 00000020 00000000 RWIX GPIOCTRL 00006f80 00000040 00000040 00000000 RWIX GPIODAT 00006fc0 00000020 00000020 00000000 RWIX GPIOINT 00006fe0 00000020 0000000a 00000016 RWIX SYSTEM 00007010 00000020 0000001f 00000001 RWIX SPIA 00007040 00000010 00000010 00000000 RWIX SCIA 00007050 00000010 00000010 00000000 RWIX NMIINTRUPT 00007060 00000010 00000010 00000000 RWIX XINTRUPT 00007070 00000010 00000010 00000000 RWIX ADC 00007100 00000080 00000051 0000002f RWIX I2CA 00007900 00000040 00000022 0000001e RWIX DRAML0 00008800 00000800 00000058 000007a8 RWIX PARTID 003d7fff 00000001 00000001 00000000 RWIX FLASHB 003f4000 00002000 00000000 00002000 RWIX CSM_PWL 003f7ff8 00000008 00000008 00000000 RWIX SECTION ALLOCATION MAP output attributes/ section page origin length input sections -------- ---- ---------- ---------- ---------------- .pinit 0 003f6000 00000000 UNINITIALIZED .econst 0 003f6000 00000100 003f6000 00000100 F2802x_PieVect.obj (.econst) ramfuncs 0 003f6100 0000001f RUN ADDR = 00008000 003f6100 0000001b F2802x_SysCtrl.obj (ramfuncs) 003f611b 00000004 F2802x_usDelay.obj (ramfuncs) .text 0 003f611f 000008b8 003f611f 00000205 F2802x_Adc.obj (.text) 003f6324 00000131 F2802x_DefaultIsr.obj (.text:retain) 003f6455 0000011c F2802x_SysCtrl.obj (.text) 003f6571 00000095 F2802x_OscComp.obj (.text) 003f6606 00000081 F2802x_EPwm.obj (.text) 003f6687 00000075 F2802x_CpuTimers.obj (.text) 003f66fc 00000069 main.obj (.text) 003f6765 0000005a rts2800_ml.lib : fs_mpy.obj (.text) 003f67bf 00000044 : boot.obj (.text) 003f6803 00000036 F2802x_TempSensorConv.obj (.text) 003f6839 0000002d main.obj (.text:retain) 003f6866 0000002c F2802x_Comp.obj (.text) 003f6892 0000002a F2802x_Spi.obj (.text) 003f68bc 00000029 rts2800_ml.lib : fs_tol.obj (.text) 003f68e5 00000028 F2802x_PieCtrl.obj (.text) 003f690d 00000027 F2802x_PieVect.obj (.text) 003f6934 0000001a F2802x_Sci.obj (.text) 003f694e 00000019 F2802x_I2C.obj (.text) 003f6967 00000019 rts2800_ml.lib : args_main.obj (.text) 003f6980 00000019 : exit.obj (.text) 003f6999 00000013 F2802x_Gpio.obj (.text) 003f69ac 00000010 F2802x_ECap.obj (.text) 003f69bc 00000009 rts2800_ml.lib : _lock.obj (.text) 003f69c5 00000008 F2802x_CodeStartBranch.obj (.text) 003f69cd 00000007 F2802x_DisInt.obj (.text) 003f69d4 00000003 F2802x_DBGIER.obj (.text) .cinit 0 003f69d7 0000004b 003f69d7 00000035 main.obj (.cinit) 003f6a0c 0000000a rts2800_ml.lib : _lock.obj (.cinit) 003f6a16 0000000a : exit.obj (.cinit) 003f6a20 00000002 --HOLE-- [fill = 0] codestart * 0 003f7ff6 00000002 003f7ff6 00000002 F2802x_CodeStartBranch.obj (codestart)
cht8805 发表于 2016-7-15 09:31 FLASH烧写已成功,主要问题是BOOTMODE管脚设置不对,引导启动硬件条件不对。现在的问题是调试时SPWM频率2 ...#include "DSP28x_Project.h" volatile Uint32 Num; int SinceTable[50]={25,28,31,34,37,39,42,44,46,47,48,49,49,49,49,48, 47,46,44,42,39,37,34,31,28,25,21,18,15,12,10,7, 5,3,2,1,0,0,0,0,1,2,3,5,7,10,12,15, 18,21,}; #define PWM1_INT_ENABLE 1 void InitEPwmTimer(void); // EPWM模块初始化程序 void update_compare(void); // 比较值定义 interrupt void epwm1_timer_isr(void); // 中断服务程序 //extern Uint16 RamfuncsLoadStart; //extern Uint16 RamfuncsLoadEnd; //extern Uint16 RamfuncsRunStart; #pragma CODE_SECTION(epwm1_timer_isr, "ramfuncs"); void main(void) { InitSysCtrl(); // 系统初始化函数 #ifdef FLASH //MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart); memcpy((uint16_t *)&RamfuncsRunStart,(uint16_t *)&RamfuncsLoadStart, (unsigned long)&RamfuncsLoadSize); InitFlash(); #endif InitEPwm1Gpio(); // EPWM端口初始化 DINT; // 关闭CPU中断 InitPieCtrl(); // PIE中断控制 IER = 0x0000; // 关闭中断使能 IFR = 0x0000; // 清除中断标志位 InitPieVectTable(); EALLOW; PieVectTable.EPWM1_INT = &epwm1_timer_isr;//中断函数入口 EDIS; // 赋值中断函数地址 InitEPwmTimer(); // 初始化EPWM模块 IER |= M_INT3; // 使能CPU级第三组中断 PieCtrlRegs.PIEIER3.bit.INTx1 = PWM1_INT_ENABLE; // 使能PIE3.1 EINT; // 使能全局中断 ERTM; Num=0; for(;;) { //DELAY_US(10); asm(" NOP"); } } /*EPWM模块初始化函数*/ void InitEPwmTimer() { EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // 停止TB计数 EDIS; EPwm1Regs.ETSEL.bit.INTSEL = ET_CTRU_CMPA; // 计数值等于比较值时产生中断 EPwm1Regs.ETSEL.bit.INTEN = 1; // 使能中断 EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // 第一次时产生中断 EPwm1Regs.TBPRD =50; // EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // 同步值 EPwm1Regs.TBCTR = 0; // 清除定时器计数 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 定时器增模式 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 同步脉冲装载不使能 EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 从镜像装载 EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // 关闭同步输出 EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // TB时钟等于SYSCLK EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 镜像模式 EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD; // 当CTR=prd的时候装载镜像数据 //EPwm1Regs.CMPA.half.CMPA = 30000; EPwm1Regs.CMPA.half.CMPA = 25; //调整占空比 50%时值应等于定时器周期一半 //数值越小,占空比越小 EPwm1Regs.AQCTLA.bit.CAU =AQ_SET; EPwm1Regs.AQCTLB.bit.CAU =AQ_CLEAR; EPwm1Regs.AQCTLA.bit.ZRO = AQ_CLEAR; EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // TB时钟计数 EDIS; } /*epwm1中断服务程序*/ //c2000的中断函数都要用“inerrupt”申明 interrupt void epwm1_timer_isr(void) { if(Num>49) {Num=0;} EPwm1Regs.CMPA.half.CMPA=SinceTable[Num]; Num++; //update_compare(); EPwm1Regs.ETCLR.bit.INT = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; }
cht8805 发表于 2016-7-15 09:19 在线吗?方便联系吗?QQ-591778199FLASH烧写已成功,主要问题是BOOTMODE管脚设置不对,引导启动硬件条件不对。现在的问题是调试时SPWM频率20KHZ,烧写到FLASH后,频率只有2.5KHZ,加上#pragma CODE_SECTION(epwm1_timer_isr, "ramfuncs");这句,就出错,直接跳到ILLEGAL_ISR里,请问怎么解决?
elvike 发表于 2016-7-12 14:24 参照官方的例程在线吗?方便联系吗?QQ-591778199
elvike 发表于 2016-7-12 10:16 是的引导的硬件条件都具备了,依然不行。下一步最简单的验证FLASH是否写入和正确运行的办法是什么(不考虑程序搬移到RAM空间运行)?是不是在初始化程序InitSysCtrl()后面加上InitFlash();就可以了,其它程序不用改动?版主说的FLASH等待时间怎么加入,加到哪里?
elvike 发表于 2016-7-11 22:49 硬件设计倒是没什么,一般都会设置成flash启动,ti的c2000不同型号引脚不一样,需要注意。软件方面一般都 ...F28027的FLASH引导模式要求GPIO34(COMP2OUT)=1、GPIO37(TDO)=1、TRST=0。是不是可以理解为外部电路GPIO34(COMP2OUT)接高电平、GPIO37(TDO)接高电平、TRST按手册要求通过2.2K电阻接地。这是FLASH引导启动的硬件条件?
elvike 发表于 2016-7-11 16:58 这类型的问题已经提过很多次了,楼主可以在论坛里搜索。基本都能找到你要的答案,是啊。我基本把相关帖子都看了,问题依然没解决。做为DSP的新手,我的感觉是F28027类似于单片机,烧写FLASH不成功首先从硬件着手,看编程接口和引导管脚配置是否正常(新手就是不知什么样是正常的,管脚到底需不需要外部硬件配置和怎么配置),FLASH延时怎么处理,在哪处理;先把FLASH烧写成功,程序能运行,然后再考虑是在RAM里还是FLASH里运行,运行时需要什么条件。这方面的资料确实很少,看了很多,始终没有总结出可行的办法。可能我比较笨啊。版主的《……在FLASH里运行》一文很好,把软件部分将透了,可对自己设计电路、做线路板和软硬件联调讲的较少,对电路设置方面基本没讲,感觉意犹未尽,不畅快淋漓。可能各位老手大侠对新手按图索骥式的操作体会不深,不简单点,不面面俱到真是不行。不把开发环境搭建好,后面啥也别谈了。我虽然有单片机基础,但自学DSP确实很费劲,总觉得有个弯绕不过来,恳请大侠详解。
cht8805 发表于 2016-7-11 14:49 你好,那篇文章看过了,讲的很好,很有启发。我也按照你的方法试过,但不行。所以我怀疑是不是引导模式或 ...刚看了下F28027的数据手册,引导管脚是GPIO34、GPIO37(TDO)和TRST三个,需要GPIO34=1;GPIO37=1;TRST=0。请问这是硬件电路控制还是软件设定?
dontium 发表于 2016-7-11 13:33 我有一篇《……在FLASH里运行》的帖子,你看一下。你好,那篇文章看过了,讲的很好,很有启发。我也按照你的方法试过,但不行。所以我怀疑是不是引导模式或DEBUG等方式错了。还请您仔细给科普一下,多谢。方便的话QQ:591778199
已有3人来访过
现在还没有留言