STM32F103 Timer 1 na rejestrach

Wszystko o co chcesz zapytać na temat mikrokontrolerów ARM firmy STMicroelectronics: problemy z pisaniem programu, problemy sprzętowe, niejasności w DS czy AN itp.
StaryAnoda

STM32F103 Timer 1 na rejestrach

Postautor: StaryAnoda » środa 16 lis 2016, 16:04

Hej

Jak to zwykle ja, tym razem mam problem z Timerem1. Chciałbym go użyć to odliczania opóźnień mikro sekundowych. I w takiej konfiguracji opóźnienia mam na poziomie 20 mikro sekund.

TAKTOWANIE MAM USTAWIONE NA 8MHz z resztą sami zobaczcie:

Kod: Zaznacz cały

#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
 #define SYSCLK_FREQ_HSE    HSE_VALUE
/* #define SYSCLK_FREQ_24MHz  24000000 */
#else
 #define SYSCLK_FREQ_HSE    HSE_VALUE
/* #define SYSCLK_FREQ_24MHz  24000000 */
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
/* #define SYSCLK_FREQ_72MHz  72000000 */
#endif


Kod main.c wygląda tak:

Kod: Zaznacz cały

#include "stm32f10x.h"

void delay(uint16_t time);

int main (void)
{

   RCC -> APB2ENR = RCC_APB2ENR_IOPBEN | RCC_APB2ENR_TIM1EN;

   TIM1 -> PSC = 8;
   TIM1 -> ARR = 65535;
   TIM1 -> CR1 = TIM_CR1_CEN;

   GPIOB -> CRL |= GPIO_CRL_MODE1_1;
   GPIOB -> CRL &= ~GPIO_CRL_CNF1_0;

   while(1)
   {
      GPIOB -> ODR |= GPIO_ODR_ODR1;
      delay(100);
      GPIOB -> ODR &= ~GPIO_ODR_ODR1;
      delay(100);
   }
}

void delay(uint16_t time)
{
   TIM1->CNT = 0;
   while (TIM1->CNT<=time);
}

ps19
Newb
Newb
Posty: 56
Rejestracja: poniedziałek 05 paź 2015, 22:27
Lokalizacja: Opole
Kontaktowanie:

Re: STM32F103 Timer 1 na rejestrach

Postautor: ps19 » środa 16 lis 2016, 19:52

Chcesz mieć 1 us ?

To policz sobie że z twoich 8*10^6 / (65535+1)*(8+1) wychodzi właśnie 20 us.

StaryAnoda

Re: STM32F103 Timer 1 na rejestrach

Postautor: StaryAnoda » środa 16 lis 2016, 20:14

Podmieniłem taki sam efekt dalej 20 us zamiast 100

Kod: Zaznacz cały

#include "stm32f10x.h"

void delay(uint16_t time);

int main (void)
{

   RCC -> APB2ENR = RCC_APB2ENR_IOPBEN | RCC_APB2ENR_TIM1EN;

   TIM1 -> PSC = 999;
   TIM1 -> ARR = 7999;
   TIM1 -> CR1 = TIM_CR1_CEN;

   GPIOB -> CRL |= GPIO_CRL_MODE1_1;
   GPIOB -> CRL &= ~GPIO_CRL_CNF1_0;

   while(1)
   {
      GPIOB -> ODR |= GPIO_ODR_ODR1;
      delay(100);
      GPIOB -> ODR &= ~GPIO_ODR_ODR1;
      delay(100);
   }
}

void delay(uint16_t time)
{
   TIM1->CNT = 0;
   while (TIM1->CNT<=time);
}

ps19
Newb
Newb
Posty: 56
Rejestracja: poniedziałek 05 paź 2015, 22:27
Lokalizacja: Opole
Kontaktowanie:

Re: STM32F103 Timer 1 na rejestrach

Postautor: ps19 » środa 16 lis 2016, 20:39

Zrób to na przerwaniu (np. i++) i w funkcji delay sprawdzaj whilem czy time <= i jak wyjdzie z whila to i = 0 to powinno działać.

StaryAnoda

Re: STM32F103 Timer 1 na rejestrach

Postautor: StaryAnoda » czwartek 17 lis 2016, 15:39

Zrobiłem tak niestety efekt jest taki sam niepoprawne odmierzanie czasu

ps19
Newb
Newb
Posty: 56
Rejestracja: poniedziałek 05 paź 2015, 22:27
Lokalizacja: Opole
Kontaktowanie:

Re: STM32F103 Timer 1 na rejestrach

Postautor: ps19 » czwartek 17 lis 2016, 15:52

Podrzuć cały projekt, bo nie wiem co masz namieszane w zegarach. Najlepiej w spakowany do zip`a.

StaryAnoda

Re: STM32F103 Timer 1 na rejestrach

Postautor: StaryAnoda » czwartek 17 lis 2016, 15:58

Załącznik
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

ps19
Newb
Newb
Posty: 56
Rejestracja: poniedziałek 05 paź 2015, 22:27
Lokalizacja: Opole
Kontaktowanie:

Re: STM32F103 Timer 1 na rejestrach

Postautor: ps19 » czwartek 17 lis 2016, 16:01

Na czym robisz testy - Nucleo i jak tak to czy masz wlutowany kwarc + kondensatory ?

StaryAnoda

Re: STM32F103 Timer 1 na rejestrach

Postautor: StaryAnoda » czwartek 17 lis 2016, 16:06

Tak Nucleo F103, nic tam nie było modyfikowanie

ps19
Newb
Newb
Posty: 56
Rejestracja: poniedziałek 05 paź 2015, 22:27
Lokalizacja: Opole
Kontaktowanie:

Re: STM32F103 Timer 1 na rejestrach

Postautor: ps19 » czwartek 17 lis 2016, 16:12

No właśnie, a odpalasz HSE czyli zewnętrzny kwarc, którego nie ma ;)
Nucleo posiada kwarc, ale jest on dla procka odpowiedzialnego za programator SWD, jak chcesz używać HSE to na samym dole musisz wlutować kwarc 8 Mhz oraz kondensatory 18 pF (chyba 0402). Jak chcesz osiągnąć wyższe częstotliwości z HSI to trzeba włączyć PLL. Wrzucałem Ci niedawno konfigurację HSI dla 64 Mhz (Jak chcesz 72 Mhz to kwarc) - gdzie wystarczy zmienić tylko 1/0 i ewentualnie częstotliwość w define.

Włącz HSI, czyli:

Kod: Zaznacz cały

#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
 #define SYSCLK_FREQ_HSE    HSE_VALUE
/* #define SYSCLK_FREQ_24MHz  24000000 */
#else
/* #define SYSCLK_FREQ_HSE    HSI_VALUE  */
/* #define SYSCLK_FREQ_24MHz  24000000 */
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
/* #define SYSCLK_FREQ_72MHz  72000000 */
#endif

StaryAnoda

Re: STM32F103 Timer 1 na rejestrach

Postautor: StaryAnoda » czwartek 17 lis 2016, 16:28

Ok zrobiłem tak jak napisałeś problem ten sam mam wrażenie, że problemem jest init Timera

ps19
Newb
Newb
Posty: 56
Rejestracja: poniedziałek 05 paź 2015, 22:27
Lokalizacja: Opole
Kontaktowanie:

Re: STM32F103 Timer 1 na rejestrach

Postautor: ps19 » czwartek 17 lis 2016, 17:21

To powinno zadziałać:

Kod: Zaznacz cały

#include "stm32f10x.h"

int timer;

__attribute__((interrupt)) void TIM4_IRQHandler(void)
{
   if (TIM4->SR & TIM_SR_UIF)
   {
      TIM4->SR = ~TIM_SR_UIF;
      timer++;
      if(timer >= 500) timer = 0;
   }
}

int main (void)
{
   RCC -> APB2ENR |= RCC_APB2ENR_IOPBEN;
   RCC -> APB1ENR |= RCC_APB1ENR_TIM4EN;

   TIM4 -> PSC = 8000;
   TIM4 -> ARR = 1000;
   TIM4 -> DIER = TIM_DIER_UIE;
   TIM4 -> CR1 = TIM_CR1_CEN;

   GPIOB -> CRL |= GPIO_CRL_MODE1_1;
   GPIOB -> CRL &= ~GPIO_CRL_CNF1_0;

   while(1)
   {
      if(timer >= 5)
      {
         GPIOB -> ODR ^= GPIO_ODR_ODR1;
         timer = 0;
      }
   }
}

StaryAnoda

Re: STM32F103 Timer 1 na rejestrach

Postautor: StaryAnoda » czwartek 17 lis 2016, 17:44

Ok dzięki dodając do zmiennej atrybut volatile i odblokowując przerwanie zadziałało dzięki

ps19
Newb
Newb
Posty: 56
Rejestracja: poniedziałek 05 paź 2015, 22:27
Lokalizacja: Opole
Kontaktowanie:

Re: STM32F103 Timer 1 na rejestrach

Postautor: ps19 » czwartek 17 lis 2016, 18:17

Tak zapomniałem o tym, ale dobrze że działa.


Wróć do „ARM STMicroelectronics”

Kto jest online

Użytkownicy przeglądający to forum: Google [Bot] i 1 gość