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.
工具与软件:
尊敬的专家:
我正在尝试将 RAM 中的 ADC_ISR 代码从闪存中复制、以获得更高的速度。 为了执行此操作,我 在 main ()中添加了"#define _flash",以将 InitFlash ()包含在 InitSysCtrl ()中。
然后、在 ADC_ISR 之前添加"#pragma CODE_SECTION (ADC_EOC、"ramfuncs")"。 在调试过程中、我只是根据链接器文件检查 ADC_ISR 是否已加载到指定地址中、并且是否在预期中找到该地址、您可以在第一个映像中看到它! 它从0x8000开始、这是 LS0RAM 的 strat 地址。 一旦运行被按下、一切看起来都很完美-根据模拟信号采集模拟信号和角蛋白并由 ePWM1触发 ADC。
#include "F28x_Project.h" #include <math.h> #include <stdio.h> #define _FLASH extern void InitSysCtrl(void); extern void InitPieCtrl(void); extern void InitPieVectTable(void); #define TWO_PI 6.283185307179586476925286766559 interrupt void ADCs_EOC(void); void Initialize_GPIO(void); void Custom_Init(void); void PWM1_Init(void); void Init_ADCs(void); void X_bar(void); int buff[100],i,b,c,d=0; float pi,V_alpha,V_beta,Vd,Vq,R,Y,B,temp,temp2,theta,a; void main(void) { InitSysCtrl(); Custom_Init(); PWM1_Init(); Init_ADCs(); DINT; Initialize_GPIO(); InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieCtrl(); InitPieVectTable(); EALLOW; PieCtrlRegs.PIEIER1.bit.INTx1 = 1; //ADC-A1 PieVectTable.ADCA1_INT = &ADCs_EOC; PieCtrlRegs.PIECTRL.bit.ENPIE= 1; EDIS; IER |= 1; EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM while(1) { } } void Initialize_GPIO(void) { EALLOW; //GPIO 18 - Xbar input /* GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 0; // GpioCtrlRegs.GPAGMUX2.bit.GPIO18 = 0; // GpioCtrlRegs.GPAPUD.bit.GPIO18 = 1; // GpioCtrlRegs.GPADIR.bit.GPIO18 = 0; // GpioCtrlRegs.GPACSEL3.bit.GPIO18 = 0; // GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3; InputXbarRegs.INPUT5SELECT = 18; */ // LED out GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; GpioCtrlRegs.GPADIR.bit.GPIO31 = 1; GpioCtrlRegs.GPCDIR.bit.GPIO73= 1; //PWMs GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; //ePWM1A GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; //ePWM2A GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1; //ePWM3A GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 1; //ePWM4A GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 1; //ePWM5A GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 1; //ePWM6A EDIS; } void Custom_Init(void) { EALLOW; ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL=1; ClkCfgRegs.AUXPLLMULT.bit.IMULT=20; ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV=0; ClkCfgRegs.SYSPLLCTL1.bit.PLLCLKEN = 1; ClkCfgRegs.LOSPCP.bit.LSPCLKDIV = 2; ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0; CpuSysRegs.PCLKCR0.bit.CPUTIMER0 = 1; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; ///source initsysctrl CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; CpuSysRegs.PCLKCR2.bit.EPWM2 = 1; CpuSysRegs.PCLKCR2.bit.EPWM3 = 1; CpuSysRegs.PCLKCR2.bit.EPWM4 = 1; CpuSysRegs.PCLKCR2.bit.EPWM5 = 1; CpuSysRegs.PCLKCR2.bit.EPWM6 = 1; CpuSysRegs.PCLKCR2.bit.EPWM7 = 1; CpuSysRegs.PCLKCR13.bit.ADC_A = 1; CpuSysRegs.PCLKCR0.bit.CLA1 = 1; DevCfgRegs.CPUSEL0.bit.EPWM1 = 0; Flash0CtrlRegs.FPAC1.bit.PMPPWR = 1; // Enable flash pump Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 3; // Adjust wait states EDIS; } #pragma CODE_SECTION(ADCs_EOC, "ramfuncs") void ADCs_EOC(void) { Vd=100; Vq=0; c =c +1; if(c>3) { c=0; } a = AdcaResultRegs.ADCRESULT0; //Va temp = (a*62500)/4095; R = 1000-a; EPwm1Regs.CMPA.bit.CMPA = temp; EPwm1Regs.CMPB.bit.CMPB = temp + 9000; i= i+1; EPwm1Regs.ETCLR.bit.SOCA = 1; AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; } void PWM1_Init(void) { EALLOW; //R Phase EPwm1Regs.TBCTL.bit.CTRMODE = 0; // Count up EPwm1Regs.TBPRD = 62500; // Set timer period EPwm1Regs.TBCTL.bit.PHSEN = 0; // 1 for external SYNC EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0 EPwm1Regs.TBCTR = 0x0000; // Clear counter EPwm1Regs.TBCTL.bit.HSPCLKDIV = 2; // Clock ratio to SYSCLKOUT EPwm1Regs.TBCTL.bit.CLKDIV = 4; EPwm1Regs.TBCTL.bit.SYNCOSEL = 1; // Setup shadow register load on ZERO EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0; EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0; EPwm1Regs.CMPCTL.bit.LOADAMODE = 0; EPwm1Regs.CMPCTL.bit.LOADBMODE = 0; // Set Compare values // Set compare A value // Set actions EPwm1Regs.AQCTLA.all = 0; EPwm1Regs.AQCTLA.bit.CAU = 2; // Set PWM1A on TBCTR = CMPA EPwm1Regs.AQCTLA.bit.CBU = 1; // Clear PWM1A on TBCTR = CMPB= CMPA + 100 //SOCA to ADC EPwm1Regs.ETSEL.bit.SOCAEN=1; EPwm1Regs.ETSEL.bit.SOCASEL=1; EPwm1Regs.ETPS.bit.SOCAPRD = 1; EPwm1Regs.ETCLR.bit.SOCA = 1; EDIS; } void Init_ADCs(void) { EALLOW; AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1; AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1; AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1; AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1; AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1; // DELAY_US(1); AdcaRegs.ADCCTL2.bit.PRESCALE = 6; AdcbRegs.ADCCTL2.bit.PRESCALE = 6; AdccRegs.ADCCTL2.bit.PRESCALE = 6; AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0 will convert pin A0 AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC1 will convert pin A1 AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2; //SOC2 will convert pin A2 AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3; //SOC3 will convert pin A3 AdcaRegs.ADCSOC4CTL.bit.CHSEL = 4; //SOC4 will convert pin A4 AdcaRegs.ADCSOC5CTL.bit.CHSEL = 5; //SOC5 will convert pin A5 AdcaRegs.ADCSOC0CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles AdcaRegs.ADCSOC1CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles AdcaRegs.ADCSOC2CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles AdcaRegs.ADCSOC3CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles AdcaRegs.ADCSOC4CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles AdcaRegs.ADCSOC5CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles AdcaRegs.ADCBURSTCTL.bit.BURSTEN = 1; AdcaRegs.ADCBURSTCTL.bit.BURSTSIZE = 11; AdcaRegs.ADCBURSTCTL.bit.BURSTTRIGSEL = 5; //interrupt AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; //end of SOC0 will set INT1 flag AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 05; EDIS; }
下图显示了 ADCIER、它从0x8000开始。
在微控制器复位之前、一切看起来都是正常的! 我希望它能继续发挥预期的功能(ePWM、获取模拟、PWM 三角 ADC)、但它停止了这种做法、最后得到 ILLEGAL_ISR!
我怀疑内存、 发现代码与前一个视图不同。 我不知道这是否是罪魁祸首、但只是分享意见。
请帮助我解决这个问题。
此致、
Rajesh。
尊敬的 Rajesh:
我正在 NMI 专家中循环查看您的问题。
此致、
Delaney
尊敬的 Delaney:
我还有另一个与 CLA 相关的问题、如果你不介意、请查看这个范围。
TMS320F28379D:无法触发 CLA - C2000微控制器论坛- C2000 ︎ 微控制器- TI E2E 支持论坛
此致、
Rajesh。
尊敬的 Rajesh:
您是否能够单步执行代码并将其范围缩小到触发 ITRAP 的位置?
是否确定设备已重置? 您是否知道它是因为 ITRAP ?
谢谢
您好、普拉坦:
是、器件在复位时进入非法子例程(按下 launchpad 按钮)。
我不确定是否是 ITRAP 使计算机进入非法 ISR。 我能看到的是、按下复位后、CPU 会指向地址0x082064、该地址对应于 ILLEGAL_ISR、调试模式退出运行模式。 按下 RUN 时、cCPU 在没有 PWM 和 ADC 运行的情况下运行!
此致、
Rajesh。
尊敬的 Rajesh:
你想达到什么目的?
如果您的目标是触发 Xrsn (器件复位)并开始运行应用程序、请检查该应用程序是否在闪存中编程、以及引导模式是否设置为闪存引导模式。 可以使用引导模式引脚将引导模式设置为闪存引导模式、请查看参考手册以了解更多详细信息。
谢谢
Prarthan、您好!
我认为这里存在一些混淆。
在本线程的最初帖子中、我提到过目标是从闪存中复制 RAM 中的一段程序(ADC ISR)、以实现更好的延迟。
引导模式引脚配置为制造商提供的默认位置、我认为它位于与闪存相对应的位置;
如前所述、当 ISR 未复制到 RAM 时、运行过程将不会出现毛刺脉冲(省略"# pragma code section (rammfunc)"行)
我希望我能更好地解释这一目标。 我在原始帖子中分享了该项目、供您参考。
此致、
Rajesh。
尊敬的 Rajesh:
请参阅注释 https://www.ti.com/lit/an/spra958l/spra958l.pdf
我没有看到从闪存到 RAM 的 ADC ISR 的运行时副本。 您能否参考上面的应用手册并为此添加 memcpy 函数。
谢谢
尊敬的 Prarthan:
"#define _FLASH"是在调用 InitSysCtrl()时用于合并闪存相关初始化的程序顶部定义的。 不管怎样、我也尝试根据您的建议使用 memcpy 运行。 但是、我看不到任何改善。
此致、
Rajesh。
你(们)好
我只是换了一行 #pragma CODE_SECTION (ADC_EOC、"ramfuncs") 或者会与 #pragma CODE_SECTION (ADCS_EOC、".TI.ramfunc") 现在运转正常。
但是、我看到了几个 ITRAP0 存储器行的地址 ADC_ISR 复制。
下面是反汇编代码:
这是 main.c
#include "F28x_Project.h" #include <math.h> #include <stdio.h> #define _FLASH extern void InitSysCtrl(void); extern void InitPieCtrl(void); extern void InitPieVectTable(void); extern void InitFlash(void); extern void SeizeFlashPump(void); extern unsigned int RamfuncsLoadStart; extern unsigned int RamfuncsLoadEnd; extern unsigned int RamfuncsRunStart; #define TWO_PI 6.283185307179586476925286766559 interrupt void ADCs_EOC(void); interrupt void TimerOvf(void); void Initialize_GPIO(void); void Custom_Init(void); void PWM1_Init(void); void Init_ADCs(void); void X_bar(void); void timer0_init(void); int buff[100],i,b,c,d=0; float pi,V_alpha,V_beta,Vd,Vq,R,Y,B,temp,temp2,theta,a; void main(void) { InitSysCtrl(); Custom_Init(); PWM1_Init(); Init_ADCs(); DINT; Initialize_GPIO(); InitPieCtrl(); timer0_init(); // memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, &RamfuncsLoadEnd - &RamfuncsLoadStart); memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (Uint32)&RamfuncsLoadSize); IER = 0x0000; IFR = 0x0000; InitPieCtrl(); InitPieVectTable(); EALLOW; PieCtrlRegs.PIEIER1.bit.INTx1 = 1; //ADC-A1 PieCtrlRegs.PIEIER1.bit.INTx7 = 1; PieVectTable.ADCA1_INT = &ADCs_EOC; PieVectTable.TIMER0_INT = &TimerOvf; PieCtrlRegs.PIECTRL.bit.ENPIE= 1; EDIS; IER |= 1; EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM CpuTimer0Regs.TCR.bit.TSS=0; while(1) { } } void Initialize_GPIO(void) { EALLOW; //GPIO 18 - Xbar input /* GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 0; // GpioCtrlRegs.GPAGMUX2.bit.GPIO18 = 0; // GpioCtrlRegs.GPAPUD.bit.GPIO18 = 1; // GpioCtrlRegs.GPADIR.bit.GPIO18 = 0; // GpioCtrlRegs.GPACSEL3.bit.GPIO18 = 0; // GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3; InputXbarRegs.INPUT5SELECT = 18; */ // LED out GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; GpioCtrlRegs.GPADIR.bit.GPIO31 = 1; GpioCtrlRegs.GPCDIR.bit.GPIO73= 1; //PWMs GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; //ePWM1A GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; //ePWM2A GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1; //ePWM3A GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 1; //ePWM4A GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 1; //ePWM5A GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 1; //ePWM6A EDIS; } void Custom_Init(void) { EALLOW; ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL=1; ClkCfgRegs.AUXPLLMULT.bit.IMULT=20; ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV=0; ClkCfgRegs.SYSPLLCTL1.bit.PLLCLKEN = 1; ClkCfgRegs.LOSPCP.bit.LSPCLKDIV = 2; ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0; CpuSysRegs.PCLKCR0.bit.CPUTIMER0 = 1; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; ///source initsysctrl CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; CpuSysRegs.PCLKCR2.bit.EPWM2 = 1; CpuSysRegs.PCLKCR2.bit.EPWM3 = 1; CpuSysRegs.PCLKCR2.bit.EPWM4 = 1; CpuSysRegs.PCLKCR2.bit.EPWM5 = 1; CpuSysRegs.PCLKCR2.bit.EPWM6 = 1; CpuSysRegs.PCLKCR2.bit.EPWM7 = 1; CpuSysRegs.PCLKCR13.bit.ADC_A = 1; CpuSysRegs.PCLKCR0.bit.CLA1 = 1; DevCfgRegs.CPUSEL0.bit.EPWM1 = 0; Flash0CtrlRegs.FPAC1.bit.PMPPWR = 1; // Enable flash pump Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 3; // Adjust wait states EDIS; } void timer0_init(void) { EALLOW; CpuTimer0Regs.PRD.bit.MSW = 0x0004; CpuTimer0Regs.PRD.bit.LSW = 0x0080; CpuTimer0Regs.TPR.bit.TDDR = 0x0013; CpuTimer0Regs.TCR.bit.TIE= 1; CpuTimer0Regs.TCR.bit.TSS=1; CpuTimer0Regs.TCR.bit.FREE=0; CpuTimer0Regs.TCR.bit.TRB=0; EDIS; } void TimerOvf(void) { b= b+1; if(b>10) { b=1; } GpioDataRegs.GPBTOGGLE.bit.GPIO34=1; GpioDataRegs.GPATOGGLE.bit.GPIO31=1; CpuTimer0Regs.TCR.bit.TIF = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; } #pragma CODE_SECTION(ADCs_EOC, ".TI.ramfunc") void ADCs_EOC(void) { Vd=100; Vq=0; c =c +1; if(c>3) { c=0; } a = AdcaResultRegs.ADCRESULT0; //Va temp = (a*62500)/4095; R = 1000-a; EPwm1Regs.CMPA.bit.CMPA = temp; EPwm1Regs.CMPB.bit.CMPB = temp + 9000; i= i+1; EPwm1Regs.ETCLR.bit.SOCA = 1; AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; } void PWM1_Init(void) { EALLOW; //R Phase EPwm1Regs.TBCTL.bit.CTRMODE = 0; // Count up EPwm1Regs.TBPRD = 62500; // Set timer period EPwm1Regs.TBCTL.bit.PHSEN = 0; // 1 for external SYNC EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0 EPwm1Regs.TBCTR = 0x0000; // Clear counter EPwm1Regs.TBCTL.bit.HSPCLKDIV = 2; // Clock ratio to SYSCLKOUT EPwm1Regs.TBCTL.bit.CLKDIV = 4; EPwm1Regs.TBCTL.bit.SYNCOSEL = 1; // Setup shadow register load on ZERO EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0; EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0; EPwm1Regs.CMPCTL.bit.LOADAMODE = 0; EPwm1Regs.CMPCTL.bit.LOADBMODE = 0; // Set Compare values // Set compare A value // Set actions EPwm1Regs.AQCTLA.all = 0; EPwm1Regs.AQCTLA.bit.CAU = 2; // Set PWM1A on TBCTR = CMPA EPwm1Regs.AQCTLA.bit.CBU = 1; // Clear PWM1A on TBCTR = CMPB= CMPA + 100 //SOCA to ADC EPwm1Regs.ETSEL.bit.SOCAEN=1; EPwm1Regs.ETSEL.bit.SOCASEL=1; EPwm1Regs.ETPS.bit.SOCAPRD = 1; EPwm1Regs.ETCLR.bit.SOCA = 1; EDIS; } void Init_ADCs(void) { EALLOW; AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1; AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1; AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1; AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1; AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1; // DELAY_US(1); AdcaRegs.ADCCTL2.bit.PRESCALE = 6; AdcbRegs.ADCCTL2.bit.PRESCALE = 6; AdccRegs.ADCCTL2.bit.PRESCALE = 6; AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0 will convert pin A0 AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC1 will convert pin A1 AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2; //SOC2 will convert pin A2 AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3; //SOC3 will convert pin A3 AdcaRegs.ADCSOC4CTL.bit.CHSEL = 4; //SOC4 will convert pin A4 AdcaRegs.ADCSOC5CTL.bit.CHSEL = 5; //SOC5 will convert pin A5 AdcaRegs.ADCSOC0CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles AdcaRegs.ADCSOC1CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles AdcaRegs.ADCSOC2CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles AdcaRegs.ADCSOC3CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles AdcaRegs.ADCSOC4CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles AdcaRegs.ADCSOC5CTL.bit.ACQPS = 14; //sample window is 100 SYSCLK cycles AdcaRegs.ADCBURSTCTL.bit.BURSTEN = 1; AdcaRegs.ADCBURSTCTL.bit.BURSTSIZE = 11; AdcaRegs.ADCBURSTCTL.bit.BURSTTRIGSEL = 5; //interrupt AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; //end of SOC0 will set INT1 flag AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 05; EDIS; }
那么、ITRAP0行在程序正常中是否有?
此致、
Rajesh。
否、 这是不正常的。
ITRAP0行要在程序正常
我尝试使用最新的 main()运行您的项目、它运行良好。
即使在复位后、反汇编代码也没有问题。
谢谢