stm32 TIM3 interrupt
Ciao a tutti
oggi per la prima volta ho provato ad utilizzare il tim3 per generare un segnale che vada in overflow ogni 1s. Il problema è che benchè il timer parti senza problemi non finisco mai nell'interrupt.
Il codice è il seguente:
Qualcuno può spiegarmi dove sbaglio? Grazie per la collaborazione :)
oggi per la prima volta ho provato ad utilizzare il tim3 per generare un segnale che vada in overflow ogni 1s. Il problema è che benchè il timer parti senza problemi non finisco mai nell'interrupt.
Il codice è il seguente:
- Codice: Seleziona tutto
#include <stm32f4xx.h>
void Clock_Set(void);
void Tim3_Init(void);
void GPIO_Init(void);
void TIM3_IRQHandler(void);
uint8_t gbl = 0;
int main(void)
{
/*imposto il clock a 168MHz*/
Clock_Set();
/*inizializzo il tim3*/
Tim3_Init();
/*gpio*/
GPIO_Init();
TIM3 ->PSC = 10000;
TIM3 ->ARR = 16800;
TIM3 ->CR1 |= TIM_CR1_CEN;
while(1)
{
if(gbl)
{
GPIOD ->BSRRL = 0x8000;
}
else
{
GPIOD ->BSRRH = 0x8000;
}
}
}
void TIM3_IRQHandler()
{
TIM3 ->SR &= ~TIM_SR_UIF;
gbl++;
if(gbl == 2) gbl = 0;
}
void GPIO_Init()
{
RCC ->AHB1RSTR |= RCC_AHB1RSTR_GPIODRST;
RCC ->AHB1RSTR = 0x0000;
RCC ->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
GPIOD ->MODER |= GPIO_MODER_MODER15_0;
GPIOD ->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR15_1;
GPIOD ->OTYPER = 0x0000;
GPIOD ->PUPDR = 0x0000;
}
void Clock_Set()
{
/*imposto 5WS per i 168MHz*/
FLASH ->ACR |= FLASH_ACR_LATENCY_5WS;
/*azzero il registro per il clock*/
RCC ->CR &= 0x0000;
/*HSE e PLL*/
RCC ->CR |= RCC_CR_HSEON | RCC_CR_PLLON;
/*reset CFGR*/
RCC ->PLLCFGR &= 0x0000;
/*imposto PLL_M 8, PLL_N 336, PLL_P 2*/
RCC ->PLLCFGR |= RCC_PLLCFGR_PLLM_3 | 0x0150 | RCC_PLLCFGR_PLLSRC_HSE;
/*seleziono PLL HSE*/
RCC ->CFGR |= RCC_CFGR_SW_PLL;
}
void Tim3_Init()
{
/*reset TIM3*/
RCC ->APB1RSTR |= RCC_APB1RSTR_TIM3RST;
RCC ->APB1RSTR = 0x0000;
/*clock enabled*/
RCC ->APB1ENR |= RCC_APB1ENR_TIM3EN;
/*auto reload, overflow, upcounter, not enabled*/
TIM3 ->CR1 |= TIM_CR1_ARPE | TIM_CR1_URS;
/*prescaler*/
TIM3 ->PSC = 0x0000;
/*arr*/
TIM3 ->ARR = 0xFFFF;
/*interrupt*/
NVIC_EnableIRQ(TIM3_IRQn);
NVIC_SetPriority(TIM3_IRQn,0x0F);
}
Qualcuno può spiegarmi dove sbaglio? Grazie per la collaborazione :)
