Nucleo F103 dioda nie miga na pinach

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
StaryAnoda_NEW
User
User
Posty: 103
Rejestracja: środa 04 kwie 2018, 16:48

Nucleo F103 dioda nie miga na pinach

Postautor: StaryAnoda_NEW » czwartek 05 kwie 2018, 16:25

Hej

Mam problem posiadam płytkę NUCLEO z procesorem STM32F103RBT6. Nie mogę dać sobie rady z zamiganiem diodami na pinach PB3 i PB4. Dowiedziałem się, że jest spowodowane używaniem tych linii przez interfejs JTAG. Zgodnie z notą katalogową próbowałem wyłączyć ten interfejs. Dioda na PB3 zaczęła działać, ale dioda na PB4 nadal jest martwa, czy ma może ktoś jakiś pomysł co jest nie tak ?

Załączam kod:

Kod: Zaznacz cały

#include <STM32F1xx.h>
 
int main(void)
{
   RCC-> APB2ENR =  RCC_APB2ENR_IOPBEN;

   RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
   AFIO->MAPR |= (0b010 << 24);

   GPIOB->CRL |= GPIO_CRL_MODE3_1;
   GPIOB->CRL &= ~GPIO_CRL_CNF3_0;

   GPIOB->CRL |= GPIO_CRL_MODE4_1;
   GPIOB->CRL &= ~GPIO_CRL_CNF4_0;

   GPIOB->CRL |= GPIO_CRL_MODE5_1;
   GPIOB->CRL &= ~GPIO_CRL_CNF5_0;

   volatile uint64_t delay;

   while(1)
   {
      GPIOB->ODR |= GPIO_ODR_ODR3;
      GPIOB->ODR |= GPIO_ODR_ODR4;
      GPIOB->ODR |= GPIO_ODR_ODR5;

      for(delay = 10000; delay; delay--){};
      GPIOB->ODR &= ~GPIO_ODR_ODR3;
      GPIOB->ODR &= ~GPIO_ODR_ODR4;
      GPIOB->ODR &= ~GPIO_ODR_ODR5;
      for(delay = 10000; delay; delay--){};

   }
}


Pozdrawiam

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: Nucleo F103 dioda nie miga na pinach

Postautor: Antystatyczny » czwartek 05 kwie 2018, 16:36

Widzę, że ustawiasz każdy pin w tryb"01: General purpose output Open-drain". Rozumiem, że diody led masz podłączone na stałe do VCC, tak? (tylko się upewniam).
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
StaryAnoda_NEW
User
User
Posty: 103
Rejestracja: środa 04 kwie 2018, 16:48

Re: Nucleo F103 dioda nie miga na pinach

Postautor: StaryAnoda_NEW » czwartek 05 kwie 2018, 16:40

Hej

Masz rację wykryłeś już jeden błąd powinno być:

Kod: Zaznacz cały

#include <STM32F1xx.h>
 
int main(void)
{
   RCC-> APB2ENR =  RCC_APB2ENR_IOPBEN;

   RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
   AFIO->MAPR |= (0b010 << 24);

   GPIOB->CRL |= GPIO_CRL_MODE3;
   GPIOB->CRL &= ~GPIO_CRL_CNF3_0;

   GPIOB->CRL |= GPIO_CRL_MODE4;
   GPIOB->CRL &= ~GPIO_CRL_CNF4_0;

   GPIOB->CRL |= GPIO_CRL_MODE5;
   GPIOB->CRL &= ~GPIO_CRL_CNF5_0;

   volatile uint64_t delay;

   while(1)
   {
      GPIOB->ODR |= GPIO_ODR_ODR3;
      GPIOB->ODR |= GPIO_ODR_ODR4;
      GPIOB->ODR |= GPIO_ODR_ODR5;

      for(delay = 10000; delay; delay--){};
      GPIOB->ODR &= ~GPIO_ODR_ODR3;
      GPIOB->ODR &= ~GPIO_ODR_ODR4;
      GPIOB->ODR &= ~GPIO_ODR_ODR5;
      for(delay = 10000; delay; delay--){};

   }
}


Co nie zmienia fakty, że dioda nadal nie miga.

Pozdrawiam

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: Nucleo F103 dioda nie miga na pinach

Postautor: Antystatyczny » czwartek 05 kwie 2018, 17:09

No to na moje oko kod jest w porządku. Mogę jedynie mieć pewne wątpliwości, czy w prawidłowy sposób wyłączasz JTAG poleceniem AFIO->MAPR |= (0b010 << 24); Możesz ewentualnie spróbować AFIO->MAPR |= ((uint32_t)0b010 << 24); ale to raczej niczego nie zmieni.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
StaryAnoda_NEW
User
User
Posty: 103
Rejestracja: środa 04 kwie 2018, 16:48

Re: Nucleo F103 dioda nie miga na pinach

Postautor: StaryAnoda_NEW » czwartek 05 kwie 2018, 17:10

Ok to dam znać wieczorem jakie rezultaty.

Awatar użytkownika
ZbeeGin
User
User
Posty: 492
Rejestracja: sobota 08 lip 2017, 17:16
Lokalizacja: Śląsko-Zagłębiowska Metropolia
Kontaktowanie:

Re: Nucleo F103 dioda nie miga na pinach

Postautor: ZbeeGin » czwartek 05 kwie 2018, 19:11

W SPL wygląda to tak:

Kod: Zaznacz cały

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);

Czyli:

Kod: Zaznacz cały

#define GPIO_Remap_SWJ_NoJTRST      ((uint32_t)0x00300100)  /*!< Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST */
#define GPIO_Remap_SWJ_JTAGDisable  ((uint32_t)0x00300200)  /*!< JTAG-DP Disabled and SW-DP Enabled */
#define GPIO_Remap_SWJ_Disable      ((uint32_t)0x00300400)  /*!< Full SWJ Disabled (JTAG-DP + SW-DP) */

Kod: Zaznacz cały

#define DBGAFR_POSITION_MASK        ((uint32_t)0x000F0000)
#define DBGAFR_SWJCFG_MASK          ((uint32_t)0xF0FFFFFF)
#define DBGAFR_LOCATION_MASK        ((uint32_t)0x00200000)
#define DBGAFR_NUMBITS_MASK         ((uint32_t)0x00100000)
(...)

void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)
{
  uint32_t tmp = 0x00, tmp1 = 0x00, tmpreg = 0x00, tmpmask = 0x00;

  /* Check the parameters */
  assert_param(IS_GPIO_REMAP(GPIO_Remap));
  assert_param(IS_FUNCTIONAL_STATE(NewState)); 
 
  if((GPIO_Remap & 0x80000000) == 0x80000000)
  {
    tmpreg = AFIO->MAPR2;
  }
  else
  {
    tmpreg = AFIO->MAPR;
  }

  tmpmask = (GPIO_Remap & DBGAFR_POSITION_MASK) >> 0x10;
  tmp = GPIO_Remap & LSB_MASK;

  if ((GPIO_Remap & (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK)) == (DBGAFR_LOCATION_MASK | DBGAFR_NUMBITS_MASK))
  {
    tmpreg &= DBGAFR_SWJCFG_MASK;
    AFIO->MAPR &= DBGAFR_SWJCFG_MASK;
  }
  else if ((GPIO_Remap & DBGAFR_NUMBITS_MASK) == DBGAFR_NUMBITS_MASK)
  {
    tmp1 = ((uint32_t)0x03) << tmpmask;
    tmpreg &= ~tmp1;
    tmpreg |= ~DBGAFR_SWJCFG_MASK;
  }
  else
  {
    tmpreg &= ~(tmp << ((GPIO_Remap >> 0x15)*0x10));
    tmpreg |= ~DBGAFR_SWJCFG_MASK;
  }

  if (NewState != DISABLE)
  {
    tmpreg |= (tmp << ((GPIO_Remap >> 0x15)*0x10));
  }

  if((GPIO_Remap & 0x80000000) == 0x80000000)
  {
    AFIO->MAPR2 = tmpreg;
  }
  else
  {
    AFIO->MAPR = tmpreg;
  } 
}

Awatar użytkownika
StaryAnoda_NEW
User
User
Posty: 103
Rejestracja: środa 04 kwie 2018, 16:48

Re: Nucleo F103 dioda nie miga na pinach

Postautor: StaryAnoda_NEW » czwartek 05 kwie 2018, 21:09

Kolego ZbeeGin

Czy możesz mi skompilować przykład, aby dioda była ustawiona na pin PB4 i aby miała za zadanie migać ?

Awatar użytkownika
StaryAnoda_NEW
User
User
Posty: 103
Rejestracja: środa 04 kwie 2018, 16:48

Re: Nucleo F103 dioda nie miga na pinach

Postautor: StaryAnoda_NEW » czwartek 05 kwie 2018, 21:31

Ok to coś jest na rzeczy

Nucleo_blink_led123_NUCLEO_F103RB .rar


Dioda miga na pinie PB4 D5

Projekt skompilowany przy użyciu platformy http://www.mbed.com
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
ZbeeGin
User
User
Posty: 492
Rejestracja: sobota 08 lip 2017, 17:16
Lokalizacja: Śląsko-Zagłębiowska Metropolia
Kontaktowanie:

Re: Nucleo F103 dioda nie miga na pinach

Postautor: ZbeeGin » czwartek 05 kwie 2018, 23:18

Rozwiązaniem problemu jest zmiana sekwencji zerowania bitów w rejestrze CRL. Musisz napisać:

Kod: Zaznacz cały

   GPIOB->CRL |= GPIO_CRL_MODE3;
   GPIOB->CRL &= ~GPIO_CRL_CNF3_0;

   GPIOB->CRL |= GPIO_CRL_MODE4;
   GPIOB->CRL &= ~GPIO_CRL_CNF4_1;

   GPIOB->CRL |= GPIO_CRL_MODE5;
   GPIOB->CRL &= ~GPIO_CRL_CNF5_0;


Tak się składa, że domyślnie PB4 ma odmiennie ustawiony tryb pracy tuż po resecie. Na bitach CNF4[1:0] nie jest tam 0b01 (Praca jako IN_Float), tylko 0b10 (Praca jako IN_PullUp, z uwagi na jedynkę w ODR[4]). Stąd zerując bit CNF4_0, tak na prawdę nic nie zmieniasz. Musisz wyzerować CNF4_1 by uzyskać tryb OUT_PushPull w połączeniu z MODE[1:0] = 0b11.

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

Awatar użytkownika
StaryAnoda_NEW
User
User
Posty: 103
Rejestracja: środa 04 kwie 2018, 16:48

Re: Nucleo F103 dioda nie miga na pinach

Postautor: StaryAnoda_NEW » piątek 06 kwie 2018, 09:50

Ok

No u mnie też działa. Jak widać dałem się zwieść nocie katalogowej gdzie po resecie domyślna wartość jest 0x44444444, a taka nie jest. Dobra nauczka na przyszłość. Bardzo dziękuję kolegom ZbeeGin oraz Antystatyczny za pomoc w rozwiązaniu problemu.


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 2 gości