2011-10-17 14 views
1

以下のIRQハンドラは、32バイトのデータのUSART3を排出します。最初のIRQ TCイベントは最初の6バイトを読み取り、次にDMAエンジンを再プログラムして最後の24バイトを読み込みます。 2番目のTCは、ヘッダを再度読み取るようにそれを書き変えます。このメソッドは、DMAを使用する可変長メッセージを許可します。しかし、私はDMAの開始アドレスを変更することはできないようです。私は別々のバッファに各メッセージを格納できるようにしたいと思いますが、各メッセージを受信すると最初のバッファを上書きします。私は間違って何をしていますか?マイクロコントローラはSTM32F103ze(Cortex-M3)です。STM32F103マイクロコントローラ(Cortex-M3)を使用したDMA開始アドレスの再プログラミング

void DMA1_Channel3_IRQHandler(void) 
{ 
    uint32_t tmpreg = 0; 
    /* Test on DMA1 Channel3 Transfer Complete interrupt */ 
    if(DMA_GetITStatus(DMA1_IT_TC3)) 
    { 
      if (rx3_dma_state == RECIEVE_HEADER) 
      { 
       DMA_Cmd(DMA1_Channel3, DISABLE);/* Disable DMA1_Channel2 transfer*/ 
       // Now that have received the header. Configure the DMA engine to receive 
       // the data portion of the message 
       DMA_SetCurrDataCounter(DMA1_Channel3,26); 
       DMA_Cmd(DMA1_Channel3, ENABLE); 
      } else if (rx3_dma_state == RECIEVE_MSG) 
      { 
       //CurrDataCounterEnd3 = DMA_GetCurrDataCounter(DMA1_Channel3); 
       DMA_Cmd(DMA1_Channel3, DISABLE); 
       /* Get Current Data Counter value after complete transfer */ 
       USART3_Rx_DMA_Channel_Struct->CMAR = (uint32_t) RxBuffer3LookUp[rx_buffer_index]; 
       DMA_SetCurrDataCounter(DMA1_Channel3, 6); 
       DMA_Cmd(DMA1_Channel3,ENABLE); 
       // Set up DMA to write into the next buffer slot (1 of 8) 
       ++rx_buffer_index; 
       rx_buffer_index %= 8; 
      } 
      /* Clear DMA1 Channel6 Half Transfer, Transfer Complete and Global interrupt pending bits */ 
      DMA_ClearITPendingBit(DMA1_IT_GL3); 
    }  
    // Update the state to read fake header of 6 bytes 
    // or to read the fake data section of the message 26 bytes 
    ++rx3_dma_state; 
    rx3_dma_state %= 2; 
    isr_sem_send(dma_usart3_rx_sem); 
} 

答えて

0

あなたが言う:

...最後の24バイトで読み取るためにDMAエンジンを再プログラム。

が、あなたのコードが書かれています:

DMA_SetCurrDataCounter(DMA1_Channel3,26)。

は、右か?それは24か26か?

+0

「最後の26バイトを読み込むようにDMAエンジンを再プログラムする」と言うべきです。それは何をしますか?しかし、DMA転送は、バッファの6バイトではなくバッファの先頭で始まります。また、 "rx3_dma_state == RECIEVE_MSG"というif文の下では、バッファ配列の次のスロットで次のDMA xferを開始するためにCMARレジスタを再プログラムしますが、転送されたデータが常に表示されるRxBuffer3 [0]で起動します。バッファは "char RxBuffer [8] [128]"として定義されます。私は、DMAの開始アドレスだけのDMA転送サイズを再設定するのに問題はありません。 – iwishujoy

関連する問題