stm32f4 uart kesmesinden çıkmıyor HAL kütüphanesi

Başlatan forzac, 14 Temmuz 2020, 17:12:49

forzac

merhabalar uart kesmesi ile bir deneme yapıyorum

kesmeye giriyor fakat işlem bittikten sonra kesmeden çıkıp main e dönmüyor.

haliyle kesmeyi tekrar kullanamıyorum

kesme fonksiyonum bu şekilde nasıl yapabilirim yardımcı olursanız çok sevinirim

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance==USART2)
	{
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET);
 
		if(rx_buffer[0]==0x65 && rx_buffer[1]==0x00 && rx_buffer[2]==0x01 && rx_buffer[3]==0x01 &&
		   rx_buffer[4]==0xFF && rx_buffer[5]==0xFF && rx_buffer[6]==0xFF)
			{
			  count++;
			}
 
		if(rx_buffer[0]==0x65 && rx_buffer[1]==0x00 && rx_buffer[2]==0x02 && rx_buffer[3]==0x01 &&
		        rx_buffer[4]==0xFF && rx_buffer[5]==0xFF && rx_buffer[6]==0xFF)
			{
			  count++;
			}
 
		for(int i=0; i<7; i++)
		{
			rx_buffer[i]='\0';
		}
 
		__HAL_UART_CLEAR_FLAG(&huart2,UART_FLAG_CTS);
		__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_LBD);
		__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_TC);
		__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_RXNE);
	}
}

Murat Mert

S.A.
CubeIde ve hal lib de yeniyim ama
__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_RXNE);
kafadan burada uart rx kesmesini kapatmışsın. açıncaya kadar artık çalışmaz.
• CTS: Clear To Send blocks the data transmission at the end of the current transfer when high
Referance manual da 1008. sayfadan itibaren bakın....


mert07

yldzelektronik

Kesmeden çıkmadığına dair işaretiniz nedir? Nasıl emin olabiliyorsunuz kesmeden çıkmadığına? Debug ile mi bakıyorsunuz?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

forzac

Alıntı yapılan: Murat Mert - 14 Temmuz 2020, 23:46:30S.A.
CubeIde ve hal lib de yeniyim ama
__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_RXNE);
kafadan burada uart rx kesmesini kapatmışsın. açıncaya kadar artık çalışmaz.
• CTS: Clear To Send blocks the data transmission at the end of the current transfer when high
Referance manual da 1008. sayfadan itibaren bakın....

inceliyorum hocam

Alıntı yapılan: yldzelektronik - 15 Temmuz 2020, 01:29:10Kesmeden çıkmadığına dair işaretiniz nedir? Nasıl emin olabiliyorsunuz kesmeden çıkmadığına? Debug ile mi bakıyorsunuz?

hocam hem debug ile takip ediyorum hemde count değerim 1 artıyor...tekrar butona bastığımda sabit kalıyor işlemi kesme kullanmadan denediğimde count değerim her butona basışımda artıyor

son kez baktığımda şu sonuca varıyorum
kesmeden çıkıyor ama tekrar kesmeye girmiyor

kimlenbu

Overrun flagını kontrol ediyor musun ? Eğer kontrol etmezsen overrun da kesme tetiklenmesine yol açar ve flagı temizlemezsen kesmeden çıkamazsın.

Ayrıca aşağıdaki üç flagı neden manuel olarak temizliyorsun ? Özellikle TC'i neden manuel temizliyorsun ?

__HAL_UART_CLEAR_FLAG(&huart2,UART_FLAG_CTS);
		__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_LBD);
		__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_TC);

Murat Mert

Alıntı yapılan: forzac - 15 Temmuz 2020, 07:09:15hocam hem debug ile takip ediyorum hemde count değerim 1 artıyor...tekrar butona bastığımda sabit kalıyor işlemi kesme kullanmadan denediğimde count değerim her butona basışımda artıyor

son kez baktığımda şu sonuca varıyorum
kesmeden çıkıyor ama tekrar kesmeye girmiyor

Timer kesmesinda yaptığım hatadan dolayı benimde işlemci donuyordu. Sebep benim kesme içinde yaptığım hata. Sonra Timeri register olarak yaptım çalıştı. hal libde timer kütüphanesini kontrol ettiğimde hatanın bana ait olduğunu gördüm ve düzeltince çok verimli çalıştı.

Uart lib de ise hal library bütün herşeyi kontrol ediyor bitleri açıp kapamanıza gerek yok. Şu an ki projemde uart alma işlemini kendi kesmesinin içinde alıp timer içinde flag tetikleyip rx int bitişini onunla kontrol edip işlemimi yapıyorum. Yaptığım sadece tx den önce rx inti kapatmak tx i açmak.
Uart lib tüm uyarı ve hata bitlerini kontrol edip gerekli işlemi yapıyor ve error ile ilgili olanları da.
MikroC arm da bütün bunları register olarak kendim kontrol ediyordum. Hal libi anlamak ve algılamak biraz şaşırtmalı ve zor ama bir kaç işlemi çözdükten sonra gerisi geliyor. MikroC armın ban faydası registerleri öğrenmeye başlamama neden olması, iyi birşey :)
Lisans olayından dolayı ST CubeIde kullanıyorum mcu ile ilgili işlemleri üzerinde yapmak güzel bir şey.
mert07

forzac

arkadaslar merhaba yardımınıza ihtiyacım var son durumu bildiriyorum

kesme içinde kontrolleri yapıyorum en son yanması gereken tüm ledler yanıyor
kesmeden çıkıyor
while döngüsüne tekrar giriyor
ama tekrar butona basınca tekrar kesmeye girmiyor

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance==USART2)
	{
		reg_CTS = __HAL_UART_GET_FLAG(&huart2,UART_FLAG_CTS);
		reg_LBD = __HAL_UART_GET_FLAG(&huart2,UART_FLAG_LBD);
		reg_TXE = __HAL_UART_GET_FLAG(&huart2,UART_FLAG_TXE);
		reg_TC = __HAL_UART_GET_FLAG(&huart2,UART_FLAG_TC);
		reg_RXNE = __HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE);
		reg_IDLE = __HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE);
		reg_ORE = __HAL_UART_GET_FLAG(&huart2,UART_FLAG_ORE);
		reg_NE = __HAL_UART_GET_FLAG(&huart2,UART_FLAG_NE);
		reg_FE = __HAL_UART_GET_FLAG(&huart2,UART_FLAG_FE);
		reg_PE = __HAL_UART_GET_FLAG(&huart2,UART_FLAG_PE);

		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);

		if(rx_buffer[0]==0x65 && rx_buffer[1]==0x00 && rx_buffer[2]==0x01 && rx_buffer[3]==0x01 &&
		   rx_buffer[4]==0xFF && rx_buffer[5]==0xFF && rx_buffer[6]==0xFF)
			{
			  count++;
			}

		if(rx_buffer[0]==0x65 && rx_buffer[1]==0x00 && rx_buffer[2]==0x02 && rx_buffer[3]==0x01 &&
		        rx_buffer[4]==0xFF && rx_buffer[5]==0xFF && rx_buffer[6]==0xFF)
			{
			  count++;
			}

		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET);

	}

	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);

}