Part Number:TM4C123GH6PM
Tool/software: Code Composer Studio
Hi
I need to generate two signals for driving a device, one at 25 Hz and another one to 1.4MHz. I have been testing with the code below but I can only achieve 645 kHz even setting the Load to 1.4Mhz, is there something am I doing wrong?
I can also notice that in some frequencies the duty cycle changes with no reason since I left it on 50%. I am trying to figure out what is happening on the datasheet and the TIVA peripherals library but since I am beginner with the Tiva C any help is appreciated.
Thanks in advance
Isra
#include <stdint.h> #include <stdbool.h> #include "inc/tm4c123gh6pm.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/sysctl.h" #include "driverlib/interrupt.h" #include "driverlib/gpio.h" #include "driverlib/timer.h" int main(void) { uint32_t ui32Period; //SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC); ui32Period = (SysCtlClockGet()/25) / 2 ; TimerLoadSet(TIMER0_BASE, TIMER_A, ui32Period -1); IntEnable(INT_TIMER0A); TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); //IntMasterEnable(); TimerEnable(TIMER0_BASE, TIMER_A); SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2); TimerConfigure(TIMER2_BASE, TIMER_CFG_PERIODIC); ui32Period = (SysCtlClockGet()/10) / 2; TimerLoadSet(TIMER2_BASE, TIMER_A, ui32Period -1); IntEnable(INT_TIMER2A); TimerIntEnable(TIMER2_BASE, TIMER_TIMA_TIMEOUT); //IntMasterEnable(); TimerEnable(TIMER2_BASE, TIMER_A); SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); TimerConfigure(TIMER1_BASE, TIMER_CFG_PERIODIC); ui32Period = (SysCtlClockGet()/1400000) /2 ; TimerLoadSet(TIMER1_BASE, TIMER_A, ui32Period -1); IntEnable(INT_TIMER1A); TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT); IntMasterEnable(); TimerEnable(TIMER1_BASE, TIMER_A); while(1) { } } void Timer0IntHandler(void) { // Clear the timer interrupt TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // Read the current state of the GPIO pin and // write back the opposite state if(GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_2)) { GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0); } else { GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 4); } } void Timer1IntHandler(void) { // Clear the timer interrupt TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT); // Read the current state of the GPIO pin and // write back the opposite state if(GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_1)) { GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0); } else { GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 2); } } void Timer2IntHandler(void) { // Clear the timer interrupt TimerIntClear(TIMER2_BASE, TIMER_TIMA_TIMEOUT); // Read the current state of the GPIO pin and // write back the opposite state if(GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_3)) { GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0); } else { GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 8); } }