Debug Altında MCU'nun kısmen çalışmaması

Başlatan Mucit23, 25 Eylül 2021, 16:23:26

Mucit23

Selamlar.

Keilde STM32F0 MCU üzerinde debug yaparken ilginç bir sorunla karşılaştım.

USART1 ve USART4 donanımlarını kullanarak Veri alıyorum. USART1 ve USART donanımlarının kullandığı DMA kanalları ortak kesme vektörünü kullanıyor. Dolayısıyla Bütün kesmeler aynı yere düşüyor.

Kesme vektöründe kesmenin nerden geldiğini aşağıdaki şekilde ayırt ediyorum.
void DMA1_Channel4_5_6_7_IRQHandler(void)
{
	if(__HAL_DMA_GET_IT_SOURCE(&hdma_usart1_rx,DMA_IT_TC)!=RESET)
	{
	  HAL_DMA_IRQHandler(&hdma_usart1_rx);
	}
	if(__HAL_DMA_GET_IT_SOURCE(&hdma_usart4_rx,DMA_IT_TC)!=RESET)
	{
	  HAL_DMA_IRQHandler(&hdma_usart4_rx);
	}
}

RX_CallBack rutininde aşağıdaki yapı ile kesmenin nerden geldiğini buluyorum.

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
  MyPrintf(USART4,(uint8_t *)usart1_rx_buffer);			
}
	
if (huart->Instance == USART4) 
{
  MyPrintf(USART1,(uint8_t *)usart4_rx_buffer);
}
}

Basitçe UART1-USART4 arasında köprü kurdum. Normalde yapmak istediğim bu değil ama test için böyle bir uygulama yaptım. Normalde gayet hoş bir şekilde çalışıyor. Fakat Debug'a girdiğimde USART1 den hiçbir veri alamıyorum. Sanki USART1'in RX kanalı donuyor. Fakat USART4 çalışıyor. USART1'in TX kanalıda çalışıyor. USARt1'in RX'ine veri gönderdiğimde hiç gelen veriyi tınlamıyor. USART4'de sıkıntı yok. Debug ile ilgili bir sorun var çünkü DEBUG'dan çıkınca yine normal çalışıyor.

Daha önce böyle bir sorunla karşılaşan var mı?

z

Debuga girmekle ne demek istiyorsun? Debug modunda koda run mi diyorsun?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mucit23

Evet abi aynen öyle. Anlık olarak Watch Window'da rx_buffer gibi değişkenleri izliyorum.

z

Kesmenin hangisi oldugunu tespit ettigin rutine breakpoint koyarsan kod duruyor mu?

Sacma bir durum basina gelmis ama cok mantikli bir aciklamasi olmasi lazim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mucit23

Acaba DMA ile mi alakalı diye düşünüyorum. DMA kullanmadan yapmayı deneyeceğim. Şu aşamada DMA kullanmanın çokda bir faydası yok. Ama USARt1 için DMA kullanırsam ve USART4 için DMA kullanmadan Sadece USART global kesmesini aktif etsem farklı kesme vektörlerine gitmelerini sağlayabilirim.

Mucit23

#5
Alıntı yapılan: z - 25 Eylül 2021, 16:58:52Kesmenin hangisi oldugunu tespit ettigin rutine breakpoint koyarsan kod duruyor mu?

Sacma bir durum basina gelmis ama cok mantikli bir aciklamasi olmasi lazim.

Yok abi hiç kesme içine MCU uğramıyor. Breakpoint koymayı denedim. 

DMA'yı kapattım. İlginç bir sorun gerçekten. Şuan Sadece USART1 global kesmesi aktif. Usart'dan 1 byte'lık sting veriler gönderiyorum. MCU normal çalışıyorken normal olarak veriyi alıyor. Fakat Debug'a girip Run yaptığımda ben veri göndermesem bile USART Global kesmesi sürekli oluşuyor. Rx_buffer'da sürekli olarak 0xFF, 0xFE gibi değerler görüyorum. Sanırım Usart sürekli hatalı veri almaya başlıyor kendi kendine.

MCU harici olarak besleniyor. Besleme gayet iyi.

Çözemedim.

kantirici

Debug sırasında Optimizasyonların kapalı olmalı. Zorunluluk değil ve bu problemi çözmeyebilir yeri gelmiş diye belirtmek istedim.

Mucit23

Evet optimizasyonları kapadım. Fakat değişen birşey olmadı. Anlamadığım bir şekilde sadece usart1 de yapıyor. Usart2, Usart3 ve Usart4 de sorun yok.

kantirici

sorunlu usart'ın kesme bayrağını init. işlemlerinin en sonunda manuel etkinleştirmeyi deneyin. Muhtemelen HAL lib'ler bir yerlerde ona müdahale ediyor olabilir.

z

Usart Debug pinleri ile cakismasin. Gerci bu durum debug islemini de etkiler ama.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com