////////////////////////////////////////////////////////////////////////////////
// ESERCIZIO A
////////////////////////////////////////////////////////////////////////////////
#include "stm32f030x8.h"

int cycles = 0; /* variabile che conta il numero di interrupt del conteggio */

void TIM14_IRQHandler(void) {
	if(cycles<999) { /* incremento del conteggio fino al valore 999 */
		cycles++;
	} else { /* inizializzazione del conteggio quando vale 999 (1 s) */
		cycles = 0;
		if(TIM14->CCR1 < 1000) {    /* finché CCR1 è minore di 1000 */
			TIM14->CCR1 += 125; /* viene incrementato di 1000/8 */
		} else {			   /* quando CCR1 è pari a 1000 */
			TIM14->CCR1 = 0;    /* viene inizializzato a 0 */
		}
	}
	TIM14->SR &= 0xFFFFFFFE; /* reset del flag di interrupt pendente */
}

int main(void)
{

	/* (0) Abilitazione del clock su TIM14 */
	/* (1) Configurazione del prescaler a 7 (unità di tempo 1 us) */
	/* (2) Configurazione ARR a 999, (periodo PWM 1 ms) */
	/* (3) Configurazione CCR1 iniziale a 0 (0 V sull'uscita analogica) */
	/* (4) Settaggio della PWM mode 1 su OC1 (OC1M = 110), e del preload  per OC1 (OC1PE = 1) */
	/* (5) Settaggio della polarità per OC1 (CC1P = 0, valore di reset) e abilitazione dell'output analogico su OC1 (CC1E = 1)*/
	/* (6) Abilitazione conteggio (CEN = 1), non necessaria configurazione tipologia PWM (solo edge-aligned per TIM14)  */
	/* (7) Abilitazione della maschera dell'interrupt di update */
	/* (8) Abilitazione globale del canale di interrupt di TIM14 nel NVIC*/
	/* (9) Forzatura dell'aggiornamento dei registri modificati (UG = 1) */
	RCC->APB1ENR |= RCC_APB1ENR_TIM14EN; /* (0) */
	TIM14->PSC = 7; /* (1) */
	TIM14->ARR = 999; /* (2) */
	TIM14->CCR1 = 0; /* (3) */
	TIM14->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1
		| TIM_CCMR1_OC1PE; /* (4) */
	TIM14->CCER |= TIM_CCER_CC1E; /* (5) */
	TIM14->CR1 |= TIM_CR1_CEN; /* (6) */
	TIM14->DIER |= TIM_DIER_UIE; /* (7) */
	NVIC_EnableIRQ(TIM14_IRQn); /* (8) */
	TIM14->EGR |= TIM_EGR_UG; /* (9) */

	/* (0) Abilitazione del clock per il GPIOA */
	/* (1) Configurazione della modalità di PA7 come output da alternate function */
	/* (2) Configurazione dell'alternate function di PA7 secondo il canale 1 di TIM14 (AFSEL7=4) */
	RCC->AHBENR |= RCC_AHBENR_GPIOAEN; /* (0) */
	GPIOA->MODER |= GPIO_MODER_MODER4_1; /* (1)*/
	GPIOA->AFR[0] |= 0x04 << GPIO_AFRL_AFRL4_Pos; /* (2) */

	while(1){

	}
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////