Tool/software: TI-RTOS
I have some driverlib function calls that are crashing in the driverlib functions. I'm wondering if i'm not initializing something, or if there are constraints for these functions that i'm missing.
In my Main function, If i call the CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_48); function, interrupt vector table (interruptVenctors section in memory) has a few of it's initial words overwritten, and the program crashes on the next CS_initClockSignal calls.
There is no useful output from ROV or concole debug for this crash.
I'm not even sure where to start with this one. It seems like the way the driver code is compiled it fairly easily causes crashes, despite looking correct.
int main(void)
{
/* Stop Watchdog */
WDT_A_holdTimer();
/* Call Driver init functions */
MPU_disableModule();
PCM_setCoreVoltageLevel(PCM_VCORE1);
//CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_48); // Put this in, and things crash
CS_setReferenceOscillatorFrequency(CS_REFO_128KHZ);
CS_initClockSignal(CS_ACLK, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1);
CS_initClockSignal(CS_SMCLK, CS_MODOSC_SELECT, CS_CLOCK_DIVIDER_1);
Interrupt_disableSleepOnIsrExit(); // MDR_DEBUG: Disable sleep for now.
FPU_enableModule();
FPU_enableLazyStacking();
GpioInit();
ADCInit();
...
In scenario 2, if I leave that driver call commented out in main (CS_setDCOCenteredFrequency()), when I run my GpioInit() function I get a crash. I'm not seeing anything glaringly obvious in my code that should cause a crash. The problem appears to be for all gpio registers who's base address LSB (bit0)= 1 .
typedef struct SGpioPortCfg {
uint_fast8_t port;
uint_fast16_t outputs;
uint_fast16_t inputs;
uint_fast16_t pullup;
uint_fast16_t pulldown;
uint_fast8_t hiDrive;
uint_fast8_t loDrive;
}TGpioPortCfg;
const TGpioPortCfg PortCfg[] = {
/* Port , out , in , pullup, pulldn, hiDrv, loDrv */
{ GPIO_PORT_P1 , 0x008A, 0x0075, 0x0000, 0x00FF, 0x00, 0xFF },
{ GPIO_PORT_P3 , 0x00CE, 0x0031, 0x0000, 0x00FF, 0x00, 0xFF },
{ GPIO_PORT_P4 , 0x0000, 0x00FF, 0x0000, 0x00FF, 0x00, 0xFF },
{ GPIO_PORT_P5 , 0x0000, 0x00FF, 0x0000, 0x00FF, 0x00, 0xFF },
{ GPIO_PORT_P6 , 0x001F, 0x00E0, 0x0004, 0x00FD, 0x00, 0xFF },
{ GPIO_PORT_P7 , 0x0000, 0x00FF, 0x0000, 0x00FF, 0x00, 0xFF },
{ GPIO_PORT_P8 , 0x00F7, 0x0008, 0x0000, 0x00FF, 0x00, 0xFF },
{ GPIO_PORT_P9 , 0x00FF, 0x0000, 0x0000, 0x00FF, 0x00, 0xFF },
{ GPIO_PORT_P10, 0x003F, 0x0000, 0x0000, 0x00FF, 0x00, 0xFF },
{ GPIO_PORT_PJ , 0x0000, 0x00FF, 0x0000, 0x00FF, 0x00, 0xFF },
{ GPIO_PORT_P2 , 0x00FF, 0x0000, 0x0000, 0x00FF, 0x00, 0xFF },
{ 0 , 0x0000, 0x0000, 0x0000, 0x0000, 0x00, 0x00 }
};
BOOL GpioInit(void)
{
BOOL success = FALSE;
#if 1
int16 portIdx = 0;
for( portIdx = 0; PortCfg[portIdx].port; portIdx++ )
{
GPIO_setAsOutputPin( PortCfg[portIdx].port, PortCfg[portIdx].outputs ); // <== It crashes here when Index = 2, regardless of the order of the PortCfg array
GPIO_setAsInputPin( PortCfg[portIdx].port, PortCfg[portIdx].inputs );
GPIO_setAsInputPinWithPullDownResistor( PortCfg[portIdx].port, PortCfg[portIdx].pulldown );
GPIO_setAsInputPinWithPullUpResistor( PortCfg[portIdx].port, PortCfg[portIdx].pullup );
GPIO_setDriveStrengthHigh( PortCfg[portIdx].port, PortCfg[portIdx].hiDrive );
GPIO_setDriveStrengthLow( PortCfg[portIdx].port, PortCfg[portIdx].loDrive );
}
...
Table of the port configuration attempts the GPIO driver works or crashes on
| Port | Offset | Crash or OK |
| 1 | 0x00h | OK |
| 3 | 0x20h | OK |
| 5 | 0x40h | OK |
| 7 | 0x60h | OK |
| 9 | 0x80h | OK |
| J | 0x120h | OK |
| 2 | 0x01h | CRASH |
| 4 | 0x21h | CRASH |
| 6 | 0x41h | CRASH |
| 8 | 0x61h | CRASH |
| 10 | 0x81h | CRASH |
This appears to be because of an UNALIGNED access caused in the driver code (the way it's compiled).
ROV does give some useful Exception info in this case
Here's the Exception Info:
Decoded exception Decoded Hard Fault: FORCED: USAGE: UNALIGNED Exception context $addr 0x2003fee8 $type ti.sysbios.family.arm.m3.Hwi.ExcContext threadType threadHandle 0x0 threadStack 0x2003f800 threadStackSize 2048 r0 0x40004c2b r1 0xf5cc r2 0x0 r3 0x4 r4 0x2 r5 0xf110 r6 0xf110 r7 0xf110 r8 0xf110 r9 0xf110 r10 0xf110 r11 0xf110 r12 0x0 sp 0x2003ffc0 lr 0x4045 pc 0x9824 psr 0x1000000 ICSR 0x803 MMFSR 0x0 BFSR 0x0 UFSR 0x100 HFSR 0x40000000 DFSR 0x1 MMAR 0xe000ed34 BFAR 0xe000ed38 AFSR 0x0 Exception call stack 0 GPIO_setAsOutputPin at gpio.c:69 : PC=0x00009824 1 GpioInit at Msp432Gpio.c:64 : PC=0x00004044 2 main at main.c:180 : PC=0x000082F6 3 _c_int00 at boot.asm:254 : PC=0x00008C14
This is the mixed c/ssembly of where the exception is occuring:
void GPIO_setAsOutputPin(uint_fast8_t selectedPort, uint_fast16_t selectedPins)
{
uint32_t baseAddress = GPIO_PORT_TO_BASE[selectedPort];
HWREG16(baseAddress + OFS_LIB_PASEL0) &= ~selectedPins; <= Exception occurs here on PORT4
HWREG16(baseAddress + OFS_LIB_PASEL1) &= ~selectedPins;
HWREG16(baseAddress + OFS_LIB_PADIR) |= selectedPins;
}
GPIO_setAsOutputPin():
0000980c: F1AD0D10 sub.w sp, sp, #0x10
00009810: 9101 str r1, [sp, #4]
00009812: 9000 str r0, [sp]
67 uint32_t baseAddress = GPIO_PORT_TO_BASE[selectedPort];
00009814: 490C ldr r1, [pc, #0x30]
00009816: 9800 ldr r0, [sp]
00009818: F8510020 ldr.w r0, [r1, r0, lsl #2]
0000981c: 9002 str r0, [sp, #8]
69 HWREG16(baseAddress + OFS_LIB_PASEL0) &= ~selectedPins;
0000981e: 9802 ldr r0, [sp, #8]
00009820: 9A01 ldr r2, [sp, #4]
00009822: 300A adds r0, #0xa
00009824: 8801 ldrh r1, [r0] <==== This is the PC location when the exception happens... R0 = GPIO SEL0 register location, and when it's ODD (lsb/bit0 = 1) it crashes..IE for all ports at odd offsets
00009826: 4391 bics r1, r2
00009828: 8001 strh r1, [r0]
70 HWREG16(baseAddress + OFS_LIB_PASEL1) &= ~selectedPins;
0000982a: 9802 ldr r0, [sp, #8]
0000982c: 9A01 ldr r2, [sp, #4]
0000982e: 300C adds r0, #0xc
00009830: 8801 ldrh r1, [r0]
00009832: 4391 bics r1, r2
00009834: 8001 strh r1, [r0]
71 HWREG16(baseAddress + OFS_LIB_PADIR) |= selectedPins;
00009836: 9802 ldr r0, [sp, #8]
00009838: 9901 ldr r1, [sp, #4]
0000983a: 1D00 adds r0, r0, #4
0000983c: 8802 ldrh r2, [r0]
0000983e: 4311 orrs r1, r2
00009840: 8001 strh r1, [r0]
How do I prevent this GPIO exception from occuring?
Is there a compiler setting to prevent stuff like this?

