Kod: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
#include "diag/Trace.h"
#include "stm32f10x.h"
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
//#pragma GCC diagnostic ignored "-Wmissing-declarations"
//#pragma GCC diagnostic ignored "-Wreturn-type"
int
main(int argc, char* argv[])
{
//Nucleo64 F103RB
//LED PA5
//Button PC13 z rezystorem 4k7 do Vdd
//LED
//włączenie portu A i licznika 1
RCC->APB2ENR = RCC_APB2ENR_IOPAEN | RCC_APB2ENR_TIM1EN;
//GPIO pin 5 wyjście 2 MHz, LOW
GPIOA->CRL |= GPIO_CRL_MODE5_1; //output 2MHz
GPIOA->CRL &= ~GPIO_CRL_CNF5; //...push-pull
//GPIOA->ODR &= ~GPIO_ODR_ODR5; //LOW
//config TIM1
TIM1->PSC = 7999; //PRESKALER
TIM1->ARR = 999; //top
TIM1->DIER = TIM_DIER_UIE; //włączenie przerwania
TIM1->CR1 = TIM_CR1_CEN; //start timera
//Włączenie przerwania
NVIC_EnableIRQ(TIM1_UP_IRQn);
while (1)
{
}
}
__attribute__((interrupt)) void
TIM1_UP_IRQHandler(void)
{
if (TIM1->SR & TIM_SR_UIF)
{
TIM1->SR &= ~TIM_SR_UIF; //skasowanie flagi przerwania (rc_w0 :-O)
GPIOA->ODR ^= GPIO_ODR_ODR5;
}
}
#pragma GCC diagnostic pop
Jak widać, nie ma żadnej konfiguracji zegara więc zakładam, że wykorzystany jest wewnętrzny oscylator RC 8MHz bez PLL i system clock wynosi 8MHz. Co prawda na nogę OSC_IN jest podany sygnał 8MHz z ST-LINKa, ale skoro nie ma konfiguracji to zakładam, że wykorzystany jest jednak RC.
Ale tak nie jest. Dioda miga znacznie szybciej.
Zaglądam do rejestrów, interesujący okazuje się RCC_CFGR:
SW i SWS ustawione na "PLL as system clock"
PLLSRC na "Clock from PREDIV1 selected as PLL input clock" (czyli HSE)
PLLMUL na "PLL input clock x 9"
Czyli ustawiony jest zewnętrzny zegar i system clock 72MHz.
Co jest grane? Czy to hardware po wykryciu przebiegu na OSC_IN sam ustawił źródło zegara na HSE, a jeśli tak to dlaczego włączył PLL? A może to sprawka jakiś plików startowych?