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.

[参考译文] TM4C123GE6PM:等待外设就绪状态的正确方式是什么?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/669133/tm4c123ge6pm-what-is-the-correct-way-of-waiting-for-a-peripheral-ready-state

器件型号:TM4C123GE6PM

我想我知道该主题的问题的答案、但还是让我解释一下我为什么要问这个问题。

我正在参加 EDX 课程 嵌入式系统-塑造世界:微控制器输入/输出。 在其中一个讲座中、有一个代码片段让我非常困惑。 以下是该代码的重要部分:

#include "tm4c123geP6.h"

//用于初始化输入和输出端口 F 引脚的子例程
// PF4是输入,PF2是输出
void PortF_Init (void)
{
volatile unsigned long delay;

SYSCTL_RCGC2_R |= 0x00000020; // 1)激活端口 F
延迟的时钟= SYSCTL_RCGC2_R; //留出时间让时钟启动

GPIO_PORTF_LOCK_R = 0x4C4F434B;// 2)解锁 GPIO 端口 F
GPIO_PORTF_CR_R = 0x1F; //允许对 PF4-0进行更改

//只需要解锁 PF0、其他位不能被锁定
GPIO_PORTF_AMSEL_R = 0x00; // 3)禁用 PF
GPIO_PORTF_PCTL_R = 0x00000000上的模拟;// 4) PF4-0
GPIO_PORTF_DIR_R = 0x0E 上的 PCTL GPIO; // 5) PF4、PF0 in、PF3-1 out
GPIO_PORTF_AFSEL_R = 0x00; // 6)禁用 PF7-0
GPIO_PORTF_PUR_0x11上的 alt funt; //在 PF0和 PF4
GPIO_PORTF_DEN_R 上启用上拉电阻= 0x1F; // 7)在 PF4-0
上启用数字 I/O }

让我感到困扰的是第10行。 我知道这行代码的用途是什么。 但为什么它是这样写的呢? 这是 TI 微控制器代码中的某种特殊等待方式吗?

在 诊断 TM4C 器件的常见开发问题和提示与信息的第2期中 、使用更清晰的代码来解决相同的问题。

请不要将我的问题视为对代码作者的批评。 我真的很困惑。

R

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 RRD、
    您应遵循 e2e.ti.com/.../374640中的建议。 您的教科书示例仅从寄存器中读取。 文本示例假设在对刚刚被写入的寄存器进行读回后、外设就绪、但情况可能并非如此。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在我正在参加的 EDX 课程的 Piazza Class 中找到了我的问题的答案。

    它指出、等待外设就绪状态有两种替代方法:

    使用 DELAY=GPIO_RCGC_2;(延迟声明为易失性)→需要6个系统时钟才能执行(在非常特殊的情况下、它可以在3个系统时钟中执行)。 足够的延迟*。 如果延迟未声明为易失性、则只需4个系统时钟即可执行(在非常特殊的情况下、它可以在2个系统时钟中执行!! 我们遇到了麻烦!)

    2.使用 while ((GPIO_RCGC_2&0x20)!=0x20);(端口 F 时钟)→从8到11个系统时钟执行。 延迟、但比上一个延迟更长。


    *模块时钟启用后、必须等待至少3个系统时钟才可访问该模块中的任何寄存器。


    很好! 现在我知道为什么使用了这个丑陋的代码,但是我想知道社区成员对这个主题的看法。 我应该使用备选方案1还是2?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    突出显示的行看起来不像延迟。 您似乎正在为一个名为"delay"的变量分配一个值。 我想、为变量分配一个值需要几个时钟周期。

    while (!SysCtlPeripheralReady())持续轮询寄存器直到外设就绪。 TivaWare 用户指南中的"此函数确定特定外设是否可以访问。 如果外设未启用、保持复位状态、或者在启用或退出复位后准备就绪、则外设可能处于非就绪状态。"

    源代码是  

    bool
    SysCtlPeripheralReady (uint32_t ui32Peripheral)
    {
    //
    //检查参数。
    //
    Assert (_SysCtlPeripheralValid (ui32Peripheral));
    
    //
    //查看此外设是否就绪。
    //
    RETURN (HWREGBITW (SYSCTL_PRBASE +((ui32Peripheral & 0x0000)>> 8)、
    ui32Peripheral & 0xff);
    }
    
    #define HWREGBITW (x、b) \
    HWREG (((unsigned long)(x)& 0xF0000000)| 0x02000000 | \
    (((无符号长整型)(x)& 0x000FFFFF)<< 5)|(((b)<< 2)) 

    阅读数据表中的系统控制寄存器说明、了解这些地址寄存器的功能。 以 GPIO 为例、在 TM4C129XN 数据表中、"PRGPIO 寄存器指示 GPIO 模块是否就绪、可由软件在功率状态发生更改、运行模式计时或复位之后访问"


     SysCtlPeripheralReady()看起来更安全。 编译器可能会删除延迟技巧。 如果编译器认为未使用变量、则可以将其作为优化删除。 您最好先检查指示您已准备就绪的寄存器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、您"提醒"(通常在这里)-和可能的"介绍"(在本海报中)- API 源代码的可用性和有用性。 不幸的是-海报的课程继续被误导、"使用和仅使用 DRM "-这没有任何这样的代码详细说明。

    请注意、DRM 要求的"时间/努力/复杂性"导致(不必要)解锁了从未"锁定"的"PF1-PF4"。 这种"在杂草中起步"的努力/错误结论可能会被视为过时、过于苛刻的 DRM 的结果、而长期以来、强大、记录良好且"久经考验"的 API 就"踢脚"了。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗨、CB1_MOBILE。 您说的是、我要学习的课程不是对 TI ARM 微控制器编程的好介绍吗? 我刚开始学习课程、我对课程不是很满意、原因有几个:

    它们始终 代码中使用的每个寄存器#define 符号常数、我不知道原因。 ARM 编译器附带一个带有这些定义的 API、对吗?

    他们使用 Keil ARM-MDK 而不是 CCS。

    3.我觉得自己在学习 TI TM4C 编程时走错了路。

    您能给我点一些备选方案吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、RRD、

    我对您正在学习的课程有一些了解、因此请允许我发表一些意见。

    Valvano 的课程在概念层面上非常好、如果他们深入研究 RTOS、他们也非常喜欢测试主要 RTOS 概念的基础知识。 但是、对于实际使用和应用、当您进入行业工作时、教授的许多更精细的细节最终会被抽象到库中。

    在大多数软件中、您不会看到直接寄存器操作(DRM)调用。 相反、对于 TM4C、TivaWare 等驱动程序库用于处理所有 DRM 方面的问题、同时作为客户、您可以利用一组 API 来处理每个单独外设、因为它们需要根据器件数据表进行处理。 它不是万无一失或100%完美的、有时您必须为利基应用程序创建自己的功能、但它涵盖了95%以上的所有用例。

    尽管如此、我认为、只要您还了解到您看到的并不一定是您在最后所做的事情、那么理解表面下方的内容就有很大的价值 我不直接使用我在大学 MCU 课程中学到的很多知识、但不同外设工作原理(计时器、串行通信、中断等)的基本原理总的来说非常宝贵。 只是不要指望能够立即对任何 MCU 进行编码以实现所需功能、而无需投入时间首先了解每个系列及其各自的驱动程序库。

    CCS vs Keil (以及 even vs IAR)是自己的争论点。 Keil 支持更多 MCU、因为它不是一家供应商独家提供的、而 CCS 仅限于 TI 处理器/MCU。 对于总体学习来说、即使由于使用 CCS 而没有亲身体验、我也会愚蠢地将 Keil 视为一个好选择。 但是、如果您个人想了解 CCS 的更多信息、您可能会发现 这对您有所帮助:https://training.ti.com/getting-started-code-composer-studio-v7

    最后、我们没有任何类型的大学级课程可以使用 TivaWare/CCS、但 TivaWare 提供了大量示例程序来学习如何配置和利用各种外设以及大量文档。 它不像有视频讲座、但这是了解如何真正利用该器件的好方法。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yuppies 为 Amish 在汇编过程中编码的工匠固件支付更多的费用。