#include "stm32f10x.h" volatile unsigned int TimeTick=0; volatile unsigned int oneMsTick=0; void TIM3_IRQHandler(void) { //debugging: one high-pulse on GPIO A3 GPIOA->BSRR = GPIO_Pin_3; GPIOA->BRR = GPIO_Pin_3; TimeTick++; oneMsTick++; TIM3->SR = (uint16_t)~TIM_IT_Update; //statement with no effect (but on volatile variable , so it cannot be optimized out completely) //does not change target size, but changes behaviour for optimization O3 (not for O0) --> gcc optimization bug?? TimeTick; } int main(void) { //Sysinit at 48MHz, optimization: O3 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // GPIOA Periph clock enable RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; // Configure PA3 in output pushpull mode GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); //timer init TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_ClocksTypeDef RCC_ClocksStatus; NVIC_InitTypeDef NVIC_InitStructure; /* Enable timer clocks */ RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE ); TIM_TimeBaseStructInit( &TIM_TimeBaseStructure ); /* Value clock source */ RCC_GetClocksFreq(&RCC_ClocksStatus); /* Initialize register */ TIM_DeInit( TIM3 ); /* Enable the TIM3 global Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Time base configuration for timer - which generates the interrupts. */ TIM_TimeBaseStructure.TIM_Period = 1918; TIM_TimeBaseStructure.TIM_Prescaler = (RCC_ClocksStatus.PCLK1_Frequency / 1000000); TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit( TIM3, &TIM_TimeBaseStructure ); TIM_ARRPreloadConfig( TIM3, ENABLE ); TIM_ITConfig( TIM3, TIM_IT_Update, ENABLE ); /* Finally, enable timer... */ TIM_Cmd( TIM3, ENABLE ); while (1) {//wait forever - do nothing } }