Strona 1 z 1

[Nucleo][F103]Automagiczna (?) konfiguracja zegara

: sobota 29 lip 2017, 13:31
autor: xor
Jest sobie taki prościutki program, który ma migać LEDem 1x na sekundę:

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:

rcc2.png


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?

Re: [Nucleo][F103]Automagiczna (?) konfiguracja zegara

: sobota 29 lip 2017, 14:03
autor: StaryAnoda
Hej

A w projekcie nie masz przypadkiem plików od bibliotek SPL które zostały dołączone w trakcie tworzenia projektu ?

Re: [Nucleo][F103]Automagiczna (?) konfiguracja zegara

: sobota 29 lip 2017, 15:39
autor: dambo
Tak jak mówi kolega wyżej - może coś się dodaje dodatkowo. Np w Atollicu przy tworzeniu projektu w pliku assemblerowym mamy takie coś:

Kod: Zaznacz cały

/* Call the clock system intitialization function.*/
    bl  SystemInit
/* Call static constructors */
    bl __libc_init_array
/* Call the application's entry point.*/
   bl   main
   


System init to funkcja z pliku system.c - tam są domyślne ustawienia zegarów na PLL itp :p walczyłem z tym kiedyś dłuuuuuuugo :/

Re: [Nucleo][F103]Automagiczna (?) konfiguracja zegara

: sobota 29 lip 2017, 16:37
autor: xor
No tak, w listingu asm widać funkcję SetSysClockTo72, która jest zdefiniowana w cmsis/system_stm32f10x.c Muszę się z tym bliżej zapoznać.

A propos, dambo interesowałeś się QEMU, no więc powiem Ci, że program z pierwszego posta na Qemu w ogóle nie działa. Konfiguracja nawet nie jest widoczna w rejestrach. Mówię o forku GNU MCU Eclipse QEMU stąd: https://gnu-mcu-eclipse.github.io/qemu/
Gdzieś tam na forum widziałem, że autor coś wspominał o niezbyt dobrym działaniu timerów, może chodziło mu o timery ogólnego przeznaczenia (nie sprawdzałem) albo systick (ten sprawdziłem i działa)?

Re: [Nucleo][F103]Automagiczna (?) konfiguracja zegara

: sobota 29 lip 2017, 16:40
autor: dambo
no właśnie to QUEMu - więcej z tym się męczyłem niż pożytku miałem :p muszę się nauczyć pisać skrypty do debugera i na prockach "na żywo" robić to co chcę