[ zivadin_despot @ 15.12.2014. 00:02 ] @
Pozdrav svima imam problem sa tajmer interaptom, pa ako moze mala pomoc. Naime ne menja mi stanje diode, tj tajmer 3 ne odlazi u interapt. Ne znam gde je greska u konfiguraciji... Code: #include <stdio.h> #include "diag/Trace.h" #include "stm32f4xx.h" #include "stm32f4xx_hal.h" #include "stm32f4xx_hal_rcc.h" #include "stm32f4xx_hal_gpio.h" #include "stm32f4xx_hal_tim.h" #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wmissing-declarations" #pragma GCC diagnostic ignored "-Wreturn-type" static void SystemClock_Config(void) { /** * @brief System Clock Configuration * The system Clock is configured as follow : * System Clock source = PLL (HSE) * SYSCLK(Hz) = 168000000 * HCLK(Hz) = 168000000 * AHB Prescaler = 1 * APB1 Prescaler = 4 * APB2 Prescaler = 2 * HSE Frequency(Hz) = 8000000 * PLL_M = 8 * PLL_N = 336 * PLL_P = 2 * PLL_Q = 7 * VDD(V) = 3.3 * Main regulator output voltage = Scale1 mode * Flash Latency(WS) = 5 * @param None * @retval None */ RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitTypeDef RCC_OscInitStruct; /* Enable Power Control clock */ __PWR_CLK_ENABLE(); /* The voltage scaling allows optimizing the power consumption when the device is clocked below the maximum system frequency, to update the voltage scaling value regarding system frequency refer to product datasheet. */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /* Enable HSE Oscillator and activate PLL with HSE as source */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; HAL_RCC_OscConfig(&RCC_OscInitStruct); /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */ RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); //opis je na strani 551 knjige sa opisom HAL driver-a } void GPIO_Init() { //led dioda na PD12======================= __GPIOD_CLK_ENABLE(); //omogucen klok za GPIOD GPIO_InitTypeDef GpioStructure; //konfiguracija pina GpioStructure.Pin=GPIO_PIN_12; GpioStructure.Mode=GPIO_MODE_OUTPUT_PP; GpioStructure.Pull=GPIO_PULLUP; GpioStructure.Speed=GPIO_SPEED_FAST; HAL_GPIO_Init(GPIOD, &GpioStructure); //======================================== } TIM_HandleTypeDef TIM_Handle; //glavna struktura void TMR_Init() { __TIM3_CLK_ENABLE(); //omogucen klok za tajmer 3 TIM_ClockConfigTypeDef sClockSourceConfig; //klok tajmera source==================================== sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&TIM_Handle, &sClockSourceConfig); //====================================================== //konfiguracija tajmera 3========================= TIM_Handle.Instance=TIM3; TIM_Handle.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1; TIM_Handle.Init.CounterMode=TIM_COUNTERMODE_UP; TIM_Handle.Init.Period=1000; TIM_Handle.Init.Prescaler=16000; HAL_TIM_Base_Init(&TIM_Handle); //================================================= //omoguci interapt======================== HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); //najnizi prioritet HAL_NVIC_EnableIRQ(TIM3_IRQn); //omogucen interapt //======================================== } //hendler prekida za tmr3 void TIM3_IRQHandler() { HAL_TIM_IRQHandler(&TIM_Handle); } //interapt za tmr3 void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12); } int main(int argc, char* argv[]) { HAL_Init(); //inicijalizacija HAL drajvera SystemClock_Config(); GPIO_Init(); TMR_Init(); HAL_TIM_Base_Start_IT(&TIM_Handle); //pokreni tajmer 3 u interapt modu while (1) { } } #pragma GCC diagnostic pop Radjeno u Eclipse (Luna) + GCC-ARM + GNUARMEclipse + OpenOCD U pitanju je plocica Discovery sa kontrolerom STM32F407VGT6 Ovo je kod za eksterni interrupt koji radi: Code: #include <stdio.h> #include "diag/Trace.h" #include "stm32f4xx.h" #include "stm32f4xx_hal.h" #include "stm32f4xx_hal_rcc.h" #include "stm32f4xx_hal_gpio.h" #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wmissing-declarations" #pragma GCC diagnostic ignored "-Wreturn-type" static void SystemClock_Config(void) { /** * @brief System Clock Configuration * The system Clock is configured as follow : * System Clock source = PLL (HSE) * SYSCLK(Hz) = 168000000 * HCLK(Hz) = 168000000 * AHB Prescaler = 1 * APB1 Prescaler = 4 * APB2 Prescaler = 2 * HSE Frequency(Hz) = 8000000 * PLL_M = 8 * PLL_N = 336 * PLL_P = 2 * PLL_Q = 7 * VDD(V) = 3.3 * Main regulator output voltage = Scale1 mode * Flash Latency(WS) = 5 * @param None * @retval None */ RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitTypeDef RCC_OscInitStruct; /* Enable Power Control clock */ __PWR_CLK_ENABLE(); /* The voltage scaling allows optimizing the power consumption when the device is clocked below the maximum system frequency, to update the voltage scaling value regarding system frequency refer to product datasheet. */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /* Enable HSE Oscillator and activate PLL with HSE as source */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; HAL_RCC_OscConfig(&RCC_OscInitStruct); /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */ RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); //opis je na strani 551 knjige sa opisom HAL driver-a } void GPIO_Init() { //led dioda na PD12======================= __GPIOD_CLK_ENABLE(); GPIO_InitTypeDef GpioStructure; GpioStructure.Pin=GPIO_PIN_12; GpioStructure.Mode=GPIO_MODE_OUTPUT_PP; GpioStructure.Pull=GPIO_PULLUP; GpioStructure.Speed=GPIO_SPEED_FAST; HAL_GPIO_Init(GPIOD, &GpioStructure); //======================================== //plavi taster za eksterni interapt======= __GPIOA_CLK_ENABLE(); GPIO_InitTypeDef GpioStructure2; GpioStructure2.Pin=GPIO_PIN_0; GpioStructure2.Mode=GPIO_MODE_IT_RISING; GpioStructure2.Pull=GPIO_NOPULL; GpioStructure2.Speed=GPIO_SPEED_FAST; HAL_GPIO_Init(GPIOA, &GpioStructure2); //omoguci interapt======================== HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); //======================================== } void EXTI0_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); //hendler cuva zahtev za prekid } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) //funkcija dobija poziv za prekid { if(GPIO_Pin==GPIO_PIN_0) { HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12); } } int main(int argc, char* argv[]) { HAL_Init(); SystemClock_Config(); GPIO_Init(); while (1) { } } #pragma GCC diagnostic pop Hvala na pomoci... |