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.

[参考译文] EK-TM4C1294XL

Guru**** 2449140 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/623183/ek-tm4c1294xl

我正在与 Keil 一起研发 TI 的 TM4C1294XL LaunchPad、一开始就遇到了问题。 我安装了 USB 和 Keil 的所有驱动程序、然后成功地将 TI 的闪烁示例上传到板上、它可以正常工作。 之后、我添加一些非常基本的代码、在默认程序中、它仅使 PN0用户 LED 闪烁、我添加了一些代码以使 PN1额外闪烁、但没有任何变化。 PN0 LED 指示灯仍然闪烁、但 PN1不闪烁。 我尝试使其他板载 LED PF0、PF4闪烁、但结果相同。 代码如下:

#include 
#include 
#include "inc/hw_memmap.h"
#include "driverlib/debug.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"

/**
@brief Program main 函数
*@param void
*@retval none
*/
int main (void)
{
volatile uint32_t ui32Loop;

/*启用 PORTN 外设访问*/
SysCtlPeripheralEnable (SYSCTL_Periph_GPION);

/*检查是否启用了外设访问。 *
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPION))
{
}

/*为 LED (PN0、PN1)启用 GPIO 引脚。 将方向设置为输出、然后
启用 GPIO 引脚以实现数字功能。 *
GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0);
GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1);

while (1)
{
/*打开 LED。 *
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0x01);
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0x01);

一位的/*延迟。 *
for (ui32Loop = 0;ui32Loop < 1200000;ui32Loop +)
{
}

/*关闭 LED。 *
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0x00);
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0x00);

一位的/*延迟。 *
for (ui32Loop = 0;ui32Loop < 1200000;ui32Loop +)
{
}
}

某些写保护功能或 Keil 是否可能导致问题?

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

    我的朋友-您在这里需要更多时间/精力-大多数 MCU 都具有您必须遵守的特性(独特要求)。

    您遇到的是 Keil 的"不"(任何)保护功能。

    查看此处(这是您的问题!):

    /* Turn on the LEDS. */
            GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0, 0x01); //this works ONLY for Pin0       
            GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_1, 0x01); // the value "2" is required for Pin1

    现在-正如您报告的那样- GPIO_PIN_0正常工作、GPIO_PIN_1不工作!

    这是许多人(包括本记者--很久以前)陷入的一个"陷阱"。   最后一个参数 w/in "GPIOPinWrite()"是要应用于参数2的"位加权参数"。   因此、GPIO_PIN_1需要值"2"-而不是"1"。   如果您试图打开(许多)端口位-只需添加每个端口的"位加权值"。   (即255 (0xFF)打开整个端口...(提供的 param 2正确匹配))

    实际上-如此多(其他)代码协议接受"1"为"高电平或开启"-但不在这里-现在不是!  (但对于 PIN_0的(非常)有限情况。)

    您也可以重复使用参数。 2作为参数3的值。  (即 (GPIO_PORTN_BASE、 GPIO_PIN_1、 GPIO_PIN_1);)  (我们没有被告知医疗修复"木匠隧道"综合征的人员提供的奖励-由这种使用带来-尤其是当多个位被如此处理时)

    这确实是奇怪的——但随着时间的推移,这将成为第二种性质……   提供了许多、许多代码示例-您可以使用此论坛的搜索功能(顶部)进一步从(其他)用户体验中受益...

    请注意-这种方法是由前 MCU 供应商("逃离现场")设计的-指导任何/所有敌对行动/投诉...

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

    感谢您的回答、我修复了我的代码、它起了作用! 以下是我的代码的重要部分:

    /*打开 LED。 */
    GPIOPinWrite (GPIO_PORTN_BASE、(GPIO_PIN_0 | GPIO_PIN_1)、(GPIO_PIN_0 | GPIO_PIN_1));
    
    一位的/*延迟。 *
    for (ui32Loop = 0;ui32Loop < 6000000;ui32Loop +)
    {
    }
    
    /*关闭 LED。 /
    GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0 | GPIO_PIN_1、0x00);
    
    一位的/*延迟。 *
    for (ui32Loop = 0;ui32Loop < 6000000;ui32Loop +)
    {
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    适合您-相信您(现在)已经很好地理解了这种(有点奇怪)代码格式。 使用-这将强化自身-您应该"没有问题"。 请注意、当设置具有端口的"多位"时、代码将扩展到2行(可能甚至是3行!) 将十六进制表示法用于(两个)参数2和3的值-可以简化您的人工-但"不"自记录-"GPIO_PIN_x"等方法也是如此。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    CB1、

    正如您之前提到的、第三个参数的一个有用的想法是:

    #define GPIO_PINS_ON 0xFF //将第2个参数中提到的任何引脚驱动为高电平
    #define GPIO_PINS_OFF 0x00 //将第2个参数上提到的任何引脚驱动为低电平

    然后使用

    GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1 | GPIO_PIN_4、GPIO_PIN_ON);

    此致

    布鲁诺

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    事实上,我的(同伴)腕带(即无晶闸)朋友。

    通常会经常出现"引脚模式"、然后"GPIO_PINS_ON"可能会替换为"GPIO_Pattern_N_ON"。
    我的(当前)手腕骨折-欢迎任何将我从"输入8个长端口位描述符"中节省的东西... (即使他们"记录得很好"、尤其是他们"记录的很好"。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    员工/我经常使用"B3_ON"-"C7_OFF"作为(两者)"手腕、节能和省时"。

    与更基本的"A4_ON"相比、"GPIO_PIN_X"的无限重复实际上证明"更难识别"。 必须创建新的"定义"(仅一次)以适应这种情况:"时间、能源和腕部节能"技术...

    布鲁诺-聪明/有经验的 BIZ 家伙说你是-我会给你5:1的机会"美国的赢家 "开放"锦标赛-(女性)是美国人。   (此类优惠不会经常发生-您知道...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从稍微不同的角度来看、增加一个小部分

    GPIOPinWrite 可能名称错误。 它的命名方式应该更类似于 GPIOMultiplePinWrite、后者更接近于它的函数。 这种命名错误在很大程度上造成了对其使用的误解。

    现在、我已经编写了一个用于设置多个引脚的函数、我怀疑开发团队看到不需要为单个引脚情况创建一些东西。 在这方面,我基本上同意他们的意见。 我认为在键入方面节省的成本并不足以证明添加其他函数/宏是合理的。 此外、添加多种设置引脚的方法会增加编写和理解生成的代码所需的资源。

    话虽如此、您可以添加一个简单的宏或函数、该宏或函数的存在将满足 CB1的目标、即减少键入内容并略微提高理解程度。 您可以创建一个 GPIOSinglePinWrite (它的存在意味着另一个是多引脚功能)。 它将 A 开/关和单个引脚 ID 宏(而不是当前函数中的多个)作为其最后一个参数。 这可以很容易地转换为宏或函数中的适当参数。 如果需要、也可以沿着相同的线路为 GPIOMultiplePinSet 和 GPIOMultiplePinClear 编写宏/函数。

    Robert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ***喜欢***(我如何对待"有权"的人/团体-比你/Jens/Bruno/Me 聪明得多-他"杀死了自己的东西!")

    说得好——iirc—过去我收到了这样的“简化”的“热”——但是你在这里的计划证明了一个很好的实施……

    (请注意 Chi (同修)高速驾驶驾驶员-没有任何技能过强的 CB1 (不久)进入 LSD (Lake Shore Drive)、配备由"跛行"驾驶员控制的" 8个摄像头和半自动跑车"(几乎)。 (以及功能强大的"R-52 ARM MCU") CB1附近/附近的司机都被禁止了!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="CB1_MOBILE"]
    说得好——iirc—过去我收到了这样的“简化”的“热”——但是你在这里的计划证明了一个很好的实施...[/引述]

    谢谢。 在这方面,我发现自己有一个空闲的时间,所以这是一个未经测试、未经编辑、未经线性化的例子,可以作为起点。 这只是完整工作代码所需的片段。 不需要任何包含或标头定义。

    /*用于引脚 I/O 增强的宏。 这些宏有两个目标
    * 1 -对单个宏的 TIVAware 函数提供一些清晰
    * 引脚大小写以及将多个引脚设置为相同值的情况。
    * 2 -减少 long 参数的键入负载。
    *
    *即使通过编译、这也完全未经测试。 它的唯一用途
    是*作为一种可能的方法的说明。
    *
    *由于这只是一个示例、因此缺少一些有关参数的文档。
    *填入这些内容并测试结果将留给读者练习:)
    */
    
    typedef enum{
    PIN_OFF、
    PIN_ON
    } PIN_STATE;
    
    /*更改给定端口上单个引脚的值。 这可以写入
    *作为一个函数、这样做会有好处。 它
    *将会有更多的拼写错误、并且不会有潜在的风险
    *对参数引脚进行多次评估。 //
    #define GPIOSinglePinWrite (port、pin、state)(((state)== PIN_ON)? \
    GPIOPinWrite ((port),(pin),(pin)):\
    GPIOPinWrite ((PORT)、(引脚)、0))
    
    /*同时为给定端口上的多个引脚设置输出。
    *这可以作为函数写入、也可以作为函数写入
    *这样做的好处。 不会有潜在的风险
    *对参数引脚进行多次评估。 //
    #define GPIOMultiplePinSet (port、pins)(GPIOPinWrite (port)、(pins)、(pins)))
    
    /*同时清除给定端口上多个引脚的输出。
    *这可以作为函数写入。 //
    #define GPIOMultiplePinClear (端口、引脚)(GPIOPinWrite ((端口)、(引脚)、0)) 

    Robert

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

    [引用 user="Robert Adsett72"]未经测试、未编译、未线性示例

    先生-您是否刚刚描述过(代码的95%以上)-是否经常来这里?    (即使是匆忙、"无样"的供应商员工)

    如果我可以-可以:

    GPIOMultiplePinWrite ((PORT)、(引脚)、(引脚))

    通过以下方式加强:

    GPIOMultiplePinWrite ((port)、(PIN_IN_ARRAGE_n)、(PIN_SELECTED))

    现在、我的(同样)"未经测试、未编译和未线性"提交-尝试(更好地阐明)"什么"和(总是麻烦的)参数:2和3。"

    请注意、我的"仅更改名称"(即快速"油漆作业")尝试"更好地阐明参数的作用:2和3。"

    虽然您(当然)知道这一点、但其他人必须确保任何这样的"代码构建"都会产生"无干扰"位来设置和清除!    (论坛可以更好地做到"禁止干扰"-而不是像那样获得收益!")

    我可能(甚至)"吸入"吻的元素!    (进一步恐怖(我们的)无像(无灵感/无理解(有权))) crüe)

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

    [引用 USER="CB1_MOBILE"]

    如果我可以-可以:

    GPIOMultiplePinWrite ((PORT)、(引脚)、(引脚))

    通过以下方式加强:

    [/报价]

    您将注意到、我的示例中没有多个引脚写入。 由于它已经存在、我没有复制它、甚至没有重命名。 我生产的是辅助套件、尤其是许多人似乎难以处理的单引脚写入。

    我的感觉是、虽然添加多引脚写重命名可能会有一个小的好处、但大多数这种好处都是通过单个引脚写变体实现的(这意味着另一个函数是多引脚写形式) 对于以后读取代码并且已经熟悉 TIVAWare 的任何人、使用通常命名的版本是一个优势。

    Robert

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

    无可争辩-真的吗?    "无可争辩"(真的)是否意味着"未充分研究/探测/调查-或等待新的/更好的事实?"

    某些(超越工程设计)学校在使用时教授"谨慎"的价值:"始终、从不或无可争议"。   在每种情况下、"打开用户"一词都会给"巨大的举证责任"。   确实要小心(最常)!    (请注意(对冲)"最多")