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.

[参考译文] CCS/SW-EK-TM4C129EXL:按下"Reset"按钮后自动启动 Tiva?

Guru**** 2482225 points
Other Parts Discussed in Thread: EK-TM4C129EXL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/723393/ccs-sw-ek-tm4c129exl-auto-start-tiva-with-out-press-reset-button

器件型号:SW-EK-TM4C129EXL
Thread 中讨论的其他器件:EK-TM4C129EXL、Strike

工具/软件:Code Composer Studio

您好!

我正在使用 TM4C129EXL 套件和 CCS 7.0。

我修改了 enet_lwip.c、以通过以太网发送串行数据(字符串)。 它工作正常。

我的程序从初始化 主时钟、 以太网外设、UARTGPIOSPI 通信 启用中断和很少的 UARTprintf 语句、并进入无限 while 循环。 数据时  

中断 通过以太网发送、中断发生、中断会中断无限 while 循环、并转至中断子例程、读取数据、打印数据并返回无限 while 循环。

我通过笔记本电脑的 USB 端口为电路板供电。  

问题是:如果我拔下通过 USB 电缆的电源线并重新连接、程序 不会从头开始。 我甚至不知道程序控制在哪里。

但是、如果我按下复位按钮、程序从开始就会启动、并且工作正常。 我是否需要在 控制器中启用上电复位?

我觉得按复位按钮和上电复位 对 控制器有不同的影响。  

谢谢你。

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    插入 USB 电缆将为器件供电、并开始从复位执行。 尝试对示例进行编程:
    将"C:\ti\TivaWare_C_Series-2.1.4.178\examples\boards\ek-tm4c129exl\blinky"添加到您的 EK-TM4C129EXL launchpad 并验证您是否获得闪烁的 LED。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Bob。

    我尝试了闪烁 LED 示例。  如您所述、即使在拔下并重新拔插控制器电源后、它也能正常工作。 但我的程序有点复杂。

    我在下面附加了部分代码(main 函数)。 它有很多外设初始化、中断初始化等

    它有一个名为 EthernetInit()的函数调用,我将通过它尝试使用 静态 IP 在我的 PC 和电路板之间建立 TCP 连接。  

    它还涉及 SPI 通信、UART 通信和系统时钟初始化。

    在所有这些初始化之后、它进入无限 while 循环、并仅使 LED 闪烁。

    我觉得由于所有这些通信、上电复位失败了。 是否有人能确切地知道代码的哪一部分阻碍了上电复位?

    是否还有其他 漏洞 、例如仅在电源关闭并恢复时执行软件编程复位?

    我的代码:

    int main (空)

    uint32_t ui32User0、ui32User1;
    uint8_t pui8MACArray[8];
    
    
    //
    //确保主振荡器已启用,因为这是所要求的
    // PHY。 系统必须将一个25MHz 晶体连接到 OSC
    //引脚。 晶体时使用 SYSCTL_MOSC_HIGHFREQ 参数
    //频率为10MHz 或更高。
    //
    
    SysCtlMOSCConfigSet (SYSCTL_MOSC_HIGHFREQ);
    
    //
    //从 PLL 以120MHz 运行。
    //
    G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000);
    
    //
    
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);//针对 PB5上的 SSI1 CLK
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);//对于 PE4上的 SSI1 DATA0
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI1);
    
    SysCtlPeripheralEnable (SYSCTL_Periph_GPION);// UART 检查 LED
    
    SysCtlPeripheralReset (SYSCTL_Periph_GPIOB);
    SysCtlPeripheralReset (SYSCTL_Periph_GPIOE);
    SysCtlPeripheralReset (SYSCTL_Periph_SSI1);
    
    GPIOPinConfigure (GPIO_PB5_SSI1CLK);
    GPIOPinConfigure (GPIO_PE4_SSI1XDAT0);
    GPIOPinConfigure (GPIO_PE5_SSI1XDAT1);
    
    GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_4);
    
    
    
    GPIOPinTypeSSI (GPIO_PORTB_BASE、GPIO_PIN_5);
    GPIOPinTypeSSI (GPIO_Porte _BASE、GPIO_PIN_4 | GPIO_PIN_5);
    SSIClockSourceSet (SSI1_base、SSI_Cock_SYSTEM);
    SSIConfigSetExpClk (SSI1_base、g_ui32SysClock、SSI_FRF_MOTO_MOTO_0、SSI_MODE_MASTER、g_ui32SysClock/40、 8);
    SSIAdvModeSet (SSI1_base、SSI_ADV_MODE_READ_WRITE);
    SSIIntRegister (SSI1_base、SSI1IntHandler);
    SSIIntEnable (SSI1_BASE、SSI_RXTO| SSI_RXOR);
    SSIEnable (SSI1_base);
    
    
    IntMasterEnable();
    
    //
    //配置器件引脚。
    //
    PinoutSet (true、false);
    
    //
    //配置 UART。
    //
    UARTStdioConfig (0、115200、g_ui32SysClock);
    IntEnable (INT_UART0);
    UARTIntEnable (UART0_BASE、UART_INT_RX | UART_INT_RT);
    
    SysCtlPeripheralEnable (SYSCTL_Periph_EEPROM0);
    
    SysCtlPeripheralReset (SYSCTL_Periph_EEPROM0);
    //
    //等待 EEPROM 模块准备就绪。
    //
    while (!SysCtlPeripheralReady (SYSCTL_Periph_EEPROM0))
    {
    }
    uint32_t ui32EEPROMInit;
    
    ui32EEPROMInit = EEPROMInit();
    
    //rom_EEPROMProgram ((uint32_t *)&data、E2PROM test_adres、sizeof (data));
    //
    //检查 EEPROM 初始化是否返回错误
    //并通知应用程序
    //
    
    //
    //清除终端并打印横幅。
    //
    UARTprintf ("\033[2J\033[H");
    UARTprintf ("以太网 lwIP 示例\n\n");
    
    if (ui32EEPROMInit!= EEPROM_INIT_OK)
    {
    UARTprintf ("EEPROM 非 INTALISED\n");
    }
    其他
    {
    UARTprintf ("EEPROM INTALISED\n");
    }
    
    
    
    //
    //将的端口 N1配置为动画 LED 的输出。
    //
    MAP_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1);
    
    
    //
    //将 LED 初始化为关闭(0)
    //
    MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、~GPIO_PIN_1);
    
    //
    //为周期性中断配置 SysTick。
    //
    MAP_SysTickPeriodSet (g_ui32SysClock / SYSTICKHZ);
    map_SysTickEnable();
    map_SysTickIntEnable();
    
    //
    //为的以太网控制器过滤配置硬件 MAC 地址
    //传入数据包。 MAC 地址将存储在非易失性存储器中
    // USER0和 User1寄存器。
    //
    map_FlashUserGet (&ui32User0、&ui32User1);
    if ((ui32User0 == 0xffffffff)||(ui32User1 == 0xffffffff)
    {
    //
    //我们永远不应该来这里。 如果 MAC 地址有、则这是一个错误
    //未编程到器件中。 退出程序。
    //告知用户没有 MAC 地址
    //
    UARTprintf ("未对 MAC 进行编程!\n");
    while (1)
    {
    }
    }
    
    //
    //告诉用户我们现在正在做什么。
    //
    UARTprintf ("正在等待 IP.\n");
    
    //
    //将24/24拆分 MAC 地址从 NV RAM 转换为32/16拆分 MAC
    //对硬件寄存器进行编程所需的地址,然后对 MAC 进行编程
    //将地址输入以太网控制器寄存器。
    //
    pui8MACArray[0]=((ui32User0 >> 0)& 0xff);
    pui8MACArray[1]=((ui32User0 >> 8)& 0xff);
    pui8MACArray[2]=((ui32User0 >> 16)& 0xff);
    pui8MACArray[3]=((ui32User1 >> 0)& 0xff);
    pui8MACArray[4]=((ui32User1 >> 8)& 0xff);
    pui8MACArray[5]=((ui32User1 >> 16)& 0xff);
    
    //
    //使用 DHCP 初始化 lwIP 库。
    //
    lwIPInit (g_ui32SysClock、pui8MACArray、3236043、4294967040、0、 ipaddr_use_static);
    
    //
    //设置设备定位服务。
    //
    //LocatorInit();
    //LocatorMACAddrSet (pui8MACArray);
    //LocatorAppTitleSet ("EK-TM4C1294XL Enet_IO");
    
    //
    //初始化示例 httpd 服务器。
    //
    init_default();
    init_channels();
    
    
    EtherNet_Init();
    //httpd_init();
    
    //
    //设置中断优先级。 我们将 SysTick 中断设置为更高的值
    //优先级比以太网中断高,以确保文件系统
    如果 SysTick 在以太网处理程序运行时发生、则处理// tick
    //已处理。 这很可能是因为所有 TCP/IP 和 HTTP 工作都是
    //在以太网中断上下文中完成。
    //
    MAP_IntPrioritySet (INT_EMAC0、ETHERNET_INT_PRIORITY);
    MAP_IntPrioritySet (FAULT_SysTick、SysTK_INT_PRIORITY);
    
    //
    //循环永久、处理 LED 闪烁。 所有工作都在中完成
    //中断处理程序。
    //
    while (1)
    {
    //
    //等待 SysTick 中断指示更改的状态
    // LED。
    //
    while (g_bled == false)
    {
    }
    
    //
    //清除标志。
    //
    G_bled = false;
    
    //
    //切换 LED。
    //
    MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、
    (MAP_GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1)^
    GPIO_PIN_1);
    }
    } 

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

    有时-我的小型科技公司发现、"只是你(现在)注意到的效果!"  

    供应商 Bob 的建议(基于 kiss)简单的" Blinky 计划"建立了您的董事会 实现 "POR 的"硬件适配性"。   但是、应"多次"对此进行测试、以正确确认。

    "最快速、最简单"的检查涉及硬件-我将首先列出这些检查。   (通过" Blinky "测试(几乎)可以免除硬件-但并非总是!)

    遵循我们公司的见解和指导:

    • 请在以下情况发生时重复此类测试:
      • 具有相同 PC 的不同 USB 端口
      • 不同的 PC

    提供此功能的原因是"电力输送不当"可能会导致预期的"上电复位"发生故障/遇险。

    • 更改为另一条 USB 电缆-该电缆上有多条电缆
    • 缩短 USB 电缆的长度("压力 POR "中已注明电缆电感增加)
    • 使用适当的+5V 外部电源为您的电路板供电-施加到正确的电路板引脚上。   请密切注意电路板电源开关的"设置"!   在  通过此外部电源进行测试时、最好确保不存在 USB 连接。   (在提供/测试外部电源时、由 USB 电缆提供的+5V 电力输送必须"断开"。)
    • 您自己注意到(许多)到您的电路板的外设连接。   此处建议的测试应该在没有  任何外部连接的情况下进行。  (功率除外)

    切换到外部电源后、如果您的电路板(正确)执行(POR)(通过 USB 端口供电)已确认可疑!

    • 如果 PC 端口问题"证明情况"-  MCU 复位线路的"上拉 R"的较低值-已经解决(类似)此类 POR 问题...  (确保存在此类上拉电阻!)

    应该(所有)这些'hw'方法(未能更正)-证明您的、'Start-Up File and / or (lery) Early Code'可疑的。

    请注意'Blinky's’s Early program code (  我在下面列出它 采用了'AFE、保守和最佳实践'的组合!)

    main (空)

    volatile uint32_t ui32Loop;

    //启用用于板载 LED 的 GPIO 端口。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);

    //检查是否启用了外设访问。
    //
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOG)) //  这是一个'SAFE'早期函数-因为代码'提供 MCU' A (有点)'放弃'环境-从这个开始!   

    现在您的代码-立即开始:'SysCtlMOSCConfigSet()'-然后是 :'g_ui32SysClock = MAP_SysCtlClockFreqSet()。'    这是残酷的(对比之下)—难道不是吗?

    对于"刚刚供电" MCU、这两种功能是否要求苛刻且具有挑战性?    我认为-"证明情况"。

    有一种(非常)快速/简单的方法可以让您测试我的理论-只需添加这两个函数(您的)-并且只有这两个函数)  (顶部(即在闪烁代码之前)-就像您在(现有)代码中一样!   (连同最低支持(.h 文件)-这可能是必需的。)   不要添加整个代码-只添加这两个函数-只添加!  如果这个(修改的)" Blinky "密码-那么你的代码(可能的)会引入(其他)问题-但我会"强烈建议"-在 POR (仍然)失败时-使用此代码加法。  (即 、对于"刚通电的 MCU"而言、此类代码太具挑战性。)

    我认为出现这种情况的原因是(可能) 当您"激活然后释放复位开关"时、会感觉@ MCU 复位'的 VDD 升高速度。   相反、"插入 USB 电缆"- 整个电路板  必须从"0V"-这( 可能会增加过多 dV/dT 斜率)到  MCU 复位!    Blinky 之所以能够忍受并接受这种情况、是因为他们的防御性和保守性"第一个代码被执行"。   您部署的代码(原谅)既不 是防御性的、也不是保守的、您的 MCU 就会挂起!

    在任一种情况下- MCU 复位线路的'Scope-Caps'应被捕捉并显示在这里(在复位开关和 POR 期间)-如果需要进一步诊断的话!

    在*意外'事件中、您(真的)遵循了此方向-且(仍然) POR 挂起-将显示以下内容。

    • 仔细检查(即对比/比较)"Blinky"(已生效)的启动文件与(唯一)启动文件。
    • 避免出现任何/所有"基于中断"的代码-使其在程序中"早期"出现。   
    •  "基于 ASM 的 NOPs"的"级联"(作为(非常)要执行的第一个代码)用于"协助"POR "断言和/或"保持"。
    • 它将(毫无疑问) 对"将您的代码应用到 Blinky!"    理想情况下-一次一个功能-系统且逐步  (即 kiss)测试 POR 故障的"开始"!   (请务必修改'Blinky'的启动文件、以类似的方式-反映您更广泛的使用情况-但(仍然)"一次一个函数"。

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

    感谢 您的详细解释和深入回答。

    正如您说过的、问题出在我的代码上。 它一开始就有一些繁重的处理代码行。  

    我尝试将我的代码中的两个函数添加到 闪烁示例的开头、 POR 即使在添加后也能完美工作。

    然后、在开始的代码中、我添加了以下代码行、以便使板载 LED 闪烁。  

    SysCtlPeripheralEnable (SYSCTL_Periph_GPION);

    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPION))
    {}

    GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0);

    GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、GPIO_PIN_0);

    SysCtlDelay (40000*1000); // 1秒延迟

    GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0x00);

     

    LED 闪烁后、我继续处理繁重的代码行。 它运行良好、解决了我在 POR 上的问题。

    正如您所说的那样、从  SysCtlMOSCConfigSet()开始、  然后是 'g_ui32SysClock =  MAP_SysCtlClockFreqSet()、这是很残酷的。 这导致了 POR 问题。

    在开始添加闪烁 LED 代码后、问题得到解决。

    但是、当我尝试用一 个简单的延迟 SysCtlDelay (40000*1000)启动程序时、 POR 问题仍然存在、而不是闪烁 LED。  

    无论如何,我的问题现在已经解决了。

    再次感谢

     

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

    [引用 user="RAGHUL N M"]感谢您详细解释 的深入回答。

    我也要感谢您对  "您的平等"进行了充分解释、详细和深入的报告、确认了"我的理论"。   (也感谢"奖项"。)

    MCU 会经历一个合理的"密集"启动过程-当(负担过重)具有过度激进性的"首次执行代码块"时、"POR"等问题会"加剧!"   

    您"将我建议的(Blinky.c 代码)作为前导码"添加到应用程序的代码(更多信息)-证明是聪明的。   有效( 因为它保留了"高效/温和"的 MCU 启动)-遗憾的是(如此之少)-有 "建立这样的连接!"

    既然您的'POR'问题(出现)已经解决-您 可以考虑查找、阅读、理解和部署'GPIO-JTAG.c' (或类似的)-因为(非常)下一个'code block'- 您的程序-始终可以运行!  

    除了解决'POR '(以及公司/我发现的其他问题) 之外、这将使您能够'恢复您的 MCU 的 JTAG 通信'-应该(大多数)'重要'罢工。   我们公司在所有计划中(这家供应商的 ARM 以及其他多家供应商的 ARM)都采用了非常相似的"保护编码机制"、结果非常令人满意...

    预防确实. 流行性腮腺炎(任何)治愈!   这里有这么多人——忍受了可 避免的消化不良和沮丧: “JTAG 锁定!”

    您将为以下各项而受到称赞:

    • 接受指导
    • 测试-然后"证明/确认"其有效性
    • 然后"微调"(根据您的具体需求)-同时(保留)战略"本质"。

    干得不错!