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.

[参考译文] TM4C1294NCPDT:根据 GPIO_base 计算 PERIPH 参数

Guru**** 2439710 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/614112/tm4c1294ncpdt-calculate-periph-parameter-from-gpio_base

器件型号:TM4C1294NCPDT

我知道这是可能的、但我没有找到提到它的文档。

在给定端口基址的情况下、如何确定 GPIO 端口的外设 uint32值?

简单地说、我想做一个小 GPIO 配置函数、可以将此示例中的功能简化为以下代码:

空系统实用程序 GPIOSetAsOutput (base、PIN)
{
//首先,根据 base/PIN 信息确定 Periph (此处未完成)
if (!(SysCtlPeripheralReady (Periph)))
{
SysCtlPeripheralDisable (Periph);
SysCtlPeripheralReset (Periph);
SysCtlPeripheralEnable (Periph);
while (!SysCtlPeripheralReady (Periph));
}
GPIOPinTypeGPIOOutput (base、PIN);
}

为清楚起见、我在这里指的是 SYSCTL_PERIPH_GPIOA。

强制应用传递外设参数看起来很难看、因为我们知道它是一个 GPIO 端口、并且知道端口地址(当然、通过查找适当的 Tivaware 包含的文件)、这当然可以"创建"它

我过去在下面的主题上发布了类似的内容。 当 Veikko Immonen 提出了一个有趣的建议时、它仍然不是我想要的-它不适用于 GPIO、而只适用于替代外设多路复用器设置。

e2e.ti.com/.../580747

此致

布鲁诺

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

    [引用 user="Bruno Saraiva"]过去在下面的主题中发布了类似的内容

    这可能是"下面哪一个?"   (即对本记者不可见、"高层次查看"破解人员...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    几毫秒前、我对原始帖子的编辑跨越了回复的路径。 我也注意到"下面"是屏幕的关闭限制...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴注意到(并提供建议/协助)。

    我们"接受问题"、但您使用"计算"一词(在主题行中)。 实际上-对于非常相似的功能块(例如 GPIO)、很可能存在可预测、步进、线性关系。 (这符合您"计算"的愿望)

    上述内容/已承认-当从(任何)一个功能块移走时、"计算能力"会受到影响、"查找表"似乎更适合...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我点了布朗尼蛋糕时、我也会对小蛋糕很满意。

    如果 TivaWare 文件中的某个位置存在这样一个查找表、就可以这么做。 我知道的最接近的是 PIN_MAP.h、但这不是它的作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们会"震惊"它(查找表)的存在-"计算"(仍然)的选择似乎一次仅限于一个外设-并且在另一个外设被类似处理时失败。

    (食品订单(显然没有计算)-不知为何-逃避我们的来源确认...)

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

    如果我理解正确的话、Bruno 就是在尝试创建一个函数来设置 GPIO 引脚特性并启用它、而不受端口影响(IE 事先不知道端口)。

    我可以理解您为什么要这样做以及为什么这看起来是个好主意、但我要提出一个警告(实际上是几个)。 首先是努力/奖励比率。 虽然您完全不关心执行过程中所需的额外时间、但您需要花费一些时间来优化初始化代码和参数、这些代码和参数只在应用中使用一次。 在我看来、您承担的风险很大、即花费的精力远远超过文档中的支出或减少的工作量。

    任何类似的工作都依赖于对多个项目(可能是微项目)的回报。 您会遇到寄存器关系在微秒之间变化的风险、这可能很小。 TIVAWare 库将进行更新、以更好地处理该问题、但您需要这样做

    • 请注意
    • 相应地更新您的库。

    话虽如此、如果您一直坚持这样做、我建议的方法比您建议的方法简单得多。 只需使用 switch 语句即可。 根据基址输入、并根据基址选择外设地址。 不要过度努力、您的储蓄不足以证明这一点。

    总之、仅开发初始化模式(包括文档)可能会提高很多效率。

    另一点。 我会考虑这一点

    [引用用户="Bruno Saraiva"] while (!SysCtlPeripheralReady (Periph));[/quot]

    代码错误。 而应该是这样

    while (!SysCtlPeripheralReady (Periph)){
    } 

    循环应始终使用其代码主体的括号。 无例外。 否则,请邀请*ahem*有趣的虫子。 你可能已经这样做了,但我认为值得强调。

    Robert

    抽奖活动:xkcd

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

    您好、Robert、

    这些(简洁的)绘图需要记住"Rube, Goldberg"(几乎),它们不是吗?    (我们还需要一些"过渡点"-可能还有"错误捕捉器"图示)

    喜欢您的观点:"不要过度努力、您没有足够的储蓄来证明这一点。"   虽然 B 的主题行包括"计算"-此类练习(时间/努力的理由)-如果有的话-似乎 没有进行。  (因此无法收集"投资回报"...)

    工程图"有力、清晰且令人信服"表明了(您/我经常展示的)"过早优化"这一点。    (因此、通常会产生 "偏离中心任务..."的"意外"(但可预测)结果)

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

    [引用 USER="CB1_MOBILE]这些(简洁)绘图需要记住"Rube Goldberg"(几乎)、它们不是吗? [/报价]

    您可以为这个提供 xkcd。 有时、一个小线条图会非常雄辩。

    Robert

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

    [引用用户="Robert Adsett72"]有时,一个小线条图会非常雄辩

    如此真实-并且可能证明、"比(其他)建议的"方法/对比/评论"模式"更具外交性"。    (尤其对那些具有"有限艺术技能"的人来说——请不要说"唱歌、跳舞或画画"@多种(过去)庆祝活动!)

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

    您好、Robert、

    我们并不是真的对这种或任何事情都感到困住-这只是为了代码的清晰度。 虽然本讨论简化了原始示例、但最后我们希望能够致电:

    系统实用程序 GPIOSetAsOutput (base、PIN、PADCONFIG、PADSTRENGTH、INITIALVALUE);

    嗯、如果我们再向它添加一个参数、这不会伤害任何人。

    系统实用程序 GPIOSetAsOutput (Periph、base、PIN、PADCONFIG、PADSTRENGTH、 INITIALVALUE);

    至于查找表的想法:就像这样简单的表一样、如果预编译了 SystemUtilities 库、我不确定是否可以这样做。 很容易看出、如果基本参数是 GPIO_Porta_base、则关联的外设是 SYSCTL_Periph_GPIOA、但这只是一个宏、对于不同的目标 p/n、实际值可能会有所不同。 我想预编译的表会失败...  

    在每个项目的示例上、有许多"简单方法"可以重复这些行30次、每个输出引脚一种。 至于外设本身、在配置引脚之前只启用所有 GPIO 端口不会有任何影响、最后介绍... 尽管如此、拥有一 个干净且可靠的 GPIOSetAsOutput 解决方案会很好、该解决方案也可以处理系统外设初始化。

    (哦、关于括号、我在粘贴代码时去掉了它们、只是为了使其看起来更好-但是、 我不得不承认,我不知道好的做法是把它们作为强制性的,因为守则似乎在这种特定环境下运作良好。)

    我喜欢并完全同意你所附的抽签。 我在这里的一位同事对一切自动化都很讨厌! 最后、他将花一周时间自动执行一种方法、以便在早上打开办公灯、而清洁女士只需打开门、然后在开始工作之前翻转墙上的开关即可...

    但是、改变自己的想法是、不是吗?

    为所有耐心和有灵感的朋友干杯,度过美好的一周,他们不断地为这群人的启迪增添灵感!!!

    布鲁诺

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

    [引用用户="Bruno Saraiva"]我们并不是真的对这一点或任何事情都很关注-这只是为了代码清晰

    是的、明白情况是这样的。

    [引用 user="Bruno Saraiva">但这只是一个宏,不同的 p/n 目标的实际值可能不同。 我想预编译的表会失败...  [/报价]

    偏移也可能是如此。 我不希望任何一个案例目前都是真实的,但是…

    这就是为什么我建议更好的解决方案是初始化模式(或一组)、而不是函数。 除非您在同一个系列中执行大量截然不同的项目、否则我看不到回报。 开发、测试和维护将比使用模式花费更长的时间。

    然而,就总体发展而言,还有另一种选择。  使用 C 的宏工具。 这消除了对不同微控制器具有不同偏移和端口地址的任何担忧。

    [引用 user="Bruno Saraiva"](哦、关于括号、我在粘贴代码时去掉了括号、只是为了使代码看起来更好-但是、 我不得不承认,我不知道好的做法是把它们作为强制性的,因为守则似乎在这种特定环境下运作良好。)[/引述]

    很好。

    关于其错误的原因、请快速查看以下代码块

    /* Snippet A */
    while (1)/*在这里停止*/
    blowup ();
    
    /* Snippet B */
    while (1);/*永久保持脉冲*/
    Puls(); 

    找到这些错误需要多长时间? 您认为他们在读取代码时会被您打滑的容易程度如何(想象一下由于偶尔的标志差异而发生的间歇性错误。 现在想想、如果丢失的括号被自动视为缺陷、那么发现它要容易得多(我已将 PC-Lint 设置为强制执行此操作、这意味着我甚至不需要依赖 Mark I 人眼球。

    Robert

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

    [引用 user="Robert Adsett72"]找到错误需要多长时间?

    当然、在事先警告过之后、我花了不到137.5ns 的时间才发现这两个错误。 但我完全理解并赞赏这一解释!

    至于最初的目标、我决定放弃将外设初始化包含在引脚配置函数内的愿望-周期! 对于 sanity、只需初始化整组端口并让其完全初始化即可。

    当前语法可能会持续很长时间:

    系统实用程序 GPIOSetAsOutput (LED_STAT1_base、LED_STAT1_PIN、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD、0);

    处理背景上的特殊/锁定引脚。 它适合"一条线"、而不是3或4、这只是个人偏好...  

    布鲁诺