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
#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
#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...