До сих пор программа писалась с использованием библиотеки HAL. Опять скажут это слишком просто - а вот напрямую с регистрами.
Проверим не потеряли мы ли контроль над железом - отказываемся от услуг HAL, настраиваем периферию напрямую:
//=============================================================================
// TIM3 Interrupt Handler
//=============================================================================
void TIM3_IRQHandler(void)
{
if(TIM3->SR & TIM_SR_UIF) // if UIF flag is set
{
TIM3->SR &= ~TIM_SR_UIF; // clear UIF flag
GPIOB->ODR ^=GPIO_ODR_11;
}
}
int main(void)
{
//HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* System interrupt init*/
//HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
/* GPIOB Periph clock enable */
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
GPIOB->MODER |= (GPIO_MODER_MODER11_0 | GPIO_MODER_MODER12_0) ; /* Configure PB11 and PB12 output mode */
GPIOB->OTYPER &= ~(GPIO_OTYPER_OT_11 | GPIO_OTYPER_OT_12) ; // Ensure push pull mode selected--default
GPIOB->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR11|GPIO_OSPEEDER_OSPEEDR12); //Ensure maximum speed setting (even though it is unnecessary)
GPIOB->PUPDR &= ~(GPIO_PUPDR_PUPDR11|GPIO_PUPDR_PUPDR12); //Ensure all pull up pull down resistors are disabled
GPIOB->BSRRL = GPIO_BRR_BR_12; // Set
/* TIM3 clock enable */
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
TIM3->PSC = 48000 - 1; // Set prescaler to 48000 = 48 000 000Hz/48000 = 1000 Hz = 1 ms
TIM3->ARR = 500 - 1; // Auto reload value 500 = 500mS
TIM3->DIER = TIM_DIER_UIE; // Enable update interrupt (timer level)
TIM3->CR1 = TIM_CR1_CEN; // Enable timer
NVIC_EnableIRQ(TIM3_IRQn); // Enable interrupt from TIM3 (NVIC level)
while (1)
{
}
}
Проверяем - точки мигают.
Ну и в принципе непонятно, почему считается настройка периферии в стм32 сложной, по сравнению с AVR PIC16 ... Наоборот у AVR и PIC16 такой разнобой в периферии - у новичка должна кружиться голова.