Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Stm Std Lib Hakkında

Başlatan yamak, 19 Aralık 2013, 15:37:33

yamak

Stm Std Lib'in EXTI kodlarını incelerken birşey dikkatimi çekti:
Mesela aşağıdaki kodda
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
{
  uint32_t tmp = 0;

  /* Check the parameters */
  assert_param(IS_EXTI_MODE(EXTI_InitStruct->EXTI_Mode));
  assert_param(IS_EXTI_TRIGGER(EXTI_InitStruct->EXTI_Trigger));
  assert_param(IS_EXTI_LINE(EXTI_InitStruct->EXTI_Line));  
  assert_param(IS_FUNCTIONAL_STATE(EXTI_InitStruct->EXTI_LineCmd));

  tmp = (uint32_t)EXTI_BASE;
     
  if (EXTI_InitStruct->EXTI_LineCmd != DISABLE)
  {
    /* Clear EXTI line configuration */
    EXTI->IMR &= ~EXTI_InitStruct->EXTI_Line;
    EXTI->EMR &= ~EXTI_InitStruct->EXTI_Line;
    
    tmp += EXTI_InitStruct->EXTI_Mode;

    *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line;

    /* Clear Rising Falling edge configuration */
    EXTI->RTSR &= ~EXTI_InitStruct->EXTI_Line;
    EXTI->FTSR &= ~EXTI_InitStruct->EXTI_Line;
    
    /* Select the trigger for the selected external interrupts */
    if (EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling)
    {
      /* Rising Falling edge */
      EXTI->RTSR |= EXTI_InitStruct->EXTI_Line;
      EXTI->FTSR |= EXTI_InitStruct->EXTI_Line;
    }
    else
    {
      tmp = (uint32_t)EXTI_BASE;
      tmp += EXTI_InitStruct->EXTI_Trigger;

      *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line;
    }
  }
  else
  {
    tmp += EXTI_InitStruct->EXTI_Mode;

    /* Disable the selected external lines */
    *(__IO uint32_t *) tmp &= ~EXTI_InitStruct->EXTI_Line;
  }
}

Neden bazı durumlarda registera veriyi önceden tanımlanmış structure ı kullanarak yazarken,bazı durumlarda EXTI register ının Base adresini başka bir Pointer a atıp o pointer'a yazıyor.
Örneğin aşağıdaki kodda EXTI_InitStruct->EXTI_Trigger 0x10 a eşitse structure ı kullanıyo,diğer durumlarda EXTI nın base adresini tmp adlı değişkene atıp o değişken üzerinden işlem yapıyo.
if (EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling)
    {
      /* Rising Falling edge */
      EXTI->RTSR |= EXTI_InitStruct->EXTI_Line;
      EXTI->FTSR |= EXTI_InitStruct->EXTI_Line;
    }
    else
    {
      tmp = (uint32_t)EXTI_BASE;
      tmp += EXTI_InitStruct->EXTI_Trigger;

      *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line;
    }
  }

Bunun belli bi nedeni var mı?Yoksa kodu yazan fantazi yapmış :)

ercan_t

merhaba,

koddan anladığım

static olan EXTI_BASE sabit değişkeni ( #define komutu ile tanınmış olabilir)
dinamic tmp değişkene atıp onun üzerinde ekleme cıkarma ve veya işlemleri kullanarak EXTI_BASE  registerin point ettiği diğer registerlerı kullanmak.

yamak

Hocam EXTI_BASE zaten stm32f4xx.h dosyasında tanımlı.Ondan bahsetmiyorum.Neden ayrıca bi değişken üzerinden erişiyo onu merak ettim.Galiba adamın canı öyle yazmak istemiş.Yoksa benim aklıma başka bişey gelmiyo.