Форум Микро-Чип

Форум Микро-Чип (http://www.microchip.su/index.php)
-   Продукция MICROCHIP (http://www.microchip.su/forumdisplay.php?f=6)
-   -   PIC32MK и PIC32MZ -> UART и DMA = проблемы (http://www.microchip.su/showthread.php?t=18347)

Gera82 07.07.2018 00:35

PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Всем Привет.

Есть две проблемы, которые я не могу решить, нужные идее специалистов.

Есть два камня на плате:
1. PIC32MK1024MCF100, работает как "Slave"
2. PIC32MZ2048EFH144, работает как "Мастер"
оба они связаны двумя UARTами:
1.UART работает без DMA, и с ним проблем нету, он для команд.
2.UART он работает при помощи DMA, он для потока данных, и с ним проблемы:


1. на ПИК32МК виснет вся система, как только включаю DMA который привязан к UART2 TXREG.
Программа может проработать и до 5 минут, но потом отрубается и я не знаю что происходит, прикол в том что как я начинаю отлаживать (с помощью ICD3), то все вроде бы работает без проблем:mad:
Как мне проверить? я специально для проверки состояния, в программе дергаю везде "ножками", и в прерываниях тоже, как только программа виснет, останавливаются так же все ножки (их там 7), и не дергаются больше.


PIC32MK:
Код:

char tx_buff[256];


 ...

// DMA1 UART2 TX - This is the DMA setup for the trasmiter   
    DCH1ECON=0;                    // no start or stop IRQs, no pattern match
 //  DCH1CONbits.CHPRI = 3;
////    DCH1ECONbits.PATEN = 0;        // 0 = Pattern match is disabled
 //  DCH1CONbits.CHPATLEN = 1;      // Two bytes of pattern
////    DCH1DATbits.CHPDAT = '\n';      // Pattern definition to finish transfer
    DCH1ECONbits.CHSIRQ = _UART2_TX_VECTOR;      // IRQ vector for "UART1 Transfer Done"
                                    // ===> U1TXREG empty and new Cell of 8 bytes
                                    // Could be transfered
                                // See table 8-3 p 123 in PIC32MK documentation
    DCH1ECONbits.SIRQEN = 1;    // DMA's interruption enable 
//    DCH1CONbits.CHAEN = 1;
//    DCH1CONbits.CHCHN = 1;
//    DCH1CONbits.CHPIGNEN = 0;    // Enable Pattern Ignore Byte bit, 0 = Disable this feature
   
    DCH1SSA = VirtToPhys(tx_buff);
    DCH1DSA = VirtToPhys(&U2TXREG);
    DCH1SSIZ = 16;              // source size at most x bytes                 
    DCH1DSIZ = 1;              // dst size is 1 byte 
    DCH1CSIZ = 1;              // PIC32MK has 8 bytes Transmitter FIFO                                             
    DCH1INT = 0;                // alle Interupt ausschalten
    // Interrupt setup
    IPC18bits.DMA1IP = 5;
    IPC18bits.DMA1IS = 2;
    IFS2bits.DMA1IF = 0; 
    IEC2bits.DMA1IE = 0;        // Interrupt disable
    DCH1CONbits.CHEN = 1;      // Enable channel
   
    DMACONbits.ON = 1;
...




 // UART2 Für Master-Slave Databus ------------------------------------
    U2MODEbits.USIDL = 0;                /* Continue in Idle mode */
    U2MODEbits.LPBACK = 0;                /* Disable LoopBack */
    U2MODEbits.PDSEL = 0b00;            /* 8-bit data, no parity */
    U2MODEbits.STSEL = 0;                /* One Stop bit */
   
    U2MODEbits.BRGH = 1;                /* 1 = High-Speed mode – 4x baud clock enabled*/

    U2BRG = BRGVAL_DATARBUS;            //10Mbit
   
    IFS1bits.U2TXIF = 0;                /* Clear interrupt flag */
    IPC14bits.U2TXIP = 2;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IEC1bits.U2TXIE = 0;                /* Enable receive interrupts */

    IFS1bits.U2RXIF = 0;                /* Clear interrupt flag */
    IPC14bits.U2RXIP = 2;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IEC1bits.U2RXIE = 0;                /* Enable receive interrupts */

    U2STAbits.UTXEN = 1;                /* 1 = UARTx transmitter is enabled. UxTX pin is controlled by UARTx (if ON = 1*/
    U2STAbits.URXEN = 1;                /* 1 = UARTx receiver is enabled. UxRX pin is controlled by UARTx (if ON = 1) */
    U2STAbits.UTXISEL = 0b10;          /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
   
    U2MODEbits.ON = 1;                  /* Enable UART module 1 */

DMA запускается по таймеру 6, сейчас отключил, как включаю, может проработать до 5 минут, все данные видно осциллографом:
Код:

/********************************************************************************
* 1 ms Timer Interrupt, fuer Aufbereitung der Daten und Transfer der Daten über
* UART2 TX und DMA1
* PBCLK2 = TMR_CLK: 60000000 Mhz / 1000000µs * 1000µs = 60000 (0xEA60)
*********************************************************************************/
void __attribute__((vector(_TIMER_6_VECTOR), interrupt(IPL6AUTO), nomips16))  _T6Interrupt(void)
{
  IFS2bits.T6IF = 0; //Clear Timer6 interrupt flag

  memcpy(&tx_buff, &daten_paket, sizeof(daten_paket));  //Kopiere Struct Daten in buffer_array
 
//  DCH1CONbits.CHEN = 1;      // Enable channel
//  DCH1ECONbits.CFORCE = 1;    // set CFORCE to 1 to start Transmitter
 
  _2_1_OUT_OC_24V ^= 1;      // Pin toggeln
 }

2. Проблема, я не могу принят эти данные которые шлет мне PIC32MK "Slave". PIC32MZ "Master" и я пытаюсь также с помощью DMA принять тот же самый пакет, который шлет мне PIC32MK.


Данные поступают на ножку, это я вижу осциллографом, но дальше не вижу.




Вот настройка PIC32MZ, где не работает вообще прием данный по УАРТ + ДМА:
Код:

volatile char rx_buff[256];

...

// UART2 Für Master-Slave Databus ------------------------------------
    U2MODEbits.USIDL = 0;                /* Continue in Idle mode */
    U2MODEbits.LPBACK = 0;                /* Disable LoopBack */
    U2MODEbits.PDSEL = 0b00;            /* 8-bit data, no parity */
    U2MODEbits.STSEL = 0;                /* One Stop bit */
   
    U2MODEbits.BRGH = 1;                /* 1 = High-Speed mode – 4x baud clock enabled*/

    U2BRG = BRGVAL_DATARBUS;            //10Mbit
   
    IFS4bits.U2TXIF = 0;                /* Clear interrupt flag */
    IPC36bits.U2TXIP = 2;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IEC4bits.U2TXIE = 0;                /* Enable receive interrupts */

    IFS4bits.U2RXIF = 0;                /* Clear interrupt flag */
    IPC36bits.U2RXIP = 2;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IEC4bits.U2RXIE = 0;                /* Enable receive interrupts */

    U2STAbits.UTXEN = 1;                /* 1 = UARTx transmitter is enabled. UxTX pin is controlled by UARTx (if ON = 1*/
    U2STAbits.URXEN = 1;                /* 1 = UARTx receiver is enabled. UxRX pin is controlled by UARTx (if ON = 1) */
    U2STAbits.URXISEL = 0b10;          /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
   
    U2MODEbits.ON = 1;                  /* Enable UART module 1 */



...


// DMA0 UART2 RX - This is the DMA setup for the receiver   
    IEC4bits.DMA0IE = 0;            // Interrupt disable
    IFS4bits.DMA0IF = 0;            // Interrupt flag CLR
    DCH0CONbits.CHPRI = 3;          // Channel priority
    DCH0ECON = 0;
   
    DCH0ECONbits.CHSIRQ = _UART2_RX_VECTOR;        // IRQ vector for "UART2 Receiver Done"
    DCH0ECONbits.SIRQEN = 1;    // DMA's interruption enable
    DCH0CONbits.CHAEN = 1;
    DCH0CONbits.CHCHN = 1;
   
    DCH0SSA = VirtToPhys(&U2RXREG);              // Source address
    DCH0DSA = VirtToPhys(rx_buff);    // Destination
    DCH0SSIZ = 1;                       
    DCH0DSIZ = 16;
    DCH0CSIZ = 1;                                                                   
    DCH0INTbits.CHBCIE = 1;    // Interrupt on block transfer complete
  //  DCH0INTbits.CHERIE = 1;    // Interrupt on errors
    // Interrupt setup
    IPC33bits.DMA0IP = 3;      // Priority
    IPC33bits.DMA0IS = 2;      // Sub priority
    IFS4bits.DMA0IF = 0;        // Interrupt flag CLR
    IEC4bits.DMA0IE = 1;        // Interrupt enable
    DCH0CONbits.CHEN = 1;      // Enable channel
   
    DMACONbits.ON = 1;


...


/********************************************************************************
* DMA0 Interrupt für UART2 RX, Daten von Slave
*********************************************************************************/
void __attribute__((vector(_DMA0_VECTOR), interrupt(IPL3AUTO), nomips16))  _DMA0Interrupt(void) //_DMA0_VECTOR = 72
{

    DCH0INT=0x000000ff;          // clear DMA's channel interrupt flags, CHSDIF, CHSHIF, CHDDIF, CHDHIF, CHBCIF, CHCCIF, CHTAIF, CHERIF
    IFS4bits.DMA0IF = AUS;        // clear interruption flag       
   
    memcpy(&daten_paket, &rx_buff, sizeof(daten_paket)); //Kopiere buffer_array in Struct Daten zurück
   
}

оба УАРТа (UART1 и 2) работают прекрасно без DMA!

Gera82 07.07.2018 17:08

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от Gera82 (Сообщение 237968)
1. на ПИК32МК виснет вся система, как только включаю DMA который привязан к UART2 TXREG.
Программа может проработать и до 5 минут, но потом отрубается и я не знаю что происходит, прикол в том что как я начинаю отлаживать (с помощью ICD3), то все вроде бы работает без проблем:mad:
Как мне проверить? я специально для проверки состояния, в программе дергаю везде "ножками", и в прерываниях тоже, как только программа виснет, останавливаются так же все ножки (их там 7), и не дергаются больше.!

Информация не совсем корректна, при отладке тоже виснет.
Поток данных останавливается, и я нажимаю "Pause" чтоб посмотреть где актуально я нахожусь, но мне это не удаётся, так как проходит ошибка:
MPLAB has gotten out of synch with the ICD3. Please unplug and reconnect the ICD3 to the USB cable and try the operation again.


Кароче система полностью умирает, как только я вклучаю ДМА. Кстати другие каналы ДМА я тоже пробовал такая же херня:mad:

igor_tgru 09.07.2018 09:31

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
А обработчики исключений реализованы ?

Gera82 09.07.2018 12:52

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от igor_tgru (Сообщение 237996)
А обработчики исключений реализованы ?

не совсем понял, что имеем ввиду.


я провел много экспериментов по поводу пик32МК и УАРТ + ДМА,
вывод мой такой, он останавливается после 2000-3000 посылок, если прерывание по таймеру приходит каждые 1мсек, то пик32МК останавливаемся через 2-3 секунды, если каждые 10мсек, то через 20-30 секунд, прерывание каждые 100мсек, то примерно 200-300секунд.


я не знаю что конкретно происходит, но мне кажется останавливается SYSCLK (120МГц), ну а если он, то вся периферия.
, SYSCLK настраивал на 60МГц, тоже самая проблема:
В отладочном режиме: зависает ICD3, чтоб его перезапустить приходится вытаскивать из USB и вставлять заново.
MPLAB has gotten out of synch with the ICD3. Please unplug and reconnect the ICD3 to the USB cable and try the operation again.

в рабочем режиме (не отладочном): останавливается вся периферия, я специально для проверки состояния, в программе дергаю везде "ножками", и в прерываниях тоже, они тоже виснут. но контроллер не перезапускается сам автоматически, только через MCLR.


Я пробовал разные каналы УАРТа и ДМА, разные частоты итд, все равно виснет:mad:


как только я не запускаю ДМА, то мой ПИК32МК работает без проблем!!!




самое интересное сейчас, я перенес эту настойку УАРТ + ДМА на PIC32MZ, и это хрень работает без проблем, уже как 8 часов:eek:
вот рабочая программа на PIC32MZ:
Код:



// UART2 Für Master-Slave Databus ------------------------------------
    U2MODEbits.USIDL = 0;                /* Continue in Idle mode */
    U2MODEbits.LPBACK = 0;                /* Disable LoopBack */
    U2MODEbits.PDSEL = 0b00;            /* 8-bit data, no parity */
    U2MODEbits.STSEL = 0;                /* One Stop bit */
   
    U2MODEbits.BRGH = 1;                /* 1 = High-Speed mode – 4x baud clock enabled*/

    U2BRG = BRGVAL_DATABUS;              //10Mbit
   
    IFS4bits.U2TXIF = 0;                /* Clear interrupt flag */
    IPC36bits.U2TXIP = 2;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IEC4bits.U2TXIE = 0;                /* Enable receive interrupts */

    IFS4bits.U2RXIF = 0;                /* Clear interrupt flag */
    IPC36bits.U2RXIP = 2;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IEC4bits.U2RXIE = 0;                /* Enable receive interrupts */

    U2STAbits.UTXEN = 1;                /* 1 = UARTx transmitter is enabled. UxTX pin is controlled by UARTx (if ON = 1*/
    U2STAbits.URXEN = 1;                /* 1 = UARTx receiver is enabled. UxRX pin is controlled by UARTx (if ON = 1) */
    U2STAbits.URXISEL = 0b10;          /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
    U2STAbits.UTXISEL = 0b10;          /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
   
   
    U2MODEbits.ON = 1;                  /* Enable UART module 1 */



 
// DMA1 UART2 TX - This is the DMA setup for the trasmiter   
    DCH1ECON=0;                    // no start or stop IRQs, no pattern match
    DCH1CONbits.CHPRI = 3;
    DCH1ECONbits.CHSIRQ = _UART2_TX_VECTOR;      // IRQ vector for "UART1 Transfer Done"
                                    // ===> U1TXREG empty and new Cell of 8 bytes
                                    // Could be transfered
                                // See table 8-3 p 123 in PIC32MK documentation
    DCH1ECONbits.SIRQEN = 1;    // DMA's interruption enable 
    DCH1CONbits.CHAEN = 0;
//    DCH1CONbits.CHCHN = 1;
//    DCH1CONbits.CHPIGNEN = 0;    // Enable Pattern Ignore Byte bit, 0 = Disable this feature
   
    DCH1SSA = VirtToPhys(tx_buff);
    DCH1DSA = VirtToPhys(&U2TXREG);
    DCH1SSIZ = 16;              // source size at most x bytes                 
    DCH1DSIZ = 1;              // dst size is 1 byte 
    DCH1CSIZ = 1;              // PIC32MK has 8 bytes Transmitter FIFO                                             
    DCH1INTbits.CHBCIE = 1;    // alle Interupt ausschalten
   
   
    // Interrupt setup
    IPC33bits.DMA1IP = 5;
    IPC33bits.DMA1IS = 2;
    IFS4bits.DMA1IF = 0; 
  // IEC2bits.DMA1IE = 1;        // Interrupt disable
  //  DCH1CONbits.CHEN = 1;      // Enable channel
   
    DMACONbits.ON = 1;
   
    // Timer 7 für DMA Tx transfer, Interrupt alle 1ms   
   
      T7CONbits.TON = 0; // Stop any 16-bit Timer5 operation
      T6CONbits.TON = 0; // Stop any 16/32-bit Timer5 operation
      T6CONbits.T32 = 1; // Enable 32-bit Timer mode
      T6CONbits.TCS = 0; // Select internal instruction cycle clock
      T6CONbits.TGATE = 0; // Disable Gated Timer mode
      T6CONbits.TCKPS = 0b010; // Select 1:1 Prescaler
      TMR7 = 0x00; // Clear 32-bit Timer (msw)
      TMR6 = 0x00; // Clear 32-bit Timer (lsw)
      PR7 = 0x1; // Load 32-bit period value (msw)  Interrupt (0x1F4AA)
      PR6 = 0xF4AA; // Load 32-bit period value (lsw)
      IPC8bits.T7IP = 7; // 111 = Interrupt is priority 7 (highest priority interrupt)
      IFS1bits.T7IF = 0; // Clear Timer7 interrupt flag
      IEC1bits.T7IE = 1; // Enable Timer7 interrupt

      T6CONbits.TON = 1;  // Einschalten


...


void __attribute__((vector(_TIMER_7_VECTOR), interrupt(IPL7AUTO), nomips16))  _T7Interrupt(void)
{
 
  IFS1bits.T7IF = 0; // Clear Timer7 interrupt flag

 
  daten_paket.position++;
 
  _31_OUT_OC_24V ^= 1;      // Pin tooglen

  memcpy(&tx_buff, &daten_paket, sizeof(daten_paket));  //Kopiere Struct Daten in buffer_array
 
  if (DCH1CONbits.CHEN == 0)
  {   
  DCH1CONbits.CHEN = 1;      // Enable channel
  DCH1ECONbits.CFORCE = 1;    // set CFORCE to 1 to start Transmitter
  }
 
}

а вот не рабочая программа на PIC32MК:
Код:



 // UART2 Für Master-Slave Databus ------------------------------------
    U2MODEbits.USIDL = 0;                /* Continue in Idle mode */
    U2MODEbits.LPBACK = 0;                /* Disable LoopBack */
    U2MODEbits.PDSEL = 0b00;            /* 8-bit data, no parity */
    U2MODEbits.STSEL = 0;                /* One Stop bit */
   
    U2MODEbits.BRGH = 1;                /* 1 = High-Speed mode – 4x baud clock enabled*/

    U2BRG = BRGVAL_DATABUS;            //10Mbit
   
    IFS1bits.U2TXIF = 0;                /* Clear interrupt flag */
    IPC14bits.U2TXIP = 3;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC14bits.U2TXIS = 2;                // sub priority, 0 is Low priority
    IEC1bits.U2TXIE = 0;                /* Enable receive interrupts */

    IFS1bits.U2RXIF = 0;                /* Clear interrupt flag */
    IPC14bits.U2RXIP = 3;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC14bits.U2RXIS = 2;                // sub priority, 0 is Low priority
    IEC1bits.U2RXIE = 0;                /* Enable receive interrupts */

    U2STAbits.UTXEN = 1;                /* 1 = UARTx transmitter is enabled. UxTX pin is controlled by UARTx (if ON = 1*/
    U2STAbits.URXEN = 1;                /* 1 = UARTx receiver is enabled. UxRX pin is controlled by UARTx (if ON = 1) */
    U2STAbits.UTXISEL = 0b10;          /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
   
    U2MODEbits.CLKSEL = 0b00;          // 00 = PBCLKx(1), 01 = SYSCLK, 10 = FRC, 11 = REFCLK1
   
    U2MODEbits.ON = 1;                  /* Enable UART module 1 */ 



 // DMA1 UART2 TX - This is the DMA setup for the trasmiter   
    DCH1ECON=0;                    // no start or stop IRQs, no pattern match
    DCH1CONbits.CHPRI = 3;
    DCH1ECONbits.CHSIRQ = _UART2_TX_VECTOR;      // IRQ vector for "UART1 Transfer Done"
                                    // ===> U1TXREG empty and new Cell of 8 bytes
                                    // Could be transfered
                                // See table 8-3 p 123 in PIC32MK documentation
    DCH1ECONbits.SIRQEN = 1;    // DMA's interruption enable 
    DCH1CONbits.CHAEN = 0;
//    DCH1CONbits.CHCHN = 1;
//    DCH1CONbits.CHPIGNEN = 0;    // Enable Pattern Ignore Byte bit, 0 = Disable this feature
   
    DCH1SSA = VirtToPhys(tx_buff);
    DCH1DSA = VirtToPhys(&U2TXREG);
    DCH1SSIZ = 16;              // source size at most x bytes                 
    DCH1DSIZ = 1;              // dst size is 1 byte 
    DCH1CSIZ = 1;              // PIC32MK has 8 bytes Transmitter FIFO                                             
    DCH1INTbits.CHBCIE = 1;    // alle Interupt ausschalten
   
   
    // Interrupt setup
    IPC18bits.DMA1IP = 5;
    IPC18bits.DMA1IS = 2;
    IFS2bits.DMA1IF = 0; 
  // IEC2bits.DMA1IE = 1;        // Interrupt disable
  //  DCH1CONbits.CHEN = 1;      // Enable channel
   
    DMACONbits.ON = 1;
   
   
   
// Timer 6 für DMA Tx transfer, Interrupt alle 1ms   
    T6CONbits.ON = 0;        // Stop any 32-bit Timer7 operation
    T6CONbits.T32 = 1;      // Enable 32-bit Timer mode     
    T6CONbits.TCS = 0;      // Select internal instruction cycle clock
    T6CONbits.TGATE = 0;    // Disable Gated Timer mode
    T6CONbits.TCKPS = 0b000; // Select 1:1 Prescaler
     
    TMR6 = 0x00; // Clear 32-bit Timer (msw)
    PR6 = 60000; // PBCLK2 = TMR_CLK: 60000000 Mhz / 1000000µs * 1000µs = 60000 (0xEA60)
     
    IPC19bits.T6IP = 6; // 7 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC19bits.T6IS = 3; // Sub priority, 0 is Low priority
    IFS2bits.T6IF = 0; //Clear Timer7 interrupt flag
    IEC2bits.T6IE = 1; // Enable Timer7 interrupt

...


void __attribute__((vector(_TIMER_6_VECTOR), interrupt(IPL7AUTO), nomips16))  _T6Interrupt(void)
{
  _2_1_OUT_OC_24V = 1;      // Pin toggeln
 
  IFS2CLR = _IFS2_T6IF_MASK;
 // IFS2bits.T6IF = 0; //Clear Timer7 interrupt flag
 
  daten_paket.position++;

  memcpy(&tx_buff, &daten_paket, sizeof(daten_paket));  //Kopiere Struct Daten in buffer_array
 
  if (DCH1CONbits.CHEN == 0)
  {   
  DCH1CONbits.CHEN = 1;      // Enable channel
  DCH1ECONbits.CFORCE = 1;    // set CFORCE to 1 to start Transmitter
  }
 
  _2_1_OUT_OC_24V = 0;      // Pin toggeln
 }

ключевой вопрос, что это за хюйня такая:mad:

besogon 09.07.2018 13:09

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Gera82
не совсем понял, что имеем ввиду. - exceptions. куча всего в mips решается с помощью исключений.

гуглите mips exceptions.

у Вас наверняка какая-либо ошибка шины. которую, как верно уже писали, без нормальной обработки исключений исправить почти нереально.
на mz производительность выше - она вполне может скрыть Ваши ошибки.

вообще, судя по коду, вырисовывается очень плохая вещь сама по себе.
у Вас с одними данными в памяти ковыряется и dma и Вы без проверок их по таймеру куда-то копируете. но это ни коим образом не связано с зависанием или ресетом - что там у Вас.

+errata к mk почитайте.

Gera82 09.07.2018 13:21

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от besogon (Сообщение 237999)
Gera82

вообще, судя по коду, вырисовывается очень плохая вещь сама по себе.
у Вас с одними данными в памяти ковыряется и dma и Вы без проверок их по таймеру куда-то копируете. но это ни коим образом не связано с зависанием или ресетом - что там у Вас.

+errata к mk почитайте.

Да я копирую по прерыванию сначала struct -> array, а потом сразу шлю их.

я отключал копирование, все равно виснет:
//memcpy(&tx_buff, &daten_paket, sizeof(daten_paket)); //Kopiere Struct Daten in buffer_array


errata к mk я смотрел, нечего про ДМА не стоит:confused:

besogon 09.07.2018 13:33

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Gera82
можете обработчик исключений вставить в проект?
в одной из соседних тем был.

чтобы в случае чего увидеть, где беда.

Gera82 09.07.2018 13:38

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
эт0, я правильно понимаю:
Код:

static enum {
    EXCEP_IRQ = 0,            // interrupt
    EXCEP_AdEL = 4,            // address error exception (load or ifetch)
    EXCEP_AdES,                // address error exception (store)
    EXCEP_IBE,                // bus error (ifetch)
    EXCEP_DBE,                // bus error (load/store)
    EXCEP_Sys,                // syscall
    EXCEP_Bp,                // breakpoint
    EXCEP_RI,                // reserved instruction
    EXCEP_CpU,                // coprocessor unusable
    EXCEP_Overflow,            // arithmetic overflow
    EXCEP_Trap,                // trap (possible divide by zero)
    EXCEP_IS1 = 16,            // implementation specfic 1
    EXCEP_CEU,                // CorExtend Unuseable
    EXCEP_C2E                // coprocessor 2
} _excep_code;
static unsigned int _epc_code;
static unsigned int _excep_addr;
// this function overrides the normal _weak_ generic handler
void _general_exception_handler(void)
{
    asm volatile("mfc0 %0,$13" : "=r" (_excep_code));
    asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));
    _excep_code = (_excep_code & 0x0000007C) >> 2;   
    while (1) {
        // Examine _excep_code to identify the type of exception
        // Examine _excep_addr to find the address that caused the exception
    }
 }


мы туда попадаем, если в системе разные проблемы типа: bus error (load/store)
я правильно понимаю?

besogon 09.07.2018 13:44

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Gera82
по идее должны попадать. вообще на реализацию в xc32 надо смотреть.

igor_tgru 09.07.2018 13:44

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от Gera82 (Сообщение 237998)
не совсем понял, что имеем ввиду.

только то что пишем ;)
спасибо besogon он более "развернуто" ответил, если еще более по "народному" это немаскируемые прерывания возникающие при программно-аппаратных проблемах

besogon 09.07.2018 13:48

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Gera82
сделайте стресс тест и в нем гоняйте, пока у Вас не упадет.
чтобы особо не ждать, можно еще бряк воткнуть в исключении перед циклом.
Код:

#ifdef __DEBUG
__asm__("sdbbp");
#endif


Gera82 09.07.2018 13:48

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от besogon (Сообщение 238003)
Gera82
по идее должны попадать. вообще на реализацию в xc32 надо смотреть.

бреакпоинт я поставил, система зависла и я к сожалению туда не попадаю:(

igor_tgru 09.07.2018 13:50

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от Gera82 (Сообщение 238002)
мы туда попадаем, если в системе разные проблемы типа: bus error (load/store)
я правильно понимаю?

правильно , только "в супе не хватает" индикации что мы попали в исключение

Gera82 09.07.2018 13:51

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от igor_tgru (Сообщение 238004)
только то что пишем ;)
спасибо besogon он более "развернуто" ответил, если еще более по "народному" это немаскируемые прерывания возникающие при программно-аппаратных проблемах

теперь понял:D эти типо вот этого только в 16ти битниках:
Код:

/* Primary Exception Vector handlers:
These routines are used if INTCON2bits.ALTIVT = 0.
All trap service routines in this file simply ensure that device
continuously executes code within the trap service routine. Users
may modify the basic framework provided here to suit to the needs
of their application. */
//================================================================
// OSCFAIL: Oscillator Failure Trap Status bit
void __attribute__((interrupt,no_auto_psv)) _OscillatorFail(void)
{ INTCON1bits.OSCFAIL = 0; //Clear the trap flag
  error_menue_anzeigen(ERROR_TRAP_OSCILLATOR); //Fehlermeldung ausgeben;
}
//================================================================
// ADDRERR: Address Error Trap Status bit
// DS read access when DSRPAG = 0x000 will force an Address Error trap.
void __attribute__((interrupt,no_auto_psv)) _AddressError(void)
{ INTCON1bits.ADDRERR = 0; //Clear the trap flag
  error_menue_anzeigen(ERROR_TRAP_ADDRESS_ERROR); //Fehlermeldung ausgeben;
}
//================================================================
// SGHT: Software Generated Hard Trap Status bit
void __attribute__((interrupt,no_auto_psv)) _HardTrapError(void)
{ INTCON4bits.SGHT = 0; //Clear the trap flag
  error_menue_anzeigen(ERROR_TRAP_HARD); //Fehlermeldung ausgeben;
}
//================================================================
// STKERR: Stack Error Trap Status bit
void __attribute__((interrupt,no_auto_psv)) _StackError(void)
{ INTCON1bits.STKERR = 0; //Clear the trap flag
  error_menue_anzeigen(ERROR_TRAP_STACK); //Fehlermeldung ausgeben;
}
//================================================================
// MATHERR: Math Error Status bit
void __attribute__((interrupt,no_auto_psv)) _MathError(void)
{ INTCON1bits.MATHERR = 0; //Clear the trap flag
  error_menue_anzeigen(ERROR_TRAP_MATH); //Fehlermeldung ausgeben;
}
//================================================================
// DMACERR: DMAC Trap Flag bit
void __attribute__((interrupt,no_auto_psv)) _DMACError(void)
{ INTCON1bits.DMACERR = 0; //Clear the trap flag
  error_menue_anzeigen(ERROR_TRAP_DMA); //Fehlermeldung ausgeben;
}
//================================================================
// SWTRAP: Software Trap Status bit
void __attribute__((interrupt,no_auto_psv)) _SoftTrapError(void)
{ INTCON2bits.SWTRAP = 0; //Clear the trap flag
  error_menue_anzeigen(ERROR_TRAP_SOFT); //Fehlermeldung ausgeben;
}


igor_tgru 09.07.2018 13:54

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от besogon (Сообщение 238005)
чтобы особо не ждать, можно еще бряк воткнуть в исключении перед циклом.

вроде при эксепшене отладчик перестает функционировать (почему то у меня в памяти такое осталось(проверить не могу, проект с пык32 давно в архив сдан))

besogon 09.07.2018 14:01

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
igor_tgru
вроде при эксепшене отладчик перестает функционировать - я отлаживался segger jlink - там работает.

Gera82 09.07.2018 14:04

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
виснет, но не попадаю я туда. или я не правильно что то делаю?

Код:

static enum {
    EXCEP_IRQ = 0,            // interrupt
    EXCEP_AdEL = 4,            // address error exception (load or ifetch)
    EXCEP_AdES = 5,                // address error exception (store)
    EXCEP_IBE = 6,                // bus error (ifetch)
    EXCEP_DBE = 7,                // bus error (load/store)
    EXCEP_IVE_1 = 10,                //
    EXCEP_IVE_2 = 11,                //
//    EXCEP_Sys = ,                // syscall
//    EXCEP_Bp,                // breakpoint
//    EXCEP_RI,                // reserved instruction
//    EXCEP_CpU,                // coprocessor unusable
//    EXCEP_Overflow,            // arithmetic overflow
    EXCEP_Trap = 13,                // trap (possible divide by zero)
    EXCEP_IS1 = 16,            // implementation specfic 1
    EXCEP_WATCH = 23,                //
//    EXCEP_CEU,                // CorExtend Unuseable
//    EXCEP_C2E                // coprocessor 2
} _excep_code;
static unsigned int _epc_code;
static unsigned int _excep_addr;
// this function overrides the normal _weak_ generic handler
void _general_exception_handler(void)
{
    asm volatile("mfc0 %0,$13" : "=r" (_excep_code));
    asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));
    _excep_code = (_excep_code & 0x0000007C) >> 2;   

    while (1) {
        // Examine _excep_code to identify the type of exception
        // Examine _excep_addr to find the address that caused the exception
#ifdef __DEBUG
__asm__("sdbbp");
#endif
       
    }
}


igor_tgru 09.07.2018 14:05

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от besogon (Сообщение 238010)
igor_tgru
вроде при эксепшене отладчик перестает функционировать - я отлаживался segger jlink - там работает.

нее, у меня пыккит3 был. я с ним горя хапнул :D

igor_tgru 09.07.2018 14:07

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от Gera82 (Сообщение 238011)
виснет, но не попадаю я туда. или я не правильно что то делаю?

на плате светодиоды есть ? если да, то годно будет в дедлупе зажечь какую нибудь уникальную комбинацию.

для MX такое пользовал

Код:

/** TRAP-ы для нахождения искл. ситуаций ***************************/
static enum // Exception handler
{
 EXCEP_IRQ = 0,  // interrupt
 EXCEP_AdEL = 4,  // address error exception (load or ifetch)
 EXCEP_AdES,  // address error exception (store)
 EXCEP_IBE,  // bus error (ifetch)
 EXCEP_DBE,  // bus error (load/store)
 EXCEP_Sys,  // syscall
 EXCEP_Bp,  // breakpoint
 EXCEP_RI,  // reserved instruction
 EXCEP_CpU,  // coprocessor unusable
 EXCEP_Overflow,  // arithmetic overflow
 EXCEP_Trap,  // trap (possible divide by zero)
 EXCEP_IS1 = 16,  // implementation specfic 1
 EXCEP_CEU,  // CorExtend Unuseable
 EXCEP_C2E  // coprocessor 2
} _excep_code;
static unsigned int _excep_addr;
// this function overrides the normal _weak_ generic handler
void _general_exception_handler(void)
{
 asm volatile("mfc0 %0,$13" : "=r" (_excep_code));
 asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));
 _excep_code = (_excep_code & 0x0000007C) >> 2;
 while(1)
 {
       
        LED_ERROR_ON;
  // Examine _excep_code to identify the type of exception
  // Examine _excep_addr to find the address that caused the exception
  Nop();
  Nop();
  Nop();
 }
} // End of exception handler


Gera82 09.07.2018 14:14

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от igor_tgru (Сообщение 238013)
на плате светодиоды есть ? если да, то годно будет в дедлупе зажечь какую нибудь уникальную комбинацию.

для MX такое пользовал

Код:

/** TRAP-ы для нахождения искл. ситуаций ***************************/
static enum // Exception handler
{
 EXCEP_IRQ = 0,  // interrupt
 EXCEP_AdEL = 4,  // address error exception (load or ifetch)
 EXCEP_AdES,  // address error exception (store)
 EXCEP_IBE,  // bus error (ifetch)
 EXCEP_DBE,  // bus error (load/store)
 EXCEP_Sys,  // syscall
 EXCEP_Bp,  // breakpoint
 EXCEP_RI,  // reserved instruction
 EXCEP_CpU,  // coprocessor unusable
 EXCEP_Overflow,  // arithmetic overflow
 EXCEP_Trap,  // trap (possible divide by zero)
 EXCEP_IS1 = 16,  // implementation specfic 1
 EXCEP_CEU,  // CorExtend Unuseable
 EXCEP_C2E  // coprocessor 2
} _excep_code;
static unsigned int _excep_addr;
// this function overrides the normal _weak_ generic handler
void _general_exception_handler(void)
{
 asm volatile("mfc0 %0,$13" : "=r" (_excep_code));
 asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));
 _excep_code = (_excep_code & 0x0000007C) >> 2;
 while(1)
 {
   
    LED_ERROR_ON;
  // Examine _excep_code to identify the type of exception
  // Examine _excep_addr to find the address that caused the exception
  Nop();
  Nop();
  Nop();
 }
} // End of exception handler



ладно попробую без отладки, но с отладкой не работает:
Код:

static enum {
    EXCEP_IRQ = 0,            // interrupt
    EXCEP_MOD = 1,            //
    EXCEP_TLBL = 2,            //
    EXCEP_TLBS = 3,            //       
    EXCEP_AdEL = 4,            // address error exception (load or ifetch)
    EXCEP_AdES = 5,                // address error exception (store)
    EXCEP_IBE = 6,                // bus error (ifetch)
    EXCEP_DBE = 7,                // bus error (load/store)   
    EXCEP_Sys = 8,                // syscall
    EXCEP_Bp = 9,                // breakpoint         
    EXCEP_RI = 10,                // reserved instruction
    EXCEP_CpU = 11,                // coprocessor unusable
    EXCEP_Overflow = 12,            // arithmetic overflow
    EXCEP_Trap = 13,                // trap (possible divide by zero)
    EXCEP_IS1 = 16,            // implementation specfic 1
    EXCEP_TLBRI = 19,            //   
    EXCEP_TLBEI = 20,            //     
    EXCEP_WATCH = 23,                //
    EXCEP_MCCHECK = 24,                //       
    EXCEP_DSPDIS = 26,                //         
//    EXCEP_CEU,                // CorExtend Unuseable
//    EXCEP_C2E                // coprocessor 2
} _excep_code;
static unsigned int _epc_code;
static unsigned int _excep_addr;
// this function overrides the normal _weak_ generic handler
void _general_exception_handler(void)
{
    asm volatile("mfc0 %0,$13" : "=r" (_excep_code));
    asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));
    _excep_code = (_excep_code & 0x0000007C) >> 2;   

    while (1) {
        // Examine _excep_code to identify the type of exception
        // Examine _excep_addr to find the address that caused the exception
#ifdef __DEBUG
__asm__("sdbbp");
#endif
       
    }
}


Gera82 09.07.2018 14:22

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
ну не попадаю я туда, что делать? в нормально рабочем режиме тоже не попадаю, ногу включаю а она не включается.
Код:

// this function overrides the normal _weak_ generic handler
void _general_exception_handler(void)
{
    asm volatile("mfc0 %0,$13" : "=r" (_excep_code));
    asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));
    _excep_code = (_excep_code & 0x0000007C) >> 2;   

    while (1) {
        // Examine _excep_code to identify the type of exception
        // Examine _excep_addr to find the address that caused the exception
#ifdef __DEBUG
__asm__("sdbbp");
#endif
        _2_7_OUT_OC_24V = 1;
    }
}


Gera82 09.07.2018 14:29

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Может в настройка контроллера что не так или компилятора?
Код:

// *****************************************************************************
// *****************************************************************************
// Section: Device Configuration
// *****************************************************************************
// *****************************************************************************
/*** DEVCFG0 ***/
#pragma config DEBUG =      OFF
#pragma config JTAGEN =    OFF
#pragma config ICESEL =    ICS_PGx3
#pragma config TRCEN =      OFF
#pragma config BOOTISA =    MIPS32
#pragma config FSLEEP =    OFF
#pragma config DBGPER =    ALLOW_PG2
#pragma config SMCLR =      MCLR_NORM
#pragma config SOSCGAIN =  GAIN_2X
#pragma config SOSCBOOST =  ON
#pragma config POSCGAIN =  GAIN_LEVEL_3
#pragma config POSCBOOST =  ON
#pragma config EJTAGBEN =  NORMAL
#pragma config CP =        OFF

/*** DEVCFG1 ***/
#pragma config FNOSC =      SPLL
#pragma config DMTINTV =    WIN_127_128
#pragma config FSOSCEN =    OFF
#pragma config IESO =      ON
#pragma config POSCMOD =    HS
#pragma config OSCIOFNC =  OFF
#pragma config FCKSM =      CSDCMD
#pragma config WDTPS =      PS1048576
#pragma config WDTSPGM =    STOP
#pragma config FWDTEN =    OFF
#pragma config WINDIS =    NORMAL
#pragma config FWDTWINSZ =  WINSZ_25
#pragma config DMTCNT =    DMT9
#pragma config FDMTEN =    OFF

/*** DEVCFG2 ***/

#pragma config FPLLIDIV =  DIV_2
#pragma config FPLLRNG =    RANGE_5_10_MHZ
#pragma config FPLLICLK =  PLL_POSC
#pragma config FPLLMULT =  MUL_96
#pragma config FPLLODIV =  DIV_4
#pragma config UPLLEN =    OFF 

/*** DEVCFG3 ***/
#pragma config USERID =    0xffff
#pragma config PGL1WAY =    OFF
#pragma config PMDL1WAY =  OFF
#pragma config IOL1WAY =    OFF

/*** BF1SEQ0 ***/
#pragma config TSEQ =      0xffff
#pragma config CSEQ =      0xffff


besogon 09.07.2018 21:18

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Gera82
я так понимаю, что нужно как-то определить точку, в которой висит при условии, что в отладке по каким-то причинам это невозможно.
у Вас, кстати, nmi как-нибудь обрабатывается?

может стоит попробовать расставить какие-нибудь контрольные точки, по прохождению которых можно о чем-то судить?

вообще все это выглядит очень странно.

Gera82 09.07.2018 21:35

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от besogon (Сообщение 238017)
Gera82
я так понимаю, что нужно как-то определить точку, в которой висит при условии, что в отладке по каким-то причинам это невозможно.
у Вас, кстати, nmi как-нибудь обрабатывается?

может стоит попробовать расставить какие-нибудь контрольные точки, по прохождению которых можно о чем-то судить?

вообще все это выглядит очень странно.

да очень странно, у меня мозги кипят:D
nmi нет.


я убрал в программе все лишнее, и оставил только УАРТ, ДМА и ТАЙМЕР6, все остальное отключил нах*й, и только теперь работает.:confused:
Код:

#include <xc.h>
#include "main.h"
#include "delay.h"
#include <stdio.h>
#include <string.h>


// *****************************************************************************
// *****************************************************************************
// Section: Device Configuration
// *****************************************************************************
// *****************************************************************************
/*** DEVCFG0 ***/
#pragma config DEBUG =      OFF
#pragma config JTAGEN =    OFF
#pragma config ICESEL =    ICS_PGx3
#pragma config TRCEN =      OFF
#pragma config BOOTISA =    MIPS32
#pragma config FSLEEP =    OFF
#pragma config DBGPER =    ALLOW_PG2
#pragma config SMCLR =      MCLR_NORM
#pragma config SOSCGAIN =  GAIN_2X
#pragma config SOSCBOOST =  ON
#pragma config POSCGAIN =  GAIN_LEVEL_3
#pragma config POSCBOOST =  ON
#pragma config EJTAGBEN =  NORMAL
#pragma config CP =        OFF

/*** DEVCFG1 ***/
#pragma config FNOSC =      SPLL
#pragma config DMTINTV =    WIN_127_128
#pragma config FSOSCEN =    OFF
#pragma config IESO =      ON
#pragma config POSCMOD =    HS
#pragma config OSCIOFNC =  OFF
#pragma config FCKSM =      CSDCMD
#pragma config WDTPS =      PS1048576
#pragma config WDTSPGM =    STOP
#pragma config FWDTEN =    OFF
#pragma config WINDIS =    NORMAL
#pragma config FWDTWINSZ =  WINSZ_25
#pragma config DMTCNT =    DMT9
#pragma config FDMTEN =    OFF

/*** DEVCFG2 ***/

#pragma config FPLLIDIV =  DIV_2
#pragma config FPLLRNG =    RANGE_5_10_MHZ
#pragma config FPLLICLK =  PLL_POSC
#pragma config FPLLMULT =  MUL_96
#pragma config FPLLODIV =  DIV_4
#pragma config UPLLEN =    OFF 

/*** DEVCFG3 ***/
#pragma config USERID =    0xffff
#pragma config PGL1WAY =    OFF
#pragma config PMDL1WAY =  OFF
#pragma config IOL1WAY =    OFF

/*** BF1SEQ0 ***/
#pragma config TSEQ =      0xffff
#pragma config CSEQ =      0xffff



volatile char tx_buff[256];





static enum {
    EXCEP_IRQ = 0,            // interrupt
    EXCEP_MOD = 1,            //
    EXCEP_TLBL = 2,            //
    EXCEP_TLBS = 3,            //       
    EXCEP_AdEL = 4,            // address error exception (load or ifetch)
    EXCEP_AdES = 5,                // address error exception (store)
    EXCEP_IBE = 6,                // bus error (ifetch)
    EXCEP_DBE = 7,                // bus error (load/store)   
    EXCEP_Sys = 8,                // syscall
    EXCEP_Bp = 9,                // breakpoint         
    EXCEP_RI = 10,                // reserved instruction
    EXCEP_CpU = 11,                // coprocessor unusable
    EXCEP_Overflow = 12,            // arithmetic overflow
    EXCEP_Trap = 13,                // trap (possible divide by zero)
    EXCEP_IS1 = 16,            // implementation specfic 1
    EXCEP_TLBRI = 19,            //   
    EXCEP_TLBEI = 20,            //     
    EXCEP_WATCH = 23,                //
    EXCEP_MCCHECK = 24,                //       
    EXCEP_DSPDIS = 26,                //         
//    EXCEP_CEU,                // CorExtend Unuseable
//    EXCEP_C2E                // coprocessor 2
} _excep_code;
static unsigned int _epc_code;
static unsigned int _excep_addr;


// this function overrides the normal _weak_ generic handler
void _general_exception_handler(void)
{
    asm volatile("mfc0 %0,$13" : "=r" (_excep_code));
    asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));
    _excep_code = (_excep_code & 0x0000007C) >> 2;   

    while (1) {
        // Examine _excep_code to identify the type of exception
        // Examine _excep_addr to find the address that caused the exception
#ifdef __DEBUG
__asm__("sdbbp");
#endif
        _2_7_OUT_OC_24V = 1;
    }
}



/********************************************************************************
 *                                                                              *
 *  Funktion:      int main(void)                                              *
 *                                                                              *
 *------------------------------------------------------------------------------*
 *  Description:
 ********************************************************************************/
int main(void) {
   
    OSCswitching();        // Alle Clocks einstellen
    Init_IO ();            // Pins IN/OUT/CN/ANALOG konfigurieren
    Init_PPS();            // Peripheral Pin Select
    Init_Periphery();      // Periphery einstellen   
   
   
while(1)
    {
   
    delay_ms(100);
    T6CONbits.ON = 1;    // Daten Fluss Einschalten
     

    }   
}



/********************************************************************************
 *                                                                              *
 *  Funktion:      OSCswitching                                                *
 *                                                                              *
 *------------------------------------------------------------------------------*
 *  Description:
 ********************************************************************************/
void OSCswitching(void)

    volatile unsigned int cp0;

    // Unlock Sequence
    asm volatile("di"); // Disable all interrupts
    SYSKEY = 0xAA996655;
    SYSKEY = 0x556699AA; 
   
    //1111111 = PBCLKx is SYSCLK divided by 128
    //1111110 = PBCLKx is SYSCLK divided by 127
    //0000011 = PBCLKx is SYSCLK divided by 4
    //0000010 = PBCLKx is SYSCLK divided by 3
    //0000001 = PBCLKx is SYSCLK divided by 2
    //0000000 = PBCLKx is SYSCLK divided by 1

    // PB1DIV
    // Peripheral Bus 1 cannot be turned off, so there's no need to turn it on
    PB1DIVbits.PBDIV = 1; // Peripheral Bus 1 Clock Divisor Control (PBCLK1 is SYSCLK divided by 2)

    // PB2DIV
    PB2DIVbits.ON = 1; // Peripheral Bus 2 Output Clock Enable (Output clock is enabled)
    PB2DIVbits.PBDIV = 1; // Peripheral Bus 2 Clock Divisor Control (PBCLK2 is SYSCLK divided by 2)

//    // PB3DIV
//    PB3DIVbits.ON = 1; // Peripheral Bus 2 Output Clock Enable (Output clock is enabled)
//    PB3DIVbits.PBDIV = 1; // Peripheral Bus 3 Clock Divisor Control (PBCLK3 is SYSCLK divided by 2)
//
//    // PB4DIV
//    PB4DIVbits.ON = 1; // Peripheral Bus 4 Output Clock Enable (Output clock is enabled)
//    while (!PB4DIVbits.PBDIVRDY); // Wait until it is ready to write to
//    PB4DIVbits.PBDIV = 1; // Peripheral Bus 4 Clock Divisor Control (PBCLK4 is SYSCLK divided by 2)
//
//    // PB5DIV
//    PB5DIVbits.ON = 1; // Peripheral Bus 5 Output Clock Enable (Output clock is enabled)
//    PB5DIVbits.PBDIV = 1; // Peripheral Bus 5 Clock Divisor Control (PBCLK5 is SYSCLK divided by 2)
//   
//    // PB6DIV
//    PB6DIVbits.ON = 1; // Peripheral Bus 6 Output Clock Enable (Output clock is enabled)
//    PB6DIVbits.PBDIV = 4; // Peripheral Bus 6 Clock Divisor Control (PBCLK5 is SYSCLK divided by 4)
//
//    // PB7DIV
//    PB7DIVbits.ON = 1; // Peripheral Bus 7 Output Clock Enable (Output clock is enabled)
//    PB7DIVbits.PBDIV = 0; // Peripheral Bus 7 Clock Divisor Control (PBCLK7 is SYSCLK divided by 2)


    // CHECON - Set up prefetch
    SYS_DEVCON_PerformanceConfig(SYS_CLOCK_MHZ);
 
   
   
    // Set up caching
    cp0 = _mfc0(16, 0);
    cp0 &= ~0x07;
    cp0 |= 0b011; // K0 = Cacheable, non-coherent, write-back, write allocate
    _mtc0(16, 0, cp0); 

    // Lock Sequence
    SYSKEY = 0x33333333;
    asm volatile("ei"); // Enable all interrupts
     
}



/********************************************************************************
 *                                                                              *
 *  Funktion          SYS_DEVCON_PerformanceConfig                            *
 *                                                                              *
 *------------------------------------------------------------------------------*
 *
 *  description:
 *
 *
 ********************************************************************************/
void __attribute__((nomips16)) SYS_DEVCON_PerformanceConfig( unsigned long sysclk )
{
   

    /* Set the PFM wait states based on the system clock and ECC setting */
    if (sysclk <= 60000000UL)
        CHECONbits.PFMWS = 1;  // Wait States = 1
    else if (sysclk <= 80000000UL)
        CHECONbits.PFMWS = 2;  // Wait States = 2
    else
        CHECONbits.PFMWS = 3;  // Wait States = 3

    /* Enable Prefetch Cache Module */
    CHECONbits.PREFEN = 1;        // 01 Enable predictive prefetch for CPU instructions only
}



/********************************************************************************
 *                                                                              *
 *  Funktion          Init_IO                                                  *
 *                                                                              *
 *------------------------------------------------------------------------------*
 *
 *  description:
 *
 *
 ********************************************************************************/
void Init_IO (void)
{
   
        // PORTG Einstellung:
        // RG0(MC_TXD2_SLAVE_MC_RXD2(RXD2)) = in, RG1(MC_RXD2_SLAVE_MC_TXD2(TXD2)) = out,
        // RG6(NC) = out, RG7(NC) = out, RG8(NC) = out, RG9(NC) = out,
        // RG10(2.1.OUT_OC_MC_OUT(DO)) = out, RG11(2.13.OUT_OC_MC_OUT(DO)) = out,
        // RG12(NC) = out, RG13(2.7.OUT_OC_MC_OUT(DO)) = out, RG14(2.8.OUT_OC_MC_OUT(DO)) = out,
        // RG15(2.6.OUT_OC_MC_OUT(DO)) = out,
        LATG  = 0;                // Port alle auf LOW schalten
        TRISG = (1 << 0);        // PINS die auf Input eingestellt werden, 1 = Input
        CNENG = 0;                // CN Interrupt einzelne PINS aktivieren
        ANSELG = 0;              // PINS die Analog eingestellt werden, 1 = Analog

       
}



/********************************************************************************
 *                                                                              *
 *  TASK:          Init_PPS                                                    *
 *                                                                              *
 *------------------------------------------------------------------------------*
 *
 *  description:
 *
 *
 ********************************************************************************/
void Init_PPS (void)
{

        CFGCONbits.IOLOCK = 0;        // PPS Unlock
        CFGCONbits.PMDLOCK = 0;      // 0 = Peripheral module is not locked. Writes to PMD registers are allowed
        CFGCONbits.JTAGEN = 0;        // 0 = Disable the JTAG port

// input remappeble pins
        U2RXRbits.U2RXR = 0b1011;        // RPG0(0b1011) -> U2RX



// output remappeble pins
        RPG1Rbits.RPG1R  = 0b00010;        // RPG1(0b00010) -> U2TX

       
             
        CFGCONbits.IOLOCK = 1;      // PPS Lock
        CFGCONbits.PMDLOCK = 1;    // 1 = Peripheral module is locked. Writes to PMD registers are not allowed


}



/********************************************************************************
 *                                                                              *
 *  TASK:          Init_Periphery                                              *
 *                                                                              *
 *------------------------------------------------------------------------------*
 *  description:
 ********************************************************************************/
void Init_Periphery (void)
{

   
 // UART2 Für Master-Slave Databus ------------------------------------
    U2MODEbits.USIDL = 0;                /* Continue in Idle mode */
    U2MODEbits.LPBACK = 0;                /* Disable LoopBack */
    U2MODEbits.PDSEL = 0b00;            /* 8-bit data, no parity */
    U2MODEbits.STSEL = 0;                /* One Stop bit */
   
    U2MODEbits.BRGH = 1;                /* 1 = High-Speed mode – 4x baud clock enabled*/

    U2BRG = BRGVAL_DATABUS;            //1Mbit
   
    IFS1bits.U2TXIF = 0;                /* Clear interrupt flag */
    IPC14bits.U2TXIP = 3;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC14bits.U2TXIS = 2;                // sub priority, 0 is Low priority
    IEC1bits.U2TXIE = 0;                /* Enable receive interrupts */

    IFS1bits.U2RXIF = 0;                /* Clear interrupt flag */
    IPC14bits.U2RXIP = 3;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC14bits.U2RXIS = 2;                // sub priority, 0 is Low priority
    IEC1bits.U2RXIE = 0;                /* Enable receive interrupts */

    U2STAbits.UTXEN = 1;                /* 1 = UARTx transmitter is enabled. UxTX pin is controlled by UARTx (if ON = 1*/
    U2STAbits.URXEN = 1;                /* 1 = UARTx receiver is enabled. UxRX pin is controlled by UARTx (if ON = 1) */
    U2STAbits.UTXISEL = 0b10;          /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
    U2STAbits.URXISEL = 0b10;          /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
 
    U2MODEbits.CLKSEL = 0b00;          // 00 = PBCLKx(1), 01 = SYSCLK, 10 = FRC, 11 = REFCLK1
   
    U2MODEbits.ON = 1;                  /* Enable UART module 1 */   
   
   

// DMA1 UART2 TX - This is the DMA setup for the trasmiter   
    DCH1ECON=0;                    // no start or stop IRQs, no pattern match
    DCH1CONbits.CHPRI = 3;
    DCH1ECONbits.CHSIRQ = _UART2_TX_VECTOR;      // IRQ vector for "UART1 Transfer Done"
                                    // ===> U1TXREG empty and new Cell of 8 bytes
                                    // Could be transfered
                                // See table 8-3 p 123 in PIC32MK documentation
    DCH1ECONbits.SIRQEN = 1;    // DMA's interruption enable 
    DCH1CONbits.CHAEN = 0;
//    DCH1CONbits.CHCHN = 1;
//    DCH1CONbits.CHPIGNEN = 0;    // Enable Pattern Ignore Byte bit, 0 = Disable this feature
   
    DCH1SSA = VirtToPhys(tx_buff);
    DCH1DSA = VirtToPhys(&U2TXREG);
    DCH1SSIZ = 16;              // source size at most x bytes                 
    DCH1DSIZ = 1;              // dst size is 1 byte 
    DCH1CSIZ = 1;              // PIC32MK has 8 bytes Transmitter FIFO                                             
    DCH1INTbits.CHBCIE = 1;    // alle Interupt ausschalten
   
   
    // Interrupt setup
    IPC18bits.DMA1IP = 5;
    IPC18bits.DMA1IS = 2;
    IFS2bits.DMA1IF = 0; 
  // IEC2bits.DMA1IE = 1;        // Interrupt disable
  //  DCH1CONbits.CHEN = 1;      // Enable channel
   
    DMACONbits.ON = 1;
   
   
   
// Timer 6 für DMA Tx transfer, Interrupt alle 1ms   
    T6CONbits.ON = 0;        // Stop any 32-bit Timer7 operation
    T6CONbits.T32 = 1;      // Enable 32-bit Timer mode     
    T6CONbits.TCS = 0;      // Select internal instruction cycle clock
    T6CONbits.TGATE = 0;    // Disable Gated Timer mode
    T6CONbits.TCKPS = 0b000; // Select 1:1 Prescaler
     
    TMR6 = 0x00; // Clear 32-bit Timer (msw)
    PR6 = 60000; // PBCLK2 = TMR_CLK: 60000000 Mhz / 1000000µs * 1000µs = 60000 (0xEA60)
     
    IPC19bits.T6IP = 6; // 7 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC19bits.T6IS = 3; // Sub priority, 0 is Low priority
    IFS2bits.T6IF = 0; //Clear Timer7 interrupt flag
    IEC2bits.T6IE = 1; // Enable Timer7 interrupt

   
//    T6CONbits.ON = 1;    // Daten Fluss Einschalten
   
         
// ---------------------------------------------------------   

 
  INTCONbits.MVEC = EIN;  //enable mult-vectored interrupts 
 

}



















/********************************************************************************
* 1 ms Timer Interrupt, fuer Aufbereitung der Daten und Transfer der Daten über
* UART2 TX und DMA1
* PBCLK2 = TMR_CLK: 60000000 Mhz / 1000000µs * 1000µs = 60000 (0xEA60)
*********************************************************************************/
void __attribute__((vector(_TIMER_6_VECTOR), interrupt(IPL7AUTO), nomips16))  _T6Interrupt(void)
{
  _2_1_OUT_OC_24V = 1;      // Pin toggeln
 
  IFS2CLR = _IFS2_T6IF_MASK;
 // IFS2bits.T6IF = 0; //Clear Timer7 interrupt flag
 
 
  if (DCH1CONbits.CHEN == 0)
  {   
  DCH1CONbits.CHEN = 1;      // Enable channel
  DCH1ECONbits.CFORCE = 1;    // set CFORCE to 1 to start Transmitter
  }
 
  _2_1_OUT_OC_24V = 0;      // Pin toggeln
}




я заметил, как появляется еше одно прерывании начинает глючить, есть прерывании от UART1 без ДМА:
Код:

/********************************************************************************
* U1RX Interrupt Steuerbus
*********************************************************************************/
void __ISR(_UART1_RX_VECTOR, IPL7AUTO) _U1RXInterrupt(void)
//void __attribute__((vector(_UART1_RX_VECTOR), interrupt(IPL7AUTO), nomips16))  _U1RXInterrupt(void)
{

  IFS1CLR = _IFS1_U1RXIF_MASK;
 // IFS1bits.U1RXIF = AUS;    // clear RX interrupt flag

/* Check for receive errors */
  if(U1STAbits.FERR == EIN)
  {
    } 
/* Must clear the overrun error to keep UART receiving */
  if(U1STAbits.OERR == EIN)
    {
    U1STAbits.OERR = AUS;
    } 
/* Get the data */
    if(U1STAbits.URXDA == EIN)
    {
      ReceivedData_Slave[bytes_slave] = U1RXREG;
      bytes_slave++;
    }
 
  if(ReceivedData_Slave[0] != START_BYTE)
  {
    bytes_slave=0;
  }
 
  if (bytes_slave == 7)
  {
      bytes_slave = 0;
      SYSTEM_FLAG.bits.master_frame_fertig = EIN;
      _2_3_OUT_OC_24V ^= 1;      // Pin tooglen
  }
 
  _2_2_OUT_OC_24V ^= 1;      // Pin tooglen
 
}

как они могут друг другу мешать? на PIC32MZ работает же?!

besogon 09.07.2018 23:06

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Gera82
как они могут друг другу мешать? на PIC32MZ работает же?! - кто-нибудь кроме Вас знает, как у Вас прерывания там работают? pic32mz сильно быстрее и это запросто может скрыть архитектурные изъяны.

в общей модели обработка прерываний происходит следующим образом.

есть основной поток с каким-то приоритетом выполнения. он может быть прерван только прерыванием с приоритетом выполнения выше, чем у потока, который исполняется.

в случае когда происходит прерывание происходит куча вещей.

среди которых в общем случае можно выделить несколько.

сохранение состояния, в котором было ядро, чтобы можно было возвратиться.
(есть моменты, что полное сохранение может и быть отложено, если есть srs, но это дело третье).

переключение на контекст ядра (если нужно)

полезная нагрузка.

восстановление контекста потока.

во время одного прерывания может быть запросто сгенерировано еще прерывание.
это обязательно должно быть учтено в системе.
самые интересные вещи, как правило, в такие моменты и происходят.

что может быть?

может быть неверно сделанный пролог прерываний. что во время вложенных прерываний портится содержимое регистров.
может исчерпываться стек ядра (который используется в прерываниях).
может исчерпываться стек потока.
может быть неверно сделанный эпилог прерываний. что неверно загружается или портится.
куча всего.

часто ведет к порче памяти. содержимое памяти портится.
в итоге Вы можете запросто оказаться в проверке условия, которое будет реально никогда не выполняться или близко.

все это можно более-менее посмотреть с помощью disassembly.

Gera82 09.07.2018 23:27

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от besogon (Сообщение 238019)
Gera82
как они могут друг другу мешать? на PIC32MZ работает же?! - кто-нибудь кроме Вас знает, как у Вас прерывания там работают? pic32mz сильно быстрее и это запросто может скрыть архитектурные изъяны.

в общей модели обработка прерываний происходит следующим образом.

есть основной поток с каким-то приоритетом выполнения. он может быть прерван только прерыванием с приоритетом выполнения выше, чем у потока, который исполняется.

в случае когда происходит прерывание происходит куча вещей.

среди которых в общем случае можно выделить несколько.

сохранение состояния, в котором было ядро, чтобы можно было возвратиться.
(есть моменты, что полное сохранение может и быть отложено, если есть srs, но это дело третье).

переключение на контекст ядра (если нужно)

полезная нагрузка.

восстановление контекста потока.

во время одного прерывания может быть запросто сгенерировано еще прерывание.
это обязательно должно быть учтено в системе.
самые интересные вещи, как правило, в такие моменты и происходят.

что может быть?

может быть неверно сделанный пролог прерываний. что во время вложенных прерываний портится содержимое регистров.
может исчерпываться стек ядра (который используется в прерываниях).
может исчерпываться стек потока.
может быть неверно сделанный эпилог прерываний. что неверно загружается или портится.
куча всего.

часто ведет к порче памяти. содержимое памяти портится.
в итоге Вы можете запросто оказаться в проверке условия, которое будет реально никогда не выполняться или близко.

все это можно более-менее посмотреть с помощью disassembly.

спасибо за информацию!


я так и примерно догадывался, раньше работая с дсПИК33ЕП проблем не было, ставил мне нужные приоритеты и проблем не было.


я смог все таки поймать ошибку, но она не всегда ловиться почему ту.
Но система виснет всегда.
void _general_exception_handler(void)


_excep_code = EXCEP_DBE == (0x00000007)


_excep_addr = 0x9D002248


EXCEP_DBE = 7, // bus error (load/store)



Код:

1033:                /********************************************************************************
1034:                * 1 ms Timer Interrupt, fuer Aufbereitung der Daten und Transfer der Daten über
1035:                * UART2 TX und DMA1
1036:                * PBCLK2 = TMR_CLK: 60000000 Mhz / 1000000µs * 1000µs = 60000 (0xEA60)
1037:                *********************************************************************************/
1038:                void __ISR(_TIMER_6_VECTOR, IPL3SRS) _T6Interrupt(void)
1039:                //void __attribute__((vector(_TIMER_6_VECTOR), interrupt(IPL7AUTO), nomips16))  _T6Interrupt(void)
1040:                {
9D00221C  415DE800  RDPGPR SP, SP
9D002220  401A7000  MFC0 K0, EPC
9D002224  401B6000  MFC0 K1, Status
9D002228  27BDFFF0  ADDIU SP, SP, -16
9D00222C  AFBA000C  SW K0, 12(SP)
9D002230  401A6002  MFC0 K0, SRSCtl
9D002234  AFBB0008  SW K1, 8(SP)
9D002238  AFBA0004  SW K0, 4(SP)
9D00223C  7C1B7844  INS K1, ZERO, 1, 15
9D002240  377B0C00  ORI K1, K1, 3072
9D002244  409B6000  MTC0 K1, Status
9D002248  03A0F021  ADDU FP, SP, ZERO
1041:                  _2_1_OUT_OC_24V = 1;      // Pin toggeln
9D00224C  3C03BF86  LUI V1, -16506
9D002250  94620630  LHU V0, 1584(V1)
9D002254  24040001  ADDIU A0, ZERO, 1
9D002258  7C825284  INS V0, A0, 10, 1
9D00225C  A4620630  SH V0, 1584(V1)
1042:                 
1043:                  IFS2CLR = _IFS2_T6IF_MASK;
9D002260  3C02BF81  LUI V0, -16511
9D002264  24031000  ADDIU V1, ZERO, 4096
9D002268  AC430064  SW V1, 100(V0)
1044:                // IFS2bits.T6IF = 0; //Clear Timer7 interrupt flag
1045:                 
1046:                  daten_paket.position++;
9D00226C  3C028000  LUI V0, -32768
9D002270  2442038C  ADDIU V0, V0, 908
9D002274  8C420004  LW V0, 4(V0)
9D002278  24430001  ADDIU V1, V0, 1
9D00227C  3C028000  LUI V0, -32768
9D002280  2442038C  ADDIU V0, V0, 908
9D002284  AC430004  SW V1, 4(V0)
1047:               
1048:                // memcpy(&tx_buff, &daten_paket, sizeof(daten_paket));  //Kopiere Struct Daten in buffer_array
1049:                 
1050:                  if (DCH1CONbits.CHEN == 0)
9D002288  3C02BF81  LUI V0, -16511
9D00228C  8C421120  LW V0, 4384(V0)
9D002290  30420080  ANDI V0, V0, 128
9D002294  1440000B  BNE V0, ZERO, 0x9D0022C4
9D002298  00000000  NOP
1051:                  {   
1052:                  DCH1CONbits.CHEN = 1;      // Enable channel
9D00229C  3C03BF81  LUI V1, -16511
9D0022A0  8C621120  LW V0, 4384(V1)
9D0022A4  24040001  ADDIU A0, ZERO, 1
9D0022A8  7C8239C4  INS V0, A0, 7, 1
9D0022AC  AC621120  SW V0, 4384(V1)
1053:                  DCH1ECONbits.CFORCE = 1;    // set CFORCE to 1 to start Transmitter
9D0022B0  3C03BF81  LUI V1, -16511
9D0022B4  8C621130  LW V0, 4400(V1)
9D0022B8  24040001  ADDIU A0, ZERO, 1
9D0022BC  7C8239C4  INS V0, A0, 7, 1
9D0022C0  AC621130  SW V0, 4400(V1)
1054:                  }
1055:                 
1056:                  _2_1_OUT_OC_24V = 0;      // Pin toggeln
9D0022C4  3C03BF86  LUI V1, -16506
9D0022C8  94620630  LHU V0, 1584(V1)
9D0022CC  7C025284  INS V0, ZERO, 10, 1
9D0022D0  A4620630  SH V0, 1584(V1)
1057:                }
9D0022D4  03C0E821  ADDU SP, FP, ZERO
9D0022D8  41606000  DI ZERO
9D0022DC  000000C0  EHB
9D0022E0  8FBB0004  LW K1, 4(SP)
9D0022E4  8FBA000C  LW K0, 12(SP)
9D0022E8  409B6002  MTC0 K1, SRSCtl
9D0022EC  8FBB0008  LW K1, 8(SP)
9D0022F0  409A7000  MTC0 K0, EPC
9D0022F4  27BD0010  ADDIU SP, SP, 16
9D0022F8  41DDE800  WRPGPR SP, SP
9D0022FC  409B6000  MTC0 K1, Status
9D002300  42000018  ERET


Gera82 10.07.2018 01:02

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Но система виснет всегда.
void _general_exception_handler(void)


_excep_code = EXCEP_DBE == (0x00000007)


_excep_addr = 0x9D002248


EXCEP_DBE = 7, // bus error (load/store)
эта ошибка не помоей теме с зависанием после 2000-3000 посылок, это я уже от не знания начал методом тыка прореветь разные настройки, и попал суда.
Но теперь я знаю как рабоатает void _general_exception_handler(void) у ПИК32МК/МЗ



Ошибку в ПИК32МК:D я все таки нашел, реально ошибка в железе.
Я тестировал УАРТ1 и УАРТ2 +ДМА0, ДМА1 и ДМА7, всегда зависало железо после 2000-3000 посылок.

Я решил провертит еще раз и настроил только УАРТ5 (их там 6 штук) + ДМА1, и система больше не виснет:D
на данный момент моя прошивка работает полностью со всеми прерывание и настройками.
Код:

    U5MODEbits.USIDL = 0;                /* Continue in Idle mode */
    U5MODEbits.LPBACK = 0;                /* Disable LoopBack */
    U5MODEbits.PDSEL = 0b00;            /* 8-bit data, no parity */
    U5MODEbits.STSEL = 0;                /* One Stop bit */
   
    U5MODEbits.BRGH = 1;                /* 1 = High-Speed mode – 4x baud clock enabled*/

    U5BRG = BRGVAL_DATABUS;            //10Mbit
   
    IFS2bits.U5TXIF = 0;                /* Clear interrupt flag */
    IPC17bits.U5TXIP = 3;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC17bits.U5TXIS = 2;                // sub priority, 0 is Low priority
    IEC2bits.U5TXIE = 0;                /* Enable receive interrupts */

    IFS2bits.U5RXIF = 0;                /* Clear interrupt flag */
    IPC17bits.U5RXIP = 3;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC17bits.U5RXIS = 2;                // sub priority, 0 is Low priority
    IEC2bits.U5RXIE = 0;                /* Enable receive interrupts */

    U5STAbits.UTXEN = 1;                /* 1 = UARTx transmitter is enabled. UxTX pin is controlled by UARTx (if ON = 1*/
    U5STAbits.URXEN = 1;                /* 1 = UARTx receiver is enabled. UxRX pin is controlled by UARTx (if ON = 1) */
    U5STAbits.UTXISEL = 0b10;          /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
    U5STAbits.URXISEL = 0b10;          /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
 
    U5MODEbits.CLKSEL = 0b00;          // 00 = PBCLKx(1), 01 = SYSCLK, 10 = FRC, 11 = REFCLK1
   
    U5MODEbits.ON = 1;                  /* Enable UART module 1 */   
   
   

// DMA1 UART2 TX - This is the DMA setup for the trasmiter   
    DCH1ECON=0;                    // no start or stop IRQs, no pattern match
    DCH1CONbits.CHPRI = 3;
    DCH1ECONbits.CHSIRQ = _UART5_TX_VECTOR;      // IRQ vector for "UART1 Transfer Done"
                                    // ===> U1TXREG empty and new Cell of 8 bytes
                                    // Could be transfered
                                // See table 8-3 p 123 in PIC32MK documentation
    DCH1ECONbits.SIRQEN = 1;    // DMA's interruption enable 
    DCH1CONbits.CHAEN = 0;
//    DCH1CONbits.CHCHN = 1;
//    DCH1CONbits.CHPIGNEN = 0;    // Enable Pattern Ignore Byte bit, 0 = Disable this feature
   
    DCH1SSA = VirtToPhys((void*)&tx_buff);
    DCH1DSA = VirtToPhys((void*)&U5TXREG);
    DCH1SSIZ = 16;              // source size at most x bytes                 
    DCH1DSIZ = 1;              // dst size is 1 byte 
    DCH1CSIZ = 1;              // PIC32MK has 8 bytes Transmitter FIFO                                             
    DCH1INTbits.CHBCIE = 1;    // alle Interupt ausschalten
   
   
    // Interrupt setup
    IPC18bits.DMA1IP = 5;
    IPC18bits.DMA1IS = 2;
    IFS2bits.DMA1IF = 0; 
  // IEC2bits.DMA1IE = 1;        // Interrupt disable
  //  DCH1CONbits.CHEN = 1;      // Enable channel
   
    DMACONbits.ON = 1;


besogon 10.07.2018 08:49

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Gera82
не думаю, что это единственная проблема.

DBE ошибка-то лютая.

у Вас точно отключен prefetch cache? Вы не можете в общем случае использовать pic32mk на 120MHz. Вы можете в общем случае отключить cache и использовать pic32mk на 40 MHz.

Gera82 10.07.2018 12:25

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от besogon (Сообщение 238022)
Gera82
DBE ошибка-то лютая.

я еще раз повторюсь, у меня этой ошибку изначально не было, я просто туда не попадал. я начал экспериментировать с настройками и могу симулировать эту ошибку:


DBE ошибка приходит:
Код:

void __ISR(_TIMER_6_VECTOR, IPL3SRS) _T6Interrupt(void)
//void __attribute__((vector(_TIMER_6_VECTOR), interrupt(IPL5AUTO), nomips16))  _T6Interrupt(void)
{
  _2_1_OUT_OC_24V = 1;      // Pin toggeln
 
  IFS2CLR = _IFS2_T6IF_MASK;
 // IFS2bits.T6IF = 0; //Clear Timer7 interrupt flag
 
  daten_paket.position++;

  memcpy(&tx_buff, &daten_paket, sizeof(daten_paket));  //Kopiere Struct Daten in buffer_array
 
  if (DCH1CONbits.CHEN == 0)
  {   
  DCH1CONbits.CHEN = 1;      // Enable channel
  DCH1ECONbits.CFORCE = 1;    // set CFORCE to 1 to start Transmitter
  }
 
  _2_1_OUT_OC_24V = 0;      // Pin toggeln
 }

DBE ошибки нету:
Код:

//void __ISR(_TIMER_6_VECTOR, IPL3SRS) _T6Interrupt(void)
void __attribute__((vector(_TIMER_6_VECTOR), interrupt(IPL5AUTO), nomips16))  _T6Interrupt(void)
{
  _2_1_OUT_OC_24V = 1;      // Pin toggeln
 
  IFS2CLR = _IFS2_T6IF_MASK;
 // IFS2bits.T6IF = 0; //Clear Timer7 interrupt flag
 
  daten_paket.position++;

  memcpy(&tx_buff, &daten_paket, sizeof(daten_paket));  //Kopiere Struct Daten in buffer_array
 
  if (DCH1CONbits.CHEN == 0)
  {   
  DCH1CONbits.CHEN = 1;      // Enable channel
  DCH1ECONbits.CFORCE = 1;    // set CFORCE to 1 to start Transmitter
  }
 
  _2_1_OUT_OC_24V = 0;      // Pin toggeln
 }

Цитата:

у Вас точно отключен prefetch cache?
настроил все по документации, она маленько отличается от PIC32MZ
Код:



// CHECON - Set up prefetch
    SYS_DEVCON_PerformanceConfig(120000000UL);


// Set up caching
    cp0 = _mfc0(16, 0);
    cp0 &= ~0x07;
    cp0 |= 0b011; // K0 = Cacheable, non-coherent, write-back, write allocate
    _mtc0(16, 0, cp0); 



/********************************************************************************
 *                                                                              *
 *  Funktion          SYS_DEVCON_PerformanceConfig                            *
 *                                                                              *
 *------------------------------------------------------------------------------*
 *
 *  description:
 *
 *
 ********************************************************************************/
void __attribute__((nomips16)) SYS_DEVCON_PerformanceConfig( unsigned long sysclk )
{
   

    /* Set the PFM wait states based on the system clock and ECC setting */
    if (sysclk <= 60000000UL)
        CHECONbits.PFMWS = 1;  // Wait States = 1
    else if (sysclk <= 80000000UL)
        CHECONbits.PFMWS = 2;  // Wait States = 2
    else
        CHECONbits.PFMWS = 3;  // Wait States = 3

    /* Enable Prefetch Cache Module */
    CHECONbits.PREFEN = 1;        // 01 Enable predictive prefetch for CPU instructions only
}


я только что еще раз проверил, включил УАРТ2 + ДМА1, работают только 2000 пакетов и система виснет и не попадает в _general_exception_handler(void)


включаю УАРТ5 + ДМА1 работает как надо, без каких либо проблем

besogon 10.07.2018 13:43

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Gera82
ладно. как знаете.
в errata написано про prefetch cache и что он вызывает ошибки шины.

Gera82 10.07.2018 17:41

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от besogon (Сообщение 238024)
Gera82
ладно. как знаете.
в errata написано про prefetch cache и что он вызывает ошибки шины.


Ну пока работает я дальше парится не буду, я стал на PIC32MZ(Master) и PIC32MK(Slave) эти ошибки отслеживать, вот пример PIC32MK(Slave), который постоянно шлет ошибки Мастеру, тестировал 3 разные ошибки вроде работает:
Код:

volatile unsigned int _epc_code;
volatile unsigned int _excep_addr;
volatile unsigned char error;
volatile unsigned char iCRC_v=0;
// this function overrides the normal _weak_ generic handler
void __attribute__((nomips16)) _general_exception_handler(void)
{
    asm volatile("mfc0 %0,$13" : "=r" (_epc_code));
    asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));
  _epc_code = (_epc_code & 0x0000007C) >> 2;   
   
#ifdef __DEBUG
__asm__("sdbbp");
#endif

    while (1) {
     
       
    switch(_epc_code){
        case 0: error = ERROR_SLAVE_GENERAL_EXCEPTION_INT; slave_send_error(); break; // interrupt
        case 1: error = ERROR_SLAVE_GENERAL_EXCEPTION_MOD; slave_send_error(); break; // TLB modified exception
        case 2: error = ERROR_SLAVE_GENERAL_EXCEPTION_TLBL; slave_send_error(); break; // TLB exception (load or instruction fetch)
        case 3: error = ERROR_SLAVE_GENERAL_EXCEPTION_TLBS; slave_send_error(); break; // TLB exception (store)
        case 4: error = ERROR_SLAVE_GENERAL_EXCEPTION_ADEL; slave_send_error(); break; //address error exception (load or ifetch)
        case 5: error = ERROR_SLAVE_GENERAL_EXCEPTION_ADES; slave_send_error(); break; //address error exception (store)
        case 6: error = ERROR_SLAVE_GENERAL_EXCEPTION_IBE; slave_send_error(); break; //bus error (ifetch
        case 7: error = ERROR_SLAVE_GENERAL_EXCEPTION_DBE; slave_send_error(); break; //bus error (load/store)
        case 8: error = ERROR_SLAVE_GENERAL_EXCEPTION_SYS; slave_send_error(); break; //syscall
        case 9: error = ERROR_SLAVE_GENERAL_EXCEPTION_BP; slave_send_error(); break; //breakpoint
        case 10: error = ERROR_SLAVE_GENERAL_EXCEPTION_RI; slave_send_error(); break; //reserved instruction
        case 11: error = ERROR_SLAVE_GENERAL_EXCEPTION_CPU; slave_send_error(); break; //coprocessor unusable
        case 12: error = ERROR_SLAVE_GENERAL_EXCEPTION_OV; slave_send_error(); break; //arithmetic overflow
        case 13: error = ERROR_SLAVE_GENERAL_EXCEPTION_TR; slave_send_error(); break; //trap (possible divide by zero)
        case 16: error = ERROR_SLAVE_GENERAL_EXCEPTION_IS1; slave_send_error(); break; //implementation specfic 1
        case 19: error = ERROR_SLAVE_GENERAL_EXCEPTION_TLBRI; slave_send_error(); break; //TLB read-inhibit
        case 20: error = ERROR_SLAVE_GENERAL_EXCEPTION_TLBEI; slave_send_error(); break; //TLB execute-inhibit   
        case 23: error = ERROR_SLAVE_GENERAL_EXCEPTION_WATCH; slave_send_error(); break; //Reference to WatchHi/WatchLo address
        case 24: error = ERROR_SLAVE_GENERAL_EXCEPTION_MCHECK; slave_send_error(); break; //Machine Check   
        case 26: error = ERROR_SLAVE_GENERAL_EXCEPTION_DSPDIS; slave_send_error(); break;  //DSP ASE state disabled exception
      // case EXCEP_CEU: ;break;
      // case EXCEP_C2E: break;       
      }
   
     
        // Examine _excep_code to identify the type of exception
        // Examine _excep_addr to find the address that caused the exception

    }
 }


У меня еще вторая проблема, с которой я не разобрался:
Цитата:

2. Проблема, я не могу принят эти данные которые шлет мне PIC32MK "Slave". PIC32MZ "Master" и я пытаюсь также с помощью DMA принять тот же самый пакет, который шлет мне PIC32MK.

Gera82 10.07.2018 21:32

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Короче мне с ДМА как то не везет,


Вторая проблема тоже странная и не решаемая, теперь это связано с PIC32MZ, я не могу принять данные (16 Байт) с помощью УАРТ2 + ДМА0.


УАРТ2 сто процентов рабочий, без ДМА работает отлично. Я вижу все байты, которые шлет мне ПИК32МК.

После настойки ДМА, я получаю один раз прерывания по ДМА, но данных в буфере нет, одни ноли:
volatile unsigned char rx_buff[128];


Какая Периферия у PIC32MZ сломана или не рабочая?


Вот мои настройки, PIC32MZ работает на чистоте 250МГц:
Код:

// UART2 Für Master-Slave Databus ------------------------------------
    U2MODEbits.USIDL = 0;                /* Continue in Idle mode */
    U2MODEbits.LPBACK = 0;                /* Disable LoopBack */
    U2MODEbits.PDSEL = 0b00;            /* 8-bit data, no parity */
    U2MODEbits.STSEL = 0;                /* One Stop bit */
   
    U2MODEbits.BRGH = 1;                /* 1 = High-Speed mode – 4x baud clock enabled*/

    U2BRG = BRGVAL_DATABUS;              //10Mbit
   
    IFS4bits.U2TXIF = 0;                /* Clear interrupt flag */
    IPC36bits.U2TXIP = 3;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC36bits.U2TXIS = 2;                // 2 sub priority, 0 is Low priority
    IEC4bits.U2TXIE = 0;                /* Enable receive interrupts */

    IFS4bits.U2RXIF = 0;                /* Clear interrupt flag */
    IPC36bits.U2RXIP = 7;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC36bits.U2RXIS = 2;                // 2 sub priority, 0 is Low priority
    IEC4bits.U2RXIE = 0;                /* Enable receive interrupts */

  // U2STAbits.UTXEN = 1;                /* 1 = UARTx transmitter is enabled. UxTX pin is controlled by UARTx (if ON = 1*/
    U2STAbits.URXEN = 1;                /* 1 = UARTx receiver is enabled. UxRX pin is controlled by UARTx (if ON = 1) */
  // U2STAbits.UTXISEL = 0b10;          /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
    U2STAbits.URXISEL = 0b00;          /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
   
   
    U2MODEbits.ON = 1;                  /* Enable UART module 1 */



...




// DMA0 UART2 RX - This is the DMA setup for the receiver   
    IEC4bits.DMA0IE = 0;            // Interrupt disable
    IFS4bits.DMA0IF = 0;            // Interrupt flag CLR

    DCH0ECON = 0; 
    DCH0ECONbits.CHSIRQ = _UART2_RX_VECTOR;        // IRQ vector for "UART2 Receiver Done"
    DCH0ECONbits.SIRQEN = 1;    // DMA's interruption enable
   
    DCH0CONbits.CHPRI = 2;  // Channel priority
//    DCH0CONbits.CHCHN = 1;  // chaining enabled
//    DCH0CONbits.CHAED = 1;  //allow event when disabled
//    DCH0CONbits.CHAEN = 1;  // 1 = Channel is continuously enabled, and not automatically disabled after a block transfer is complete
   
    DCH0SSA = VirtToPhys((void*)&U2RXREG);    // Source address
    DCH0DSA = VirtToPhys((void*)&rx_buff);    // Destination
    DCH0SSIZ = 1;                       
    DCH0DSIZ = 16;
    DCH0CSIZ = 1;                                                                   
    DCH0INTbits.CHBCIE = 1;    // Interrupt on block transfer complete
    DCH0INTbits.CHERIE = 1;    // Interrupt on errors
   
    // Interrupt setup
    IPC33bits.DMA0IP = 7;      // Priority
    IPC33bits.DMA0IS = 0;      // Sub priority
    IFS4bits.DMA0IF = 0;        // Interrupt flag CLR
    IEC4bits.DMA0IE = 1;        // Interrupt enable
   
    DCH0INTCLR=0x000000ff;          // clear DMA's channel interrupt flags, CHSDIF, CHSHIF, CHDDIF, CHDHIF, CHBCIF, CHCCIF, CHTAIF, CHERIF
   
    DCH0CONbits.CHEN = 1;      // Enable channel
   
    DMACONbits.ON = 1;
   
    DCRCCON = 0;







...




/********************************************************************************
* DMA0 Interrupt für UART2 RX, Daten von Slave
*********************************************************************************/
void __attribute__((vector(_DMA0_VECTOR), interrupt(IPL7AUTO), nomips16))  _DMA0Interrupt(void) //_DMA0_VECTOR = 72
{

    Nop();
   
    DCH0INTCLR=0x000000ff;          // clear DMA's channel interrupt flags, CHSDIF, CHSHIF, CHDDIF, CHDHIF, CHBCIF, CHCCIF, CHTAIF, CHERIF
    IFS4bits.DMA0IF = AUS;          // clear interruption flag       
   
  // memcpy(&daten_paket, &rx_buff, sizeof(daten_paket)); //Kopiere buffer_array in Struct Daten zurück
   
    Nop();
   
}


Gera82 11.07.2018 20:16

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Ну Не могу поймать пакет данных, буфер rx_buff всегда пуст, вывожу его на дисплей.

В режими отладки срабатывает 1 раз прерывание _DMA0, а вот в нормальном режиме работает без проблем. Прерывании срабатывает всегда, каждые 10мсек, как и положено, ПИК32МК шлет мне каждые 10мсек.

Код:

/********************************************************************************
* DMA0 Interrupt für UART2 RX, Daten von Slave
*********************************************************************************/
void __attribute__((vector(_DMA0_VECTOR), interrupt(IPL7AUTO), nomips16))  _DMA0Interrupt(void) //_DMA0_VECTOR = 72
{

  if(DCH0INTbits.CHBCIF == 1)
    {
        _31_OUT_OC_24V ^= 1;      //Pin togglen
      // memcpy(&daten_paket, &rx_buff, sizeof(daten_paket)); //Kopiere buffer_array in Struct Daten zurück
    }
   
    DCH0INTCLR=0x000000ff;          // clear DMA's channel interrupt flags, CHSDIF, CHSHIF, CHDDIF, CHDHIF, CHBCIF, CHCCIF, CHTAIF, CHERIF
    IFS4bits.DMA0IF = AUS;          // clear interruption flag       
     
}

пытался менять:
U2STAbits.URXISEL = 0b00; /* */
все настройки перепробовал, но нет данных в буфере rx_buff

Если прерывание _DMA0Interrupt(void) работает, значит данные приходят, ну куда они пропадают:confused:


В еррата на pic32mz2048efh144 и ДМА ни чего не нашел.


Нашел только на УАРТ, но он у меня в нормально режиме (без ДМА) работает без проблем:


Module: UARTDuring a RX FIFO overflow condition, the shift
register stops receiving data. This causes the
UART to lose synchronization with the serial data
stream. The only way to recover from this is to turn
the UART OFF and ON until it synchronizes. This
could require several OFF/ON sequences.
Work arounds
Work around 1:
Avoid the RX overrun condition by ensuring that
the UARTx module has a high enough interrupt
priority such that other peripheral interrupt
processing latencies do not exceed the time to
overrun the UART RX buffer based on the
application baud rate. Alternately or in addition to,
set the URXISEL bits in the UxSTA register to
generate an earlier RX interrupt based on RX
FIFO fill status to buy more time for interrupt
latency processing requirements.
Work around 2:
If avoiding RX FIFO overruns is not possible,
implement an ACK/NAK software handshake
protocol to repeat lost packet transfers after
restoring the UART synchronization.


Мистика п*здец какая та с ПИК32МК и ПИК32МЗ + ДМА!:mad:

dosikus 11.07.2018 21:31

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от Gera82 (Сообщение 238030)
Мистика п*здец какая та с ПИК32МК и ПИК32МЗ + ДМА!:mad:

Да уж ,читаешь ваши страшилки и становится как-то спокойно и легко на душе -слава богу что не выбрал пЫк32...
:D:D:D

Может все таки дело в прокладке?

Gera82 11.07.2018 23:02

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от dosikus (Сообщение 238031)
Да уж ,читаешь ваши страшилки и становится как-то спокойно и легко на душе -слава богу что не выбрал пЫк32...
:D:D:D

Может все таки дело в прокладке?


Да я сам в шоке:D


Ну послюненную проблему в тоже решил, мой косяк:D.
Расклад такой, вот эта хрень мне портила все:
Код:

#define VirtToPhys(p) (int)p<0?((int)p&0x1fffffffL):(unsigned int)((unsigned char*)p+0x40000000L)



    DCH0SSA = VirtToPhys((void*)&U2RXREG);    // Source address
    DCH0DSA = VirtToPhys((void*)&rx_buff);    // Destination

в проекте где ПИК32МК она работает, c ПИК32МЗ нет, переделал на:
Код:

#include <sys/kmem.h>


    DCH0SSA = KVA_TO_PA((void*)&U2RXREG);    // Source address
      DCH0DSA = KVA_TO_PA((void*)&rx_buff);    // Destination

и на дисплеи вижу теперь мои данные:D


в оригинальных примерах от Микрочипа тоже VirtToPhys стоит:

Код:

EC1CLR=0x00010000;          // disable DMA channel 0 interruptsIFS1CLR=0x00010000;          // clear any existing DMA channel 0 interrupt flag
DMACONSET=0x00008000;        // enable the DMA controller
DCH0CON=0x3;                  // channel 0 off, priority 3, no chaining
DCH1CON=0x62;                // channel 1 off, priority 2
// chain to higher priority
// (channel 0), enable events detection while disabled
DCH0ECON=(27 <<8)| 0x30;      // start IRQ is UART1 RX, pattern enabled
DCH1ECON=(42 <<8)| 0x30;      // start IRQ is UART1 TX, pattern enabled
DCH0DAT=DCH1DAT=’\r’;        // pattern value, carriage return
// program channel 0 transfer
DCH0SSA=VirtToPhys(&U1RXREG); // transfer source physical address
DCH0DSA=VirtToPhys(myBuff);  // transfer destination physical address
DCH0SSIZ=1;                  // source size is 1 byte
DCH0DSIZ=200;                // dst size at most 200 bytes
DCH0CSIZ=1;                  // one byte per UART transfer request
// program channel 1 transfer
DCH1SSA=VirtToPhys(myBuff);  // transfer source physical address
DCH1DSA=VirtToPhys(&U2TXREG); // transfer destination physical address
DCH1SSIZ=200;                // source size at most 200 bytes
DCH1DSIZ=0;                  // dst size is 1 byte
DCH1CSIZ=1;                  // one byte per UART transfer request
DCH0INTCLR=0x00ff00ff;        // DMA0: clear events, disable interrupts
DCH1INTCLR=0x00ff00ff;        // DMA1: clear events, disable interrupts
DCH1INTSET=0x00090000;        // DMA1: enable Block Complete and error interrupts
IPC9CLR=0x00001f1f;          // clear the DMA channels 0 and 1 priority and
// sub-priority
IPC9SET=0x00000b16;          // set IPL 5, sub-priority 2 for DMA channel 0
// set IPL 2, sub-priority 3 for DMA channel 1
IEC1SET=0x00020000;          // enable DMA channel 1 interrupt
DCH0CONSET=0x80;              // turn channel on


Марк 12.07.2018 05:44

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Странный какой то "баг". А сразу проверить в дебаге откуда и куда было сложно? Вроде бы это первое, что нужно сделать....

besogon 12.07.2018 09:19

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Марк
суть даже не в этом.
вот написано что-то camalcase - понятное дело, что все думают что это функция какая-то.

это макрос.

зачем вообще брать в расчет вещи, в которых макросы пишутся не заглавными? не надо так делать.
нужно понимать, что это говнище и еще где-то искать способы решить проблему.

Gera82 12.07.2018 10:31

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от Марк (Сообщение 238033)
Странный какой то "баг". А сразу проверить в дебаге откуда и куда было сложно? Вроде бы это первое, что нужно сделать....


Код:

суть даже не в этом.
вот написано что-то camalcase  - понятное дело, что все думают что это функция какая-то.

это макрос.

зачем вообще брать в расчет вещи, в которых макросы пишутся не заглавными? не надо так делать.
 нужно понимать, что это говнище и еще где-то искать способы решить проблему.

я даже и не думал об этом, этот Макрос работает на ПИК32МК.


Откуда берет микрочип,
VirtToPhys


я вот что нашел:
Код:

extern __inline__ unsigned int __attribute__((always_inline)) _VirtToPhys(const void* p)
{
 return (int)p<0?((int)p&0x1fffffffL):(unsigned int)((unsigned char*)p+0x40000000L);
}


Марк 12.07.2018 14:25

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от besogon (Сообщение 238034)
зачем вообще брать в расчет вещи, в которых макросы пишутся не заглавными?

Какая разница что брать в расчет, а что не брать?
Это психология рафинированного программиста. Искать баг на верхнем уровне. То есть не там, где потерял, а там, где светло.
А ДМА - это АППАРАТНЫЙ инструмент. Если транзакции не идут, либо идут, но не оттуда и/или не туда, нужно ПРЕЖДЕ ВСЕГО проверить "адрес на конверте". А потом уже искать кто его таким написал.

Gera82 12.07.2018 15:39

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Цитата:

Сообщение от Марк (Сообщение 238036)
Какая разница что брать в расчет, а что не брать?
Это психология рафинированного программиста. Искать баг на верхнем уровне. То есть не там, где потерял, а там, где светло.
А ДМА - это АППАРАТНЫЙ инструмент. Если транзакции не идут, либо идут, но не оттуда и/или не туда, нужно ПРЕЖДЕ ВСЕГО проверить "адрес на конверте". А потом уже искать кто его таким написал.


а вы как думайте, как я к этому пришел? логично после того, как понял что пакеты приходят и ДМА работает четко, по заданной "траектории", но я не видел данных в буфере,


У меня кстати проблемы с отладкой (ICD3), не всегда работает, часто виснет. таких проблем с 16ти битными "Пуками" не было.

besogon 12.07.2018 16:47

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Марк
если у мне нужно dma, то я использую драйвер для dmа.
если его нет - пишу и отлаживаю.

потом он уже работает с чем надо.

и конечно прохладная идея мешать в кучу UART, DMA и.т.д.

если модуль написан плохо то смысл его использовать? тратить силы чтобы с его отладкой?

Марк 12.07.2018 18:29

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Невозможно написать модуль с учетом тех МК с которыми дела не имел.
Поэтому гладко бывает только на бумаге.
Или если структура программы обладает высокой избыточностью в расчете на производительность чипа.
Для проектов, где цена МК и его обвеса не слишком важна, наверное это путь, но мне он чужд. Если уж садиться на дорогую платформу, то следует выжать ее досуха, чтобы "не мучил позор за бесцельно прожитые годы" (с)...
:D:D:D

besogon 12.07.2018 19:34

Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы
 
Марк
во всех pic32m модуль dma примерно одинаковый.
высокой избыточностью - а как Вы собрались это определять? мы же не числодробилки пишем.

есть какое-то ТЗ и его как-то в разумные сроки в разумную цену нужно реализовать.

если стоит mz то скорее всего требовалось TLB и без TLB сложно реализуется тот или иной замысел.

и если Вам понадобится TLB Вы точно также будете искать решение с TLB.


Часовой пояс GMT +3, время: 08:42.

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot