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:从各个引脚读取和写入

Guru**** 2470720 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/677480/tm4c123gh6pm-read-and-writing-from-individual-pins

器件型号:TM4C123GH6PM

1)我尝试写入两个程序1)将一个数字的4位写入一个端口中的4个引脚、将第二个端口中的4个位写入2)读取这些位。 我遇到的困难是如何写入和读取各个 引脚、可能我缺少一些文档、但我似乎无法弄清这一点。  

我的端口 D 和 E 初始化如下:  

如果有人 能向我指出在哪里可以阅读或纠正我的理解 、我会很感激。 谢谢。  

void PortDInit (void){
volatile unsigned long delay;

SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOF;// 1) D 时钟
延迟= SYSCTL_RCGC2_R;//延迟
GPIO_PORTD_LOCK_R = 0x4C4F434B;// 2)解锁 PortD
GPIO_PORTD_CR_R |= 0x14;//允许更改 PF4 (SW1)和 PF2 (蓝色 LED)
GPIO_PORTD_AMSEL_R = 0x00;// 3)禁用模拟功能
GPIO_PORTD_PCTL_R = 0x00;// 4) GPIO 清除位 PCTL
GPIO_PORTD_DIR_R &=~ 0x07;// 5) PD2、PD1、PD0用于输出
//输出 PF2 (蓝色 LED)
GPIO_PORTD_AFSEL_R = 0x00;// 6)无备用功能
GPIO_PORTD_PUR_R |= 0x10;//在 PF4上启用上拉电阻器
GPIO_PORTD_DEN_R |= 0x14;// 7)启用数字引脚 PF4、PF2

//初始化 Porte
void Porte Init (void){
volatile unsigned long delay;
SYSCTL_RCGC2_R |= 0x00000010;// 1) E 时钟
延迟= SYSCTL_RCGC2_R;//延迟
GPIO_Porte _CR_R = 0x2F;//允许更改为 PE5、3-0
GPIO_Porte _AMSEL_R = 0x00;// 3)禁用模拟功能
GPIO_Porte _PCTL_R = 0x00000000;// 4) GPIO 清零位 PCTL
GPIO_Porte _DIR_= 0x08;// 5) PE3输入
GPIO_Porte _DIR_R &=~ 0x07;// 5) PE2、PE1、PE0输出
GPIO_Porte _AFSEL_R = 0x00;// 6)无备用功能
GPIO_Porte _PUR_= 0x08;//在 PE3上启用上拉电阻器
GPIO_PORT_DEN_R = 0x0F;// 7)启用数字引脚 PE3-PE0

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

    Justin、

     我看不到您写入或读取数据寄存器。 您应该有一个 GPIO_PORTD_DATA_R 我不知道您是如何在学校的头文件中定义它的。 您可以写入或读取数据寄存器。 请参阅下面以及器件数据表中的内容。 通常、我们强烈建议用户不要使用 DRM。 您将使用免费的 TivaWare 库极大地加快开发速度。

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在这里会感到困惑、我相信我已经弄清楚了这份报告
    while (1){
    int x = 0;
    INT temp = 0;

    PortD = PortD&0x00000000;
    门=门(&0x00000000);

    SW1 = GPIO_PORTF_DATA_R&0x10;

    如果(!SW1){
    while (x!= 5){
    x++;//将 x 从0递增到[某个数字]
    temp = x;//将 x 设置为数据传输的临时值
    PortD = temp&0x0F;//将前四个位传递到 PortD
    temp = temp >> 4;//准备 temp 以将剩余位传输到 Porte
    门=温度0x0F;
    Delay100ms (1);

    //一旦达到所需的数字,清除位
    PortD = PortD&0x00000000;
    门=门(&0x00000000);

    但是、我最终如何从相同的引脚读取呢?
    我一直在阅读和
    GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_1、value);
    似乎这会做正确的事情、或者我的方向是错误的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    简单:

    1) 1)写入一组用于设置/清除引脚或读取引脚的宏:IO_SET (端口、引脚)、IO_CLR (端口、引脚)和 IO_GET (端口、引脚)、 或您希望使用的任何名称。

    2) 2)编写一个函数、该函数写入这两个端口、另一个写入该端口以将其读回、如下所示:

    //写入一个数字
    
    void dat_write (uint8_t dat){
    
    if (dat &(1<0)) io_set (Port1、PIN0);else IO_CLR (Port1、PIN0);
    
    if (dat &(1<1)) io_set (Port1、PIN1);else IO_CLR (Port1、PIN1
    )...
    
    if (dat &(1<<6)) io_set (port2、PIN6);else io_CLR (port2、PIN6);
    
    if (dat &(1<<7)) io_set (port2、PIN7);else io_CLR (port2、PIN7);
    
    }
    
    
    
    //读取数字 uint8_tmp1
    
    (port1、p1<tmp1
    
    
    
    
    
    
    
    );(tmp1)<tmp1、void IO_1 (port1)(port1)(port1、tmp1)(tmp1)<t1);(tmp1)<tp1 (p1)
    
    if (io_get (port2、PIN6)) tmp |=(1<<6);
    
    if (io_get (port2、PIN7)) tmp |=(1<<7);
    
    return tmp;
    
    }
    
    

    您可以根据需要实现 IO_SET()、IO_CLR()和 IO_GET()宏,具体取决于您在其中编码的框架。

    该代码有两个优点:

    1)它与硬件无关:如果您将它移动到不同的平台,只需链接适当的 IO_SET()、IO_CLR()和 IO_GET()宏,即可开始使用;

    2)它本质上是一致的:如果您希望更改引脚/端口分配、只需修改端口1/2或 PIN0..7的定义、点击重新编译、您就知道您的代码将起作用。

    任何比这更复杂的事情、您都是在做错误的事情。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我是您、我实际上会编写两个例程、这两个例程可能会在8个不同端口上使用8个不同的引脚。 要在两个端口上运行它、只需将 PORT0..7定义设为这两个端口上。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我通常同意海报 Danny 的指导-但添加(当然需要添加) A、"完整和部分端口: 书写、清晰和阅读!"

    需要单独的位控制-但也是如此-部分和完整端口控制...

    将此类功能"扩展到(其他)平台(真正的器件)的能力可能尚未意识到(其他) ARM MCU 已长时间适应 " 16位宽 GPIO 端口"的事实-要求另一个"硬件"来跳跃...