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.

[参考译文] CCS/TMS320F28377D:数据表或参考手册中的 GPIO 索引是什么意思?

Guru**** 2601915 points
Other Parts Discussed in Thread: TMS320F28377D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/676221/ccs-tms320f28377d-what-does-gpio-index-mean-in-datasheet-or-reference-manual

器件型号:TMS320F28377D

工具/软件:Code Composer Studio

您好!

我想使用 GPIO48和 GPIO49作为串行通信的 Tx 和 Rx。 我需要更改 GMUX 和 MUX 寄存器。 在 TI 库(F2837xD_GPIO.c)中  有一个函数 void GPIO_SetupPinMux (UINT16引脚、UINT16 CPU、UINT16外设)。 我使用此函数更改寄存器。 多路复用器寄存器(GPBMUX2)已正确更改、但组多路复用器寄存器(GPBGMUX2)未正确更改。 它写入的值始终为零、而不是正确的值。 如果我将正确的值写入组多路复用寄存器、一切都正常。

在数据表(tms320f28377d.pdf、第41页、表4-3)或技术参考手册(spruhm8g.pdf、第914页、表7-8)中、这是一个名为"GPIO index"的列。  

什么是 GPIO 索引? 我是否应该为该索引在一些寄存器中写入一些内容?

这是 TI 库(F2837xD_GPIO.c)中的功能

//
// GPIO_SetupPinMux -设置指定引脚的外设多路复用。 。
// 可以在 GPIO 复用中找到适当的参数
// 数据表中的引脚表(4.4)。 使用 GPIO 索引
// 行(0至15)、用于为 GPIO 选择多路复用选项。
//
空 GPIO_SetupPinMux (UINT16引脚、UINT16 CPU、UINT16外设)
{
易失性 uint32 *gpioBaseAddr;
易失性 uint32 * mux、* gmux、* csel;
uint16 pin32、pin16、PIN8;

pin32 =引脚% 32;
pin16 =引脚% 16;
PIN8 =引脚% 8;

gpioBaseAddr =(uint32 *)&GpioCtrlRegs +(引脚/32)* GPY_CTRL_OFFSET;

//
//完整性检查有效的 CPU 和外设值
//
IF (CPU > GPIO_MUX_CPU2CLA ||外设> 0xF)
返回;

//
//创建指向相应寄存器的指针。 这是一种权变措施
//定义 GPIO 寄存器的方式。 标准定义
//在头文件中,可以很容易地对其中一个进行命名访问
//寄存器或位,但很难执行任意的数字访问。 是的
//更容易拥有一组具有相同寄存器的 GPIO 模块、
//包括多寄存器组的数组,如 GPyCSEL1-4。 但是
//头文件不定义任何可以转换为数组的内容,
//SO 改为使用手动指针算术。
//
MUX = gpioBaseAddr + GPYMUX + pin32/16;
gmux = gpioBaseAddr + GPYGMUX + pin32/16;
CSEL = gpioBaseAddr + GPYCSEL + pin32/8;

//
//现在用于实际函数
//
EALLOW;

//
//要更改多路复用、请先将外设多路复用器设置为0/GPIO 以避免
//毛刺脉冲、然后更改组多路复用器、然后将外设多路复用器设置为
//其目标值。 最后、设置 CPU 选择。 此过程是
//在 TRM 中进行了说明。 遗憾的是、由于我们不知道中的引脚
//提前我们无法对位字段引用进行硬编码,因此有一些
//此处显示棘手的位。
//
*mux &=~(0x3UL <<(2*pin16));
*gmux &=~(0x3UL <<(2*pin16));
*gmux |=(uint32)((外设>> 2)& 0x3UL)<<(2*pin16);
*mux |=(uint32)(外设和0x3UL)<<(2*pin16);

*CSEL &=~(0x3L <<(4*PIN8));
*CSEL |=(uint32)(CPU & 0x3L)<<(4*PIN8);

//
//警告:此代码不会触及模拟模式选择寄存器,
//为 USB 模块提供对其 IO 的控制所需的。
//
EDIS;
} 

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

    您好!

    该值是 GPyMUXn.GPIOz 和 GPyGMUXn.GPIOz 的组合值。 在该器件上、GPIO MUX 控制值被拆分为两个寄存器、因此添加了该值以显示组合值。  

    此致、

    Vivek Singh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我知道、必须更改 GPyMUXn.GPIOz 和 GPyGMUXn.GPIOz 寄存器。 但数据表中的 GPIO 索引是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它只是 GPyGMUXn.GPIOz 和 GPyMUXn.GPIOz 组合值的符号名称。

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

    我明白了。 它是外设编号、而不是 GPIO 索引。 我认为这是错误的措辞。 我将这个数字放入函数 GPIO_SetupPinMux (UINT16引脚、UINT16 CPU、UINT16外设)中、它正常工作。

    GPIO_SetupPinMux (49、1、6);//使用 GPIO49的第6个函数