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.

[参考译文] TM4C123GH6PM:TM4C123GH6PM 中的系统时钟

Guru**** 2473260 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/682888/tm4c123gh6pm-system-clock-in-tm4c123gh6pm

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

您好!

我尝试设置 UART1已完成 GPIO 和 UART 的设置。 我通过 UART 传输的数据将传入 UART_DR (我使用 Keil 和 CMSIS 内核库对其进行编码、在仿真窗口中、我可以读取 UART_DR 中的数据)、但我在 Keil 调试器的 UART1窗口或串行控制台上没有看到任何内容。

下面是用于配置 GPIO 和 UART 以及 main 函数的代码片段。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#define U1RX (1<<4)
#define U1TX (1<<5)
#define PORTC (1<<2)

#define TXFF (1<<5)
#define RXFE (1<<4)
#define UART1EN (1<0)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

空 GPIO_Init()

SYSCTl->RCGCGPIO |= PORTC;//启用 PORTC
GPIO->AFSEL |=(U1TX | U1RX);//将引脚功能设置为备用功能
GPIO->PCTL =(GPIO->PCTL & 0xFF00FFFF)+ 0x00220000;//将备用功能设置为 UART1 (PMC5 = 0x0010且 PMC4 = 0x0010)
GPIO->DEN |=(U1TX | U1RX);//启用 UART 引脚的数字功能(PC4 = 1和 PC5 = 1)
GPIO->AMSEL &=~(U1TX |U1RX);

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

空 UART_Init()

SYSCTl->RCGCUART = 0x02;//启用 UART1
UART1->CTL |=~UART1EN;//配置前禁用 UART

UART1->IBRD = 0x08;
UART1->FBRD = 0x2C;//波特时钟为16MHz,BR = 115200
UART1->LCRH = 0x60;// 8N1、FEN 被禁用
UART1->CC = 0x5;//选择时钟源作为 PIOSC 系统时钟
UART1->CTL |= UART1EN;//启用 UART

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int main()

uint8_t data[]={"TM4C123GH6PM UART TX 演示"};
uint8_t i、ch;

GPIOC_Init();
UART_Init();

对于(i = 0;data[i]!='\0';i++)
UART_Send (data[i]);

while (1);

我还禁用了在启动时使用的 system_TM4C123.c 文件中的时钟设置。 因此、在执行所有这些操作后、我不理解为什么在 UART_DR 中获取控制台数据时无法获取数据?

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

    我的朋友-即使是偶尔使用 Keil IDE 的用户-您的问题是、"以 Keil 为中心"(尤其是 Keil 串行控制台部件)、我"感到很损失"。

    由于 Keil 强调得如此强烈-您的问题是否也会因为在他们的论坛上"包容"而受益?

    而且-您(继续)使用"DRM"会给您的"Helper Crüe!"添加重要的"时间/精力"、这是否(过去)值得注意?   您确实关心我们(至少有些)-这不是真的吗?   采用更受欢迎、更高效的供应商 API、可以 "加快并简化"您的帮助者工作、更重要的是、您自己的工作!

    我们还注意到-您的主题行"TM4C 中的系统时钟..." 似乎(几乎)附带的-当 您绝大多数人相比时、"以 Keil 为中心"的帖子...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 CB1_MOBILE 对我的问题给予的热情关注。

    我同意您的意见、我提到了我的 Keil 控制台问题、但实际上我认为我在配置时钟或外设时出错、因为我使用的器件来自 TI、我认为我可以将其添加到 E2E 社区中。 我的目标是弄清我在进行 w.r.t 器件配置时所犯的错误。

    此外、在这里添加这个问题也是我认为时钟配置不正确的原因、我认为这个线程属于 TM4C 中的系统时钟、我认为它可能是正确的位置。 我真的很抱歉在这里添加问题、因为我在发布时没有考虑到相关问题。 我同意您的看法、在这里发布此问题会产生误导、因为我的问题不能明确我在时钟配置方面发现错误的意图。

    感谢您将此内容提交给我、我将通过单击"作为新问题"选项卡创建新主题。 )

    现在、关于供应商 API、是的、我同意使用 API 会加快该过程、但由于我是一名硬件工程师、并且在很长时间后尝试进行代码处理、我认为我应该为至少标准外设(如 UART、I2C)编写一种裸机代码、 SPI 等、这样我就可以将嵌入式技能提升到非常基本的水平、在我感到舒适之后、我就可以使用标准 API。请告诉我这种方法是否正确? 很抱歉、它造成了问题。 我不打算这样做。

    再次非常感谢您让我意识到、在发布问题时、我应该保持一点警惕、并尽可能清晰地发布问题、以便人们能够轻松地帮助我并解决我的问题。 将来我一定会小心、现在我将为这个问题创建新的主题。

    谢谢、
    好的
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这可能会有所帮助: github.com/.../TM4C_LM4F120

    它是在 TM4C CMSIS 头文件的基础上编写的、因此应作为芯片的副本和粘贴。

    您还可以看到 LM3S 文件-编写方式类似。 这些基于结构的方法的忠实粉丝、希望 TI 有一天能够采用这些方法。

    令人疯狂的是、这些头文件是由 TI 创建的、因此没有理由它们也不通过 CCS 分发它们。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    "请告诉我这种方法是否正确?"

    对于所有情况、这不是"正确"或"错误"的方法。 任何最适合您的产品。

    对于这些 TI 芯片、我从 StellarisWare 开始、而是从中间层开始使用、然后目标是摆脱 StellarisWare/Tivware。 OEM 库可让您快速掌握新芯片、但它们并不是为您的编码风格或应用而编写的、因此它们既不是最高效也不是最易于使用的。

    中间层的使用使我能够将代码移植到不同的芯片、而无需对代码库进行大量修改:在目标的正确中间层中进行链接、我正在做生意。

    Luminary 采用的"寄存器"方法和 TI 采用的方法使编码复杂芯片变得更加困难、因此我选择了 CMSIS 头文件。 没有任何遗憾。 我认为整个行业已经朝着这个方向发展了很多、TI 也应该这样做。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "UART1->CTL |=~UART1EN;//配置前禁用 UART”

    这条线错误。

    我也没有看到 UART_SEND (),但一般来说,您应该轮询标志,以确保缓冲区或移位寄存器为空,然后再加载新数据。

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

    我的朋友--没有人相信--或要求--任何道歉。   我的意图是通知-因为您的帖子(非常)基于"内幕人员" Keil (再次-尤其是"串行控制台部分!")   这对(大多数)论坛用户来说"有点多"-这里。

    [引用 user="amey M"]我认为我应该为至少标准外设(如 UART、I2C、SPI 等)编写一种裸机代码、以便将我的嵌入式技能提高到非常基本的水平、并且在我感到舒适之后、我可以使用标准 API。

    您并非孤军奋战(赦免)"毫无道理-希望/希望!"   您选择了"思考"一词-但绝对有" 没有一个词描述、解释或证明了正确-只是 "DRM" 如何满足这样的要求、"嵌入式技能刷漆!"   减去这种"理由"----是否可以完全/适当地认可"思想"一词?   这就是 为什么在我看来、"希望/希望"这几个词证明"作为 DRM  的优势描述符!"  没有什么(错)“愿望/希望!”    

    对于您合理的要求、 "放大裸机"的理解-这是如何通过始终如一的 "计划开发失败"而获得的-无论如何-   

    的(很可能)"成功"(通过 "久经考验、成熟可靠、极其详细的 API")与您的关键寄存器详细视图(通过"开放"MCU 手册)相结合 、"提升您的裸机能力?"   同时更快速、更轻松-并且记录更多!)

    您可能想问:"为什么(始终)此类声明代表"DRM"(完全不存在) -"API 用户"的能力-" 查看和调查"-这些 "完全相同的 MCU 寄存器?"   

    此外 - DRM 中声称了"添加学习"-为什么"执行如此多(就像您一样)需要"救援"-当此类 "添加学习"导致 (重复)失败的程序时!   这种(经常重复) 但从未有理由/描述过的"索赔"是否是 一种"巨大的过度陈述-没有任何事实?"

    难道 不是" DRM 支持者"(也许是"两者")、而不 是"方便地过度审视明显的事实: " MCU 注册研究/审查"-绝不是(过时的) DRM 的专属省份?

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

    下面的示例展示了基于结构的方法的美妙之处。

    在 uart0.c/.h 文件中、我将 UARTx 定义为:

    //#define UARTxUART0
    

    UART0在该器件的 CMSIS 样式头文件中定义、UART1..7也是如此。

    从那时起、编码被执行到 UARTx、而不是 UART0。 例如:

    //停止 UART
    UARTx->CTL &=~(1<0);//1->启用 UART,0->禁用 UART
    

    或  

    //计算整数波特率
    UARTx->IBRD = F_UART/波特 率/ 8;
    //计算小数波特率= 64*小数
    UARTx->FBRD =(8 * F_UART /波特率- UART0->IBRD * 64);
    

    uart0的工作完成后、我只需复制并粘贴代码、然后将 UARTx 定义更改为 UART1。7.点击"recompile"、我就可以开始工作了。

    根据 TI 提供的库存头文件中的寄存器定义、这种方法是不可能的。  

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

    [引用 USER="Danny F"] 根据 TI 提供的库存头文件中的寄存器定义,这种方法是不可能的。  [/报价]

    评论(上面)-在 合理 的支持和合理的情况下、不会再响(甚至有点响)"正确"吗?   否则- 它不是(无记录的)意见?"

    在使用这些" 寄存器定义"和"库存头文件"之后、  是否"立即注意到" API 中存在相当程度的"编码并行性"?"    尤其是 在每个 MCU 外设的"多实例化"之间。   (包括海报 "多个 UART 用例"。)

    最后-您是否没有(方便) 通过 "每个/每个 MCU 外设"( 您可能已经注意到-有许多)来"掩盖"重要的"所需的额外时间/精力  "、从而试图创建(仅限于)所谓的"结构化万灵丹?"   而且 、" 经测试/证实/广泛的代码示例"中的"大量"是否  通过这种"结构化方法"而痛苦地降级?

    种结构化方法的所谓"美"(主要是)通过" 真实信徒"的(过度玫瑰色)镜头存在吗?

    到目前为止- API、 "最好满足 当前和持续的需求、 "效率和稳健的编程/学习需求"、 所有这些都是如此。"    (即使是那些配备了"玫瑰镜"的设备。)