/* * Copyright (c) 2015, Freescale Semiconductor, Inc. * Copyright 2016-2019 NXP * Tutti i diritti riservati. * * Licenza SPDX: BSD-3-Clause */ #include "fsl_debug_console.h" #include "pin_mux.h" #include "clock_config.h" #include "board.h" #include "fsl_pit.h" //Per RTC #include #include "fsl_common.h" #include "fsl_rtc.h" /******************************************************************************* * Definizioni ******************************************************************************/ #define DEMO_PIT_BASEADDR PIT #define DEMO_PIT_CHANNEL kPIT_Chnl_0 #define PIT_HANDLER PIT_IRQHandler #define PIT_IRQ_ID PIT_IRQn // Ottieni la frequenza di clock per il driver PIT #define PIT_SOURCE_CLOCK CLOCK_GetFreq(kCLOCK_BusClk) #define LED_INIT() LED_RED_INIT(LOGIC_LED_ON) #define LED_TOGGLE() LED_RED_TOGGLE() /******************************************************************************* * Prototipi ******************************************************************************/ /******************************************************************************* * Variabili ******************************************************************************/ volatile bool pitIsrFlag = false; volatile uint32_t cnt_timer = 0; // contatore per sapere quanti interrupt sono accaduti e settare gli altri timer volatile uint32_t cnt_10ms = 0; // contatore per sapere quanti 10ms sono passati volatile uint32_t cnt_100ms = 0; // contatore per sapere quanti 100ms sono passati volatile uint32_t cnt_500ms = 0; // contatore per sapere quanti 500ms sono passati volatile uint32_t cnt_1s = 0; // contatore per sapere quanti 1s sono passati /******************************************************************************* * Codice ******************************************************************************/ void PIT_HANDLER(void) { // Pulisce il flag di interruzione. PIT_ClearStatusFlags(DEMO_PIT_BASEADDR, DEMO_PIT_CHANNEL, kPIT_TimerFlag); pitIsrFlag = true; // Aggiunto per tutti i gestori PIT. Per il clock della CPU, che è molto più grande di quello del bus IP, // la CPU può uscire dal gestore di interruzione prima che il flag venga cancellato, portando la // CPU a entrare nel gestore di nuovo e di nuovo. L'aggiunta di DSB può prevenire che il problema si verifichi. SDK_ISR_EXIT_BARRIER; } void delay(uint32_t ms) { volatile uint32_t i; for (i = 0; i < ms * 1000; i++) { __asm("nop"); } } /*! * @brief Funzione principale */ int main(void) { // Struttura per inizializzare il PIT pit_config_t pitConfig; // Inizializzazione dei pin della scheda, del clock e della console di debug BOARD_InitBootPins(); BOARD_InitBootClocks(); BOARD_InitDebugConsole(); // Inizializza e abilita il LED LED_INIT(); PIT_GetDefaultConfig(&pitConfig); // Inizializza il modulo PIT PIT_Init(DEMO_PIT_BASEADDR, &pitConfig); // Imposta il periodo del timer per il canale 0 PIT_SetTimerPeriod(DEMO_PIT_BASEADDR, DEMO_PIT_CHANNEL, USEC_TO_COUNT(1000U, PIT_SOURCE_CLOCK)); //timer 1ms (1000000U) // Abilita le interruzioni del timer per il canale 0 PIT_EnableInterrupts(DEMO_PIT_BASEADDR, DEMO_PIT_CHANNEL, kPIT_TimerInterruptEnable); // Abilita nell'NVIC EnableIRQ(PIT_IRQ_ID); // Avvia il canale 0 PRINTF("\r\nAvviando il canale n.0 ..."); PIT_StartTimer(DEMO_PIT_BASEADDR, DEMO_PIT_CHANNEL); while (true) { if (true == pitIsrFlag) { cnt_timer++; //incremento contatore del timer pitIsrFlag = false; PRINTF("Contatore PIT: %d\r\n", cnt_timer); } delay(1); } }