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.

[参考译文] EK-TM4C129EXL:调试错误、但代码仍然有效

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1213428/ek-tm4c129exl-error-in-debugging-but-code-still-works

器件型号:EK-TM4C129EXL

   我的项目发生了一些奇怪的事情。  我正在构建一个 DAC、该 DAC 将信号导出到 PK0-3。  我收到下面附加的错误。  根据地址、错误来自端口 K。 我将代码更改了一位、刚刚发送了一个信号到 PK0-3、它们连接到 LED。  并从这些引脚打开 LED。  我的 DAC 代码本身不起作用。  我附加了不起作用的 DAC 代码、测试代码显示尽管有错误、引脚仍然可以正常工作。  差异出现在 while 环路中。  我知道 DRM 代码不受支持、但我觉得问题不在代码样式内、而可能是代码中的一个设置。  在其他项目中、我对相同风格的编码没有任何问题。

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

    您好!

     您的代码没有附件。 在任何情况下、如果 LED 亮起、我认为这些引脚已针对 GPIO 模式进行了正确配置。 请记住、要使用 MCU 的 PWM 创建 DAC、您需要一个外部低通滤波器。 请参阅以下有关创建 DAC 的链接。 此外、您需要生成具有不同占空比的 PWM。 PK0-3不是 PWM 引脚。 如果您尝试进行位冲击、那么它将 非常不准确、因为您无法 精确地控制周期和变化的占空比。  

    https://www.allaboutcircuits.com/technical-articles/turn-your-pwm-into-a-dac/

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

    您好!

    我是这一调查的原审者。 为我发布此帖子的 TI 支持人员未包含查看问题所需的附件。 我将附加可行的代码变体、我正在使用的代码片段没有该变量、并且我将收到错误消息。 我看不到如何添加附件、因此我要添加原始代码。 尽管存在错误、原始代码仍然可以立即运行、而第二个 代码片段可以立即运行 。

    问题: Imgur:魔法的互联网

    #include
    #include

    #define GPIO_PORTN ((volatile uint32_t *) 0x40064000)
    #define GPIO_PORTL ((volatile uint32_t *) 0x40062000)
    #define GPIO_PORTK ((volatile uint32_t *) 0x40061000)
    #define GPIO_PORTF ((volatile uint32_t *) 0x4005D000)
    #define sysctl ((volatile uint32_t *) 0x400FE000)
    #define SysTick ((volatile uint32_t *) 0xE000E000)

    #define SYSCTL_MOSCCTL_PWRDN (1<<3)
    #define SYSCTL_MOSCCTL_NOXTAL (1 << 2)
    #define SYSCTL_MOSCCTL_OSCRNG (1 << 4)

    #define SYSCTL_RIS_MOSCPUPRIS (1 << 8)

    #define SYSCTL_MISCPUMIS (1 << 8)

    #define SYSCTL_RSCLKCFG_OSCSRC_MOSC (3 << 20)
    #define SYSCTL_RSCLKCFG_PLLSRC_MOSC (3 << 24)
    #define SYSCTL_RSCLKCFG_NEWFREQ (1 << 30)
    #define SYSCTL_RSCLKCFG_PSYSDIV_M (0x3ff >> 0)
    #define SYSCTL_RSCLKCFG_PSYSDIV_3 3.
    #define SYSCTL_RSCLKCFG_USEPLL (1 << 28)
    #define SYSCTL_RSCLKCFG_MEMTIMU (1 << 31)

    #define SysCtl_PLLFREQ0_MINT_S 0
    #define SYSCTL_PLLFREQ0_MFRAC_S 10.
    #define SYSCTL_PLLFREQ0_PLLPWR (1 <<23)

    #define SYSCTL_MEMTIM0_EBCHT_M (0b1111 << 22)
    #define SYSCTL_MEMTIM0_EWS_M (0b1111 << 16)
    #define SYSCTL_MEMTIM0_EBCE (1 << 21)
    #define SYSCTL_MEMTIM0_FBCHT_3_5 (6 << 6)
    #define SYSCTL_MEMTIM0_EWS_6 (6 << 16)
    #define SYSCTL_MEMTIM0_FBCHT_M (0b1111 << 6)
    #define SYSCTL_MEMTIM0_FWS_M (0b1111 >> 0)
    #define SYSCTL_MEMTIM0_FBCE (1 << 5)
    #define SYSCTL_MEMTIM0_FWS_6 (6 >> 0)

    #define GPIO_PIN_0 (1 >> 0)
    #define GPIO_PIN_1 (1 << 1)
    #define GPIO_PIN_2 (1 << 2)
    #define GPIO_PIN_3 (1 << 3)
    #define GPIO_PIN_4 (1 << 4)
    #define GPIO_PIN_5 (1 << 5)
    #define GPIO_PIN_6 (1 << 6)
    #define GPIO_PIN_7 (1 << 7)

    #define LED1_PN1 GPIO_PIN_1
    #define LED2_PN0 GPIO_PIN_0
    #define LED3_PF4 GPIO_PIN_4
    #define LED4_PF0 GPIO_PIN_0

    #define SYSCTL_RCGCGPIO_PORTF (1 << 5)
    #define SYSCTL_RCGCGPIO_PORTL (1 << 10)
    #define SYSCTL_RCGCGPIO_PORTK (1 <<9)
    #define SYSCTL_RCGCGPIO_PORTN (1 << 12)

    #define PUSH1_PL1 GPIO_PIN_1
    #define PUSH2_PL2 GPIO_PIN_2

    #define OUT_PK0 GPIO_PIN_0
    #define OUT_PK1 GPIO_PIN_1
    #define OUT_PK2 GPIO_PIN_2
    #define OUT_PK3 GPIO_PIN_3

    #define out (out_PK0 | out_PK1 | out_PK2 | out_PK3)

    #define IN_PK4 GPIO_PIN_4
    #define IN_PK5 GPIO_PIN_5
    #define IN_PK6 GPIO_PIN_6
    #define IN_PK7 GPIO_PIN_7

    #define in (IN_PK4 | IN_PK5 | IN_PK6 | IN_PK7)

    第4778章不好
    第4257章不好
    这是一个很好的例子
    这是一个很好的例子

    uint8_t index = 0;

    const uint8_t sin[48]={
    0b0000、0b0000、0b0001、0b0001、0b0001、0b0010、0b001、0b0100、0b01010、0b0111、0b1000、0b100、0b1010、0b10101、0b1101、0b1101、0b1101、0b110、0b1110、0b1110、0b1110、0b1110、0b1111、
    0b11110b11110b1110b1110,0b1110,0b1101,0b1101,0b1101,0b1101,0b1101.00b10,0b10,0b1001,0b1000,0b0111,0b0110,0b0101,0b0100,0b0011,0b0011,0b0010,0b00b001.0b0001,0b0001,0b0001,0b0000,0b0000
    };

    枚举{
    SYSCTL_RCGCGPIO =(0x608 >> 2)、
    GPIO_DEN =(0x51c >> 2)、
    GPIO_DIR =(0x400 >> 2)、
    GPIO_PUR =(0x510 >> 2)、
    SYSCTL_MOSCCTL =(0x07C >> 2)、
    SYSCTL_RIS =(0x050 >> 2)、
    SYSCTL_MISC =(0x058 >> 2)、
    SYSCTL_RSCLKCFG =(0x0B0 >> 2)、
    SYSCTL_PLLFREQ0 =(0x160 >> 2)、
    SYSCTL_PLLFREQ1 =(0x164 >> 2)、
    SYSCTL_MEMTIM0 =(0x0C0 >> 2)、
    SYSCTL_PLLSTAT =(0x168 >> 2)、
    STCTRL =(0x010 >> 2)、
    STRELOAD =(0x014 >> 2)、
    STCURRENT =(0x018 >> 2)、
    PRI3 =(0xD20 >> 0)
    };

    void EnableInt (void);

    void PLL (void){
    uint32_t tmp;

    SYSCTL[SYSCTL_MOSCCTL]&=~(SYSCTL_MOSCCTL_NOXTAL | SYSCTL_MOSCCTL_PWRDN);
    if (!(SYSCTL[SYSCTL_MOSCCTL]& SYSCTL_MOSCCTL_OSCRNG)){
    SYSCTL[SYSCTL_MOSCCTL]|= SYSCTL_MOSCCTL_OSCRNG;
    while (!(SYSCTL[SYSCTL_RIS]和 SYSCTL_RIS_MOSCPUPRIS));
    }
    SYSCTL[SYSCTL_MISC]= SYSCTL_MISCPUMIS;
    SYSCTL[SYSCTL_RSCLKCFG]|= SYSCTL_RSCLKCFG_OSCSRC_MOSC | SYSCTL_RSCLKCFG_PLLSRC_MOSC;
    SYSCTL[SYSCTL_PLLFREQ0]=(96 << SYSCTL_PLLFREQ0_MINT_S)|(0 << SYSCTL_PLLFREQ0_MFRAC_S);
    SYSCTL[SYSCTL_PLLFREQ1]= 4;

    tmp = SYSCTL[SYSCTL_MEMTIM0];
    tmp &=~(SYSCTL_MEMTIM0_EBCHT_M | SYSCTL_MEM0_EWS_M | SYSCTL_MEMTIM0_EBCE);
    tmp |= SYSCTL_MEMTIM0_FBCHT_3_5 | SYSCTL_MEM0_EWS_6;
    tmp &=~(SYSCTL_MEMTIM0_FBCHT_M | SYSCTL_MEMTIM0_FWS_M | SYSCTL_MEMTIM0_FBCE);
    tmp |= SYSCTL_MEMTIM0_FBCHT_3_5| SYSCTL_MEM0_FWS_6;
    SYSCTL[SYSCTL_MEMTIM0]= tmp;

    SYSCTL[SYSCTL_PLLFREQ0]|= SYSCTL_PLLFREQ0_PLLPWR;
    SYSCTL[SYSCTL_RSCLKCFG]|= SYSCTL_RSCLKCFG_NEWFREQ;
    while (!SYSCTL[SYSCTL_PLLSTAT]);

    tmp = SYSCTL[SYSCTL_RSCLKCFG];
    tmp =(tmp &~SYSCTL_RSCLKCFG_PSYSDIV_M)| SYSCTL_RSCLKCFG_PSYSDIV_3;
    tmp |= SYSCTL_RSCLKCFG_USEPLL | SYSCTL_RSCLKCFG_MEMTU;
    SYSCTL[SYSCTL_RSCLKCFG]= tmp;
    }

    无符号长钢琴(void){
    无符号长频率;

    开关(GPIO_PORTK[IN]){
    实例 IN_PK4:
    频率= C;
    GPIO_PORTN[LED1_PN1]^= LED1_PN1;
    中断;
    IN_PK5中的案例:
    频率= D;
    GPIO_PORTN[LED2_PN0]^= LED2_PN0;
    中断;
    IN_PK6中的案例:
    频率= E;
    GPIO_PORTF[LED3_PF4]^= LED3_PF4;
    中断;
    IN_PK7中的案例:
    频率= G;
    GPIO_PORTF[LED4_PF0]^= LED4_PF0;
    中断;
    默认值:
    频率= 0;
    中断;
    }

    返回频率-1;
    }

    void DAC (uint8_t data){
    GPIO_PORTK[OUT]=数据;
    }

    空音调(无符号长周期){
    SysTick [STRELOAD]=周期;
    }

    void syshandle (void){
    INDEX =(INDEX + 1)& 0x30;
    DAC (sin[index]);
    }

    空 main ()

    PLL();

    SysTick [STCTRL]= 0;
    SysTick [STCURRENT]= 0;
    SysTick [PRI3]=(0x4 << 28);
    SysTick [STCTRL]= 0x7;

    SYSCTL[SYSCTL_RCGCGPIO]|= SYSCTL_RCGCGPIO_PORTN;
    SYSCTL[SYSCTL_RCGCGPIO]|= SYSCTL_RCGCGPIO_PORTF;
    SYSCTL[SYSCTL_RCGCGPIO]|= SYSCTL_RCGCGPIO_PORTL;
    SYSCTL[SYSCTL_RCGCGPIO]|= SYSCTL_RCGCGPIO_PORTK;
    SYSCTL[SYSCTL_RCGCGPIO]|= SYSCTL_RCGCGPIO_PORTN;
    SYSCTL[SYSCTL_RCGCGPIO]|= SYSCTL_RCGCGPIO_PORTF;
    SYSCTL[SYSCTL_RCGCGPIO]|= SYSCTL_RCGCGPIO_PORTL;
    SYSCTL[SYSCTL_RCGCGPIO]|= SYSCTL_RCGCGPIO_PORTK;

    GPIO_PORTN[GPIO_DIR]|= LED1_PN1;
    GPIO_PORTN[GPIO_DEN]|= LED1_PN1;
    GPIO_PORTN[GPIO_DIR]|= LED2_PN0;
    GPIO_PORTN[GPIO_DEN]|= LED2_PN0;
    GPIO_PORTF[GPIO_DIR]|= LED3_PF4;
    GPIO_PORTF[GPIO_DEN]|= LED3_PF4;
    GPIO_PORTF[GPIO_DIR]|= LED4_PF0;
    GPIO_PORTF[GPIO_DEN]|= LED4_PF0;

    GPIO_PORTL[GPIO_DIR]&&~(PUSH1_PL1 | PUSH2_PL2);
    GPIO_PORTL[GPIO_DEN]|= PUSH1_PL1 | PUSH2_PL2;

    GPIO_PORTK[GPIO_DIR]&=~μ V in;
    GPIO_PORTK[GPIO_DEN]|= IN;

    GPIO_PORTK[GPIO_DIR]|=输出;
    GPIO_PORTK[GPIO_DEN]|= OUT;

    EnableInt();

    while (true){
    GPIO_PORTK[OUT]^= OUT;
    }
    }

    while 循环中不起作用的代码(对 SysTick 重载值进行了硬编码):  

    while (true){
    GPIO_PORTK[OUT]= sin[index];
    对于(int I = 0;I < 1;I++)
    while ((SysTick [STCTRL]& 0x10000)== 0){}
    INDEX =(INDEX + 1)& 0x30;
    }

    谢谢!

    德鲁

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

    您好!

     如 FAQ#4 https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/695568/faq-faqs-for-tm4c-arm-cortex-m4f-microcontrollers 中所述、 我们不支持 DRM 编码。 我将建议你单步执行你的代码、以及我在最后一次回复中的反馈(例如、低通滤波器和使用 PWM 模块)。  

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

    您好!

       我知道你不调试 DRM 代码,但我想知道你是否知道解决我发送的图像中的错误的解决方案: Imgur:魔法的互联网

       我不知道发生了什么情况、因为控制台说端口 K 有错误、但端口 K 似乎正常工作。

    谢谢!

    德鲁

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

    您好!

    该错误消息显示您正在读取0x400613fc 处的寄存器。 这些是 GPIOK 的寄存器。 您可能需要在启用 GPIOK 之前使用调试器来读取这些寄存器。 首先需要启用 GPIOK、然后在 CCS 中打开寄存器或内存浏览器、这样就不会出现这些错误。 如果您读取任何尚未启用的外设、地址解码器将向调试器报告总线错误。 这就是您看到错误消息的原因、  

    以下链接提供了其他 JTAG 故障排除功能。  

    software-dl.ti.com/.../ccs_debugging_jtag_connectivity_issues.html

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

    您好!

       啊、这就是问题所在。  我当时在尝试读取 GPIOK 上的表达式、但它们还没有准备好。  好的、这样就解决了该问题、现在修复我的 DAC 问题。

    谢谢!

    德鲁