Tool/software: Code Composer Studio
Hi,
I want to use GPIO48 and GPIO49 as Tx and Rx of serial communication. I need to change GMUX and MUX registers. In TI library (F2837xD_Gpio.c) there is a function void GPIO_SetupPinMux(Uint16 pin, Uint16 cpu, Uint16 peripheral). I use this function to change registers. Mux register (GPBMUX2) is changed correctly, but Group Mux register (GPBGMUX2) is not changed properly. It writes always zero instead of proper value. If I write correct value into group multiplex register, everything works.
In datasheet (tms320f28377d.pdf, page 41, Table 4-3) or technical reference manual (spruhm8g.pdf, page 914, Table 7-8) ther is a column with name GPIO index.
What is GPIO index? Shall I write something into some registers for this index?
Here is the funcntion in TI library (F2837xD_Gpio.c)
//
// GPIO_SetupPinMux - Set the peripheral muxing for the specified pin. The
// appropriate parameters can be found in the GPIO Muxed
// Pins table(4.4) in the datasheet. Use the GPIO index
// row (0 to 15) to select a muxing option for the GPIO.
//
void GPIO_SetupPinMux(Uint16 pin, Uint16 cpu, Uint16 peripheral)
{
volatile Uint32 *gpioBaseAddr;
volatile Uint32 *mux, *gmux, *csel;
Uint16 pin32, pin16, pin8;
pin32 = pin % 32;
pin16 = pin % 16;
pin8 = pin % 8;
gpioBaseAddr = (Uint32 *)&GpioCtrlRegs + (pin/32) * GPY_CTRL_OFFSET;
//
//Sanity check for valid cpu and peripheral values
//
if (cpu > GPIO_MUX_CPU2CLA || peripheral > 0xF)
return;
//
//Create pointers to the appropriate registers. This is a workaround
//for the way GPIO registers are defined. The standard definition
//in the header file makes it very easy to do named accesses of one
//register or bit, but hard to do arbitrary numerical accesses. It's
//easier to have an array of GPIO modules with identical registers,
//including arrays for multi-register groups like GPyCSEL1-4. But
//the header file doesn't define anything we can turn into an array,
//so manual pointer arithmetic is used instead.
//
mux = gpioBaseAddr + GPYMUX + pin32/16;
gmux = gpioBaseAddr + GPYGMUX + pin32/16;
csel = gpioBaseAddr + GPYCSEL + pin32/8;
//
//Now for the actual function
//
EALLOW;
//
//To change the muxing, set the peripheral mux to 0/GPIO first to avoid
//glitches, then change the group mux, then set the peripheral mux to
//its target value. Finally, set the CPU select. This procedure is
//described in the TRM. Unfortunately, since we don't know the pin in
//advance we can't hardcode a bitfield reference, so there's some
//tricky bit twiddling here.
//
*mux &= ~(0x3UL << (2*pin16));
*gmux &= ~(0x3UL << (2*pin16));
*gmux |= (Uint32)((peripheral >> 2) & 0x3UL) << (2*pin16);
*mux |= (Uint32)(peripheral & 0x3UL) << (2*pin16);
*csel &= ~(0x3L << (4*pin8));
*csel |= (Uint32)(cpu & 0x3L) << (4*pin8);
//
//WARNING: This code does not touch the analog mode select registers,
//which are needed to give the USB module control of its IOs.
//
EDIS;
}