CM3 System Tick interruptin priorty degerini degistirmek mumkun mu?
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)
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.
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ş.
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)