Other Parts Discussed in Thread: TM4C123GH6PM
Tool/software: Code Composer Studio
Hi,
I'm using ARM® Cortex®-M4F Based MCU TM4C123G LaunchPad™ Evaluation Kit, and I wrote a code to undestand better how TM4C123GH6PM and TIVA API works.
I imported the blinky code from resource explore and I modified it. When I debug the code, it doesn't work like I expected. PF_2 changes it's state every 20ms (like I was expecting), but PF_1 has a stranger behavior, it changes to high 10ms after PF_2 go to high, 20ms later it pulse to low and comeback to high and 20ms later it go to down. Same thing happens on the 'low' state of PF_2.
I think that my code has an error, but I don't know if it's a problem on GPIO functions or something else.
The code:
/*
* PORT_A: PORT_B: PORT_C:
*
* VALV_3 PA_5 VALV_1 PB_0 VALV_11 PC_7
* VALV_4 PA_6 VALV_2 PB_1 VALV_13 PC_6
* VALV_5 PA_7 VALV_12 PB_6 VALV_15 PC_4
* VALV_7 PA_3 VALV_14 PB_7 VALV_16 PC_5
* VALV_8 PA_2 VALV_18 PB_3
* VALV_9 PA_6 VALV_20 PB_2
*
* PORT_F: PORT_D:
*
* VALV_6 PF_1 VALV_9 PD_6
* VALV_17 PF_3
* VALV_19 PF_2
*
*/
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_ints.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#include "driverlib/timer.h"
#include "driverlib/interrupt.h"
#define VALV_1 GPIO_PIN_0
#define VALV_2 GPIO_PIN_1
#define VALV_3 GPIO_PIN_5
#define VALV_4 GPIO_PIN_6
#define VALV_5 GPIO_PIN_7
#define VALV_6 GPIO_PIN_1
#define VALV_7 GPIO_PIN_3
#define VALV_8 GPIO_PIN_2
#define VALV_9 GPIO_PIN_6
#define VALV_10 GPIO_PIN_4
#define VALV_11 GPIO_PIN_7
#define VALV_12 GPIO_PIN_6
#define VALV_13 GPIO_PIN_6
#define VALV_14 GPIO_PIN_7
#define VALV_15 GPIO_PIN_4
#define VALV_16 GPIO_PIN_5
#define VALV_17 GPIO_PIN_3
#define VALV_18 GPIO_PIN_3
#define VALV_19 GPIO_PIN_2
#define VALV_20 GPIO_PIN_2
#define VALV_A VALV_3|VALV_4|VALV_5|VALV_7|VALV_8|VALV_9
#define VALV_B VALV_1|VALV_2|VALV_12|VALV_14|VALV_18|VALV_20
#define VALV_C VALV_11|VALV_13|VALV_15|VALV_16
#define VALV_D VALV_9
#define VALV_F VALV_6|VALV_17|VALV_19
volatile int timer = 0;
volatile signed int flag1 = 1;
volatile signed int flag2 = 1;
volatile int32_t x;
void Timer0Isr(){
timer++;
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
}
void TimerInit(){
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_TIMER0)) {}
TimerConfigure (TIMER0_BASE,TIMER_CFG_PERIODIC);
TimerIntRegister(TIMER0_BASE, TIMER_A, Timer0Isr);
IntEnable (INT_TIMER0A);
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
IntPrioritySet(INT_TIMER0A, 0x00);
}
void GPIOInit(){
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOA)){}
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOB)){}
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOC)){}
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOD)){}
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF)){}
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, VALV_A);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, VALV_B);
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, VALV_C);
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, VALV_D);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, VALV_F);
}
int main(void)
{
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
IntMasterEnable();
GPIOInit();
TimerInit();
TimerEnable (TIMER0_BASE, TIMER_A);
TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet() / 100000);
while(1){
if (timer == 1000){
flag1 = -flag1;
if (flag1 == 1){
GPIOPinWrite(GPIO_PORTF_BASE, VALV_6, VALV_6);}
else{
GPIOPinWrite(GPIO_PORTF_BASE, VALV_6, 0x00);}
}
if (timer == 2000){
flag2 = -flag2;
timer = 0;
if (flag2 == 1){
GPIOPinWrite(GPIO_PORTF_BASE, VALV_19, VALV_19);
}
else {
GPIOPinWrite(GPIO_PORTF_BASE, VALV_19, 0x00);}
}
}
}