Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Cortex ARM => Konuyu başlatan: z - 22 Ekim 2021, 13:31:25

Başlık: CM3 System Tick interruptin priorty degerini degistirmek mumkun mu?
Gönderen: z - 22 Ekim 2021, 13:31:25
CM3 System Tick interruptin priorty degerini degistirmek mumkun mu?
Başlık: Ynt: CM3 System Tick interruptin priorty degerini degistirmek mumkun mu?
Gönderen: Tagli - 22 Ekim 2021, 13:49:39
Ben hiç denemedim ama şimdi Programming Manual'a (PM0056) baktım. Anladığım kadarıyla NVIC değil SBC üzerinden değiştiriliyor. Bu bölüme bir bak:

4.4.8 System handler priority registers (SHPRx)
Başlık: Ynt: CM3 System Tick interruptin priorty degerini degistirmek mumkun mu?
Gönderen: z - 22 Ekim 2021, 13:59:37
System Tick  NVIC'e bagli bir int degil. Bugune kadar onceliginin yuksek oldugunu bilmiyordum. System Tick'i de gercek projelerde hic kullanmamistim.

Kaynak makinesinde 1 ms'ye kurup ivir zivir isleri takip etmek icin kullaniyordum.

Fakat makine sik sik asiri akim korumasina gecmeye baslayinca PWM ile ilgili interruptlarin bazen gec cevaplandigini gordum. Suclusu da System Tick cikti.

Neyse sagolasin SCB_SHPR3 den onceligi gerilere ittim ve simdi PWM int system ticki kesmeye basladi.
Başlık: Ynt: CM3 System Tick interruptin priorty degerini degistirmek mumkun mu?
Gönderen: Tagli - 22 Ekim 2021, 16:17:16
Aslında sen sorunca ben NVIC_SetPriority() fonksiyonunu denedin ama işe yaramadı sanmıştım. İsim biraz yanıltıcı çünkü koda bakınca bu fonksiyonun hem NVIC hem de SCB üzerinde işlem yapabildiği gözüküyor.

Aşağıdaki kısım CMSIS'in core_cm3.h dosyasından:
/**
  \brief   Set Interrupt Priority
  \details Sets the priority of a device specific interrupt or a processor exception.
           The interrupt number can be positive to specify a device specific interrupt,
           or negative to specify a processor exception.
  \param [in]      IRQn  Interrupt number.
  \param [in]  priority  Priority to set.
  \note    The priority cannot be set for every processor exception.
 */
__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQnuint32_t priority)
{
  if ((
int32_t)(IRQn) >= 0)
  {
    
NVIC->IP[((uint32_t)IRQn)]               = (uint8_t)((priority << (8U __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
  }
  else
  {
    
SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
  }
}

Yani aslında register'lar ile uğraşmana gerek yokmuş.
Başlık: Ynt: CM3 System Tick interruptin priorty degerini degistirmek mumkun mu?
Gönderen: z - 22 Ekim 2021, 16:40:47
Ben ise yarayacagindan emin degilim deneme ihtiyaci bile duymadim.

Normalde interruptlarimiz 0'dan basliyor. Bu durumda Exeptionlar, NMI vs negatif degerliler.

Ama pardon senin fonksiyonda SCB de negatifleri yukluyor. Ben NVIC fonksiyonumda SCB yi hic kullanmadim. (NVIC rutinim sadece 0 ve ustunu kabul ediyor)

Sanki benim SCB_SHPR3 icin elle eyaptigim seyi bu kisim yapiyor.

                      LDR    R0, =SCB_SHPR3
                      LDR    R1
, =0xFF000000
                      STR    R1
, [R0]                    ; Sys Tick priority dusuruldu (Onceligi cok azdigerleri bunu kesebilecek)