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/TM4C123GH6PM:#10247-D 空:创建输出段

Guru**** 2616675 points

Other Parts Discussed in Thread: TM4C123GH6PM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/782926/ccs-tm4c123gh6pm-10247-d-null-creating-output-section

器件型号:TM4C123GH6PM
主题中讨论的其他器件: TM4C123

工具/软件:Code Composer Studio

你(们)好 我对在 CCS (或任何地方)下编译的 Tiva MCU 程序非常陌生、似乎在处理我认为的.map 文件时遇到了问题。 我的程序在附加的字文件中部分可见、当它执行 SysCtlClockSet()函数-这是 main()中的第一个调用-并且调试器退出时、它会无限循环、引用 NMI 或硬件故障的问题。 从问题窗口中可以看到、我想知道问题是堆栈指针还是程序计数器未正确初始化。 我本以为 IDE 会在启动时为这些寄存器分配一些实际值。 此外、当用户想要初始化端口时、SysCtlPeripheralxxx 调用的正确序列是什么? 有人可以在这里帮助我吗? 谢谢、Harry。

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

    您的项目不包含链接器.cmd 文件。 它是链接器命令文件、用于指定段在存储器区域中的位置。

    如果没有链接器命令文件、链接器会生成格式为"在没有 SECTIONS 规范的情况下创建输出段".stack"的警告、并选择任意的存储器区域来放置段。 这可能会在运行时导致故障、例如、如果链接器将堆栈放置在闪存中。

     默认情况 下、为 tm4c123gh下午6创建新项目时、CCS 应添加 tm4c123ghp6.cmd 链接器命令文件。 如果转到"常规"工程属性、您应该能够为器件选择链接器命令文件:

    有关  一些背景信息、请参阅 TI 链接器命令文件入门。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好。 感谢您的帮助;它似乎已经解决了问题。 我现在可以单步执行 SysCtlPeripheralPresent()函数。 对于我的另一个问题、即初始化外设端口的调用顺序、您有什么建议吗? 我应该先检查 PowerOn(),然后再检查 Enable(),最后检查它是否为 Ready(),还是应该检查 PowerOn(),然后在调用 Enable()之前检查 Ready()? 再次感谢。 哈里。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="halo]SysCtlPeripheralPowerOn() 函 数修改外设功率控制(PCX)寄存器时,您对我的另一个问题,即初始化外设端口的调用顺序是否有任何建议?[/引用] PCX 寄存器仅在 TM4C129系列器件上、不在您使用的 TM4C123系列器件上。 因此、无需调用 SysCtlPeripheralPowerOn()。

    [请注意、即使对于 TM4C129系列器件、SysCtlPeripheralPowerOn()也仅在外设的子集上受支持、如 TivaWare 外设驱动程序库用户指南和器件数据表中所述。]

    建议在循环中调用 Enable(),然后调用 Ready(),等待外设就绪,因为这与 TivaWare 外设驱动程序库用户指南中显示的编程示例相匹配。 例如:

    //
    //启用 GPIOA 外设
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    //
    
    等待 GPIOA 模块准备就绪。
    //
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOA)
    ){
    } 

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

    你(们)好。 请作一些澄清。 在 Tiva TM4C123GH6PM 微控制器数据表(2014年6月12日)第656页的第10.3节中、它提到了在任何其他操作之前启用端口外设时钟。 然而、在 Tivaware 外设驱动程序库的第280页的14.3节中、没有提到启用外设时钟。 您能否查看随附文件中的代码并告诉我您认为它是否起作用? 此外,可能需要在某个地方调用 GPIOPinConfigure()函数。 谢谢。 哈里。

    e2e.ti.com/.../CCS-TM4C-GPIOA-Init.docx

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

    几个意见:

    1) 1)除非您计划在多个 TM4C 器件之间开发代码、否则实际上不需要 SysCtlPeripheralPresent。 很少会用到它。

    2) 2)您认为正确的一点是、您尝试执行的操作不需要 GPIOPinConfigure API。 它用于为特定外设(如 ADC、计时器、UART 等)配置 GPIO、它基本上用于 GPIO 多路复用、因为单个引脚将具有许多功能、但默认情况下它将仅用作标准 GPIO、因此如果您只需要该功能、则无需 GPIOPinConfigure。

    3) 3)如果使用 GPIOPinTypeGPIOOutput、则无需调用 GPIOPadConfigSet 或 GPIODirModeSet、因为这两个调用由 GPIOPinTypeGPIOOutput 进行、因此您在那里具有冗余代码、除非在 GPIOPadConfigSet 中、您希望更改推挽设置、但在大多数情况下不需要。

    不过、代码应按原样运行、只需改进即可。

    关于外设时钟的注释、这是正确的、但仅适用于具有与其关联的时钟的外设。 GPIO 引脚没有。 但是、例如、对于 ADC、您应首先启用 ADC 外设和将与 ADC 一起使用的 GPIO 端口、然后配置 GPIO (没有时钟)、 然后通过 ADCClockConfigSet API 配置 ADC 时钟(对于所有需要此步骤的外设、都有 ClockConfigSet API)、最后完成其余的 ADC 配置。 希望这可以解释 D/S 尝试通信的那部分内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好。 感谢您的支持;它非常有帮助。 我的程序现在正在执行它应该执行的操作、所以现在一切都已整理好。 此致、Harry。