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

Pytania dotyczące problemów ze zrozumieniem kart katalogowych, not aplikacyjnych dla mkrokontrolerów ARM firmy STMicroelectronics, rozwiązania układowe z zastosowaniem STM.
Awatar użytkownika
xor
User
User
Posty: 169
Rejestracja: poniedziałek 05 wrz 2016, 21:44

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

Postautor: xor » sobota 29 lip 2017, 13:31

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?
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

StaryAnoda

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

Postautor: StaryAnoda » sobota 29 lip 2017, 14:03

Hej

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

Awatar użytkownika
dambo
Expert
Expert
Posty: 645
Rejestracja: czwartek 17 mar 2016, 17:12

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

Postautor: dambo » sobota 29 lip 2017, 15:39

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 :/
Nowy blog o tematyce embedded -> https://www.embedownik.pl/

Awatar użytkownika
xor
User
User
Posty: 169
Rejestracja: poniedziałek 05 wrz 2016, 21:44

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

Postautor: xor » sobota 29 lip 2017, 16:37

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)?

Awatar użytkownika
dambo
Expert
Expert
Posty: 645
Rejestracja: czwartek 17 mar 2016, 17:12

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

Postautor: dambo » sobota 29 lip 2017, 16:40

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ę
Nowy blog o tematyce embedded -> https://www.embedownik.pl/


Wróć do „STM - problemy układowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości