STM32'de kesme önceliği konusu

Başlatan Mucit23, 16 Haziran 2017, 17:08:07

Mucit23

STM32F103C8 çipim ile denemeler yapıyorum.

Bu çipte aynı anda iki kesme kullanmam gerekti. Timer kesmesi ile DMA TC kesmesi aynı anda çalışıyor. Fakat öyleki Timer kesmesi kesinlikle sekteye uğramaması gerekiyor.  İki kesme aynı anda oluştuğu zaman Timer kesmesine öncelik verilmesini istiyorum. Yada Timer kesmesi içerisindeyken DMA TC kesmesi gelirse sistem nasıl davranacak bilmiyorum.

Öğrenmek istediğim konu şudur.

Kesme ayarlarını yaparken bazı parametreler var öncelikle ilgili.
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
   NVIC_SetPriority(TIM2_IRQn,0);
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

Datasheeti biraz inceledim açıkçası ama pek anlayamadım. Biraz karışık bir konu. Bu konuyu anlatacak birileri varmı?


magnetron

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  ( bunu başa yazıyorsun )

( öncelikli )
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
....
....

( öncelikli değil )
    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
....
....

STD peripheral library' nin proje örneklerine bak

Mucit23

Hocam selamlar

Hafta sonu il dışında olduğum için bakamadım. Bu sabah yazdıklarınızı denedim. Fakat bir değişim göremedim.

Timer kesmesi ve DMA TC kesmesini aynı anda kullanıyorum. Amacım Timer kesmesi ile DMA TC kesmesi aynı anda oluşursa veya Program Timer kesmesini icra ediyorken DMA TC kesmesi gelirse program sekteye uğramasın.

Timer için NVIC ayarlarım aşağıdaki gibi.
void NVIC_Configuration(void) { 
  NVIC_InitTypeDef NVIC_InitStructure;

	/* Configure one bit for preemption priority */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	  
	NVIC_SetPriority(TIM2_IRQn,1);
	/* Enable the TIM1 Interrupt */
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}


Buda DMA TC kesmesi için NVIC ayarlarım.
  	/* Configure one bit for preemption priority */
	   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
		 
		 /* Enable the DMA1 TC Interrupt */
		NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
		NVIC_Init(&NVIC_InitStructure);
		
		/* DMA Transfer Complete interrupt Enable*/
		DMA_ITConfig(DMA1_Channel1,DMA1_IT_TC1,ENABLE);


Timer ile Sürekli ekran taraması gibi işlemler yapıyorum. DMA kesmesi oluşursa ekranda kırpışmalar oluşuyor. DMA kesmesini kapatırsam sorun yok. Sanki program Timer kesmesi içerisindeyken DMA kesmesi gelirse Timer kesmesindeki işini bırakıp DMA kesmesine gidiyor.

Nasıl çözülebilir bu sorun anlayamadım. Bahsettiğiniz preemption değerleri ile oynadım ama sonuç değişmiyor.

magnetron

bu kodlar STD peripharal library ise

NVIC_SetPriority(TIM2_IRQn,1);

satırını kaldırıp deneyiniz

bir de önceden yabancı foruma sorduğum soruya gelen cevap


========================================================

Well, the NVIC has many possible configurations.

Basically you can assign a flat interrupt priority level, where interrupts of a higher priority will preempt ones which are already running of a lower priority level.

Then there is a less flat mode, where several interrupts can share the same priority level and won't interrupt the processing of each other, but ones (or groups) with a higher priority will.

As I recall you have 4-bits to represent these levels and sublevels. So you could program it with 8 priority levels and 2 sub levels, or 4 priority levels and 4 sub levels, etc.

The trick is to understand how you want to prioritize things, whether in normal operation some things with equivalent importance are occuring, or if other things are critically important. The other trick is to make sure no two interrupts are set with the same priority/sub setting.

For an encoder, I would want it to have a very high priority (low latency), even through I would expect it to have a low frequency of use. Basically the interrupt code would get in and out quickly





Suggest you pull ARM's documentation of the NVIC, or Joseph Yiu's book.

The PriorityGroup works along these lines..

Lower numbers, higher priority

NVIC_PriorityGroup_0 - 0 bits for pre-emptions, 4-bits for sub priority

Flat, no pre-emption, highest sub priorities pending will execute first

Pre.Sub

0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
0.10
0.11
0.12
0.13
0.14
0.15

NVIC_PriorityGroup_1 - 1 bit for pre-emptions, 3-bits for sub priority

Two Groups, 0.x has preemption priority over 1.x

Pre.Sub

0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7

1.0
1.1
1.2
1.3
1.4
1.5
1.6
1.7

NVIC_PriorityGroup_2 - 2 bits for pre-emption, 2-bits for sub priority

Pre.Sub

0.0
0.1
0.2
0.3

1.0
1.1
1.2
1.3

2.0
2.1
2.2
2.3

3.3
3.3
3.3
3.3


NVIC_PriorityGroup_3 - 3 bits for pre-emption, 1-bit for sub priority

Pre.Sub

0.0
0.1

1.0
1.1

2.0
2.1

3.0
3.1

4.0
4.1

5.0
5.1

6.0
6.1

7.0
7.1

NVIC_PriorityGroup_4 - 4 bits for pre-emption, 0-bits for sub priority

Flat, higher priority will always pre-empt running interrupt code for lower priority

Pre.Sub

0.0
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0
10.0
11.0
12.0
13.0
14.0
15.0


Mucit23

Yapıyı biraz anladım ama çözümü bulamadım henüz. Değişikliklere tepki alamıyorum.


Anladığım kadarıyla Subpriority ile işim yok. SubPriority parametresi aynı türden kesmeleri için kullanılıyor. Örneğin USART1 ve USART2 aynı anda kullanılırsa Bu parametre üzerinden öncelik ataması yapılıyor.


Preempriority ise farklı türden kesme kanalları için kullanılıyor. Benim örnekte olduğu gibi TIM2_IRQn ile DMA1_Channel1_IRQn kesmeleri kullanılacaksa preempriority üzerinden öncelik ataması yapılıyor.


Fakat anlamadığım priority grubu neye göre seçiyoruz. Bu değere Göre preemp ve SubPriority değerlerinin alacağı değerler değişiyor.


Bu kısmı tam olarak anlayamadım.

magnetron


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
seçince olması lazım


öncelik preemption ile sağlanıyor  0 öncelikli 1 öncelikli değil


ben bunu denemiştim bende çalıştı


eğer gene de olmuyorsa
bir interrupt içindeyken aşağıdaki komutlarla başka int. gelmesini engelleyebilirsin - o sırada gelen int.lar bekliyor

__disable_irq();


bu arada interrupt gelmez


__enable_irq();

Mucit23

Hocam benim galiba kesme ile ilgili sıkıntım yok. Yada kesme önceliği ile ilgili. Çünkü DMA TC kesmesini tümüyle kapatsam dahi bu sorun oluşuyor. Anlamıyorum.

Bir yandan TM2 sürekli 1ms aralıklarla kesme oluşturuyor. Diğer yandan TIM3 ADC ve DMA örnek alıp kesme oluşturuyor. Ama her nedense TIM3 ADC ve DMA üçlücü beraber çalışınca TIM2 rutinleri sekteye uğruyor. Sorunu anlamaya çalışıyorum.