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);
}
}
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....
Kesmeden çıkmadığına dair işaretiniz nedir? Nasıl emin olabiliyorsunuz kesmeden çıkmadığına? Debug ile mi bakıyorsunuz?
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
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);
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.
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);
}
(https://i.hizliresim.com/0Cc90n.jpg)