Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: flowchartx - 26 Eylül 2022, 19:38:34

Başlık: USART KESME SORUNU
Gönderen: flowchartx - 26 Eylül 2022, 19:38:34
Herkese iyi akşamlar. STM32de USART ile bir circular buffer yapısı oluşturup haberleşmek istiyorum. Normal callback fonskiyonuyla yapmak istediğimi yapabiliyorum fakat circular buffer yapısında bir veri geldiği zaman işlemci verinin sadece bir byteni alıyor ve kesmenin içinden çıkmıyor. Bütün her şeyi denedim kesmenin içinde kesme bayrağını indirdim. Fakat RX buffer dolu olduğu için kesmenin içinde kalıyor aynı zamanda data registerınıda okumuyor. Çok kafam karıştır yardımınızı bekliyorum. İşlemcim stm32f7 UART8 birimini kullanıyorum.

https://github.com/controllerstech/stm32-uart-ring-buffer/blob/master/Src/UartRingbuffer.c

kütüphaneyi esinlendiğim yer burası mantık olarak aynısı sadece işime yarayanları aldım.
Başlık: Ynt: USART KESME SORUNU
Gönderen: mcaltindal - 27 Eylül 2022, 19:41:14
Aynı sorunu bende yaşamıştım ben hal kütüphanesi ile çalışıyorum. Sorunu aslında read komutu gönderirken istemiş olduğumuz uzunluk eğer 1 den yukarı olursa kesmeden çıkmıyor. ben recevice isterken 1 olarak veriyorum size sorun kalmadı.
Başlık: Ynt: USART KESME SORUNU
Gönderen: flowchartx - 28 Eylül 2022, 13:42:25
Hocam işte sorun burda başlıyor. HAL kütüphanelerinde verileri istiyosunuz ve gelcek veriyi uzunluğuyla beraber belirtiyorsunuz. Benim yapmaya çalıştığım bir mesaj düştüğünde direkt USART2->IRQHandlere gidip ordan verileri tek tek okumasını istiyorum.
Başlık: Ynt: USART KESME SORUNU
Gönderen: Kırambor - 28 Eylül 2022, 16:51:23
Bu tarz durumlarda lütfen kodu da paylaşın ki buradaki arkadaşlar kodunuza bakarak nerede hata olabileceğini söylesin.
Başlık: Ynt: USART KESME SORUNU
Gönderen: flowchartx - 28 Eylül 2022, 17:03:01
Hocam yukarıda paylaştım kesme fonksiyonum aynısı
Başlık: Ynt: USART KESME SORUNU
Gönderen: mcaltindal - 28 Eylül 2022, 17:24:00
Ben konu ile alakalı aşağıdaki gibi bir mantık ile sorunu çözdüm inşallah işine yarar. Flag kullanarak. Ben register mantığına daha nail olamadım hal'den yavaş yavaş öğrenerek register yazarak yazmaçlara geçeceğim. kod mantığım aşağıda işine yararsa
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart == &huart2) {
comBufferFlag = _comBufferFlag;
    switch (comBufferFlag) {
    case deviceStartFlag:
        if (RxBuffer[0] == 0xCA) {
            ComBuffer[ComBufferSize] = RxBuffer[0];
            ComBufferSize++;
            _comBufferFlag = deviceAddresFlag;
        }
        break;
    case deviceAddresFlag:
        if (RxBuffer[0] == DeviceAddress || RxBuffer[0] == 0x00) {
            ComBuffer[ComBufferSize] = RxBuffer[0];
            ComBufferSize++;
            _comBufferFlag = deviceTransactionFlag;
        } else {
            BufferClean(ComBuffer, 0);
            ComBufferSize = 0;
            _comBufferFlag = deviceStartFlag;
        }
        break;
    case deviceTransactionFlag:
        ComBuffer[ComBufferSize] = RxBuffer[0];
        comTransaction = RxBuffer[0];
        ComBufferSize++;
        switch (comTransaction) {
        case device_Command:
            _comBufferFlag = deviceCommandFlag;
            break;
        case device_UDataReq:
            _comBufferFlag = deviceCommandFlag;
            break;
        case device_Polling:
            _comBufferFlag = deviceStopFlag;
            break;
        case device_ACK:
            _comBufferFlag = deviceStopFlag;
            break;
        case device_EOT:
            _comBufferFlag = deviceStopFlag;
            break;
        }
        break;
    case deviceCommandFlag:
        ComBuffer[ComBufferSize] = RxBuffer[0];
        comCommandType = RxBuffer[0];
        ComBufferSize++;
        if (comTransaction == device_Command)
            _comBufferFlag = deviceStopFlag;
        else
            _comBufferFlag = deviceDataLength;
        break;
    case deviceDataLength:
        ComBuffer[ComBufferSize] = RxBuffer[0];
        comDataSize = RxBuffer[0];
        ComBufferSize++;
        _comBufferFlag = deviceData;
        break;
    case deviceData:
        ComBuffer[ComBufferSize] = RxBuffer[0];
        ComBufferSize++;
        comDataSize--;
        if (comDataSize == 0)
            _comBufferFlag = deviceStopFlag;
        break;
    case deviceStopFlag:
        ComBuffer[ComBufferSize] = RxBuffer[0];
        comDataSize = RxBuffer[0];
        ComBufferSize++;
        isCommunicationBuff = 1;
        ComBufferSize = 0;
        Communication_Main_Worker();
        _comBufferFlag = deviceStartFlag;
        break;
    }
        HAL_UART_Receive_IT(&huart2, RxBuffer, 1);
    }
}

Başlık: Ynt: USART KESME SORUNU
Gönderen: flowchartx - 28 Eylül 2022, 21:11:00
@mcaltindal hocam burda recieve_it fonskiyonunu whileden önce mi çağırıyorsunuz yoksa whileın içinde mi
Başlık: Ynt: USART KESME SORUNU
Gönderen: mcaltindal - 28 Eylül 2022, 21:20:02
while'den önce çağırıyorum. ondan sonra her HAL_UART_RxCpltCallback fonksiyonuna girdiğinde sonuna tekrar tetik yapıyorum ki sürekli okuma modunda kalıyor.
Başlık: Ynt: USART KESME SORUNU
Gönderen: flowchartx - 29 Eylül 2022, 15:54:00
Anladım hocam teşekkür ederim. Ama yapmak istediğim bu değildi konu hala güncel