TM4C129ENCPDT: Unable to set timer clock to PIOSC

Part Number: TM4C129ENCPDT

Tool/software:

Hello,

my system clock is 120MHz. For implementation of a TRNG with an acceptable entropy I want to try to run one timer with PIOSC. This is the code used:

 

#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_ints.h"
#include "inc/hw_types.h"
#include "inc/hw_sysctl.h"
#include "inc/hw_uart.h"
#include "inc/hw_timer.h"
#include "inc/hw_hibernate.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/timer.h"
#include "driverlib/hibernate.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"

void Timer0IntHandler(void);

uint32_t g_ui32SysClock = 0;

void main(void)
{
    // Systemclock auf 120 MHz
    g_ui32SysClock = SysCtlClockFreqSet(SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480, 120000000);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);
    while (!SysCtlPeripheralReady(SYSCTL_PERIPH_HIBERNATE)) {}
    HibernateEnableExpClk(g_ui32SysClock);
    HWREG(HIB_CC) = HIBERNATE_OUT_SYSCLK;

    // Set ALTCLK to PIOSC.
    SysCtlAltClkConfig(SYSCTL_ALTCLK_PIOSC);

    // GPIO für CCP-Ausgänge (optional für Oszilloskop)
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM);
    while (!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOM))
        ;
//    GPIOPinConfigure(GPIO_PM6_T5CCP0);
//    GPIOPinTypeTimer(GPIO_PORTM_BASE, GPIO_PIN_6);

    GPIOPinTypeGPIOOutput(GPIO_PORTM_BASE, GPIO_PIN_6);
    GPIOPinWrite(GPIO_PORTM_BASE, GPIO_PIN_6, 0);

    // Initialize Timer 0
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
    while (!SysCtlPeripheralReady(SYSCTL_PERIPH_TIMER0))
        ;

//    TimerConfigure(TIMER0_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PWM);
    TimerConfigure(TIMER0_BASE, TIMER_CFG_A_PERIODIC);
    TimerClockSourceSet(TIMER0_BASE, TIMER_CLOCK_PIOSC);
    TimerPrescaleSet(TIMER0_BASE, TIMER_A, 255);
    TimerLoadSet(TIMER0_BASE, TIMER_A, 624);

    TimerIntRegister(TIMER0_BASE, TIMER_A, Timer0IntHandler);
    TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
    IntEnable(INT_TIMER0A);
    IntMasterEnable();

    TimerEnable(TIMER0_BASE, TIMER_A);

    while(1)
    {
        __WFI();
    }
}

void Timer0IntHandler(void)
{
    TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);

    uint8_t ui8Pin = GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_6);
    GPIOPinWrite(GPIO_PORTM_BASE, GPIO_PIN_6, ui8Pin ^ GPIO_PIN_6);
}

I tried different things: running as a periodic counter or in PWM mode (as i want to see the frequency on an oszilloscope for debugging). I am using the 16bit-counter TIMER0A, as I was reading in the forum, that the 32bit-mode is not working at all with a different clock source. I even tried to set ALTCLK to PIOSC and activated Hibernation just to try out if this helps. But whatever I try - the timer is running at 120MHz (GPTMCC = 0x01 !!!).

Is there a way to get this timer running with the 16MHz clock of PIOSC? 

Regards

Klaus

  • Hi,

      I just ran your code. When running as is, I see about 13kHz signal on PM6 pin. When I comment out the below two lines, I measured 96kHz. The ratio between on the frequencies is about right compared to 120 divided by 16. What do you mean the the timer is running at 120Mhz? Can you show your waveforms between running with the two lines below added and removed?

    SysCtlAltClkConfig(SYSCTL_ALTCLK_PIOSC);

    TimerClockSourceSet(TIMER0_BASE, TIMER_CLOCK_PIOSC);