CM3 System Tick interruptin priorty degerini degistirmek mumkun mu?

Başlatan z, 22 Ekim 2021, 10:31:25

z

CM3 System Tick interruptin priorty degerini degistirmek mumkun mu?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

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)
Gökçe Tağlıoğlu

z

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.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tagli

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 IRQn, uint32_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ş.
Gökçe Tağlıoğlu

z

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 az, digerleri bunu kesebilecek)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com