工具/软件: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; }