2017-02-16 6 views
0

誰かが私の無能さを軽視してくれることを願っています。 DMA割り込みを使用してDMA転送用のUSARTをセットアップしました。STM32F1 USART DMA TXは2回目の転送を完了しません

- :

コマンドは

void SCICommsStringIntoTxQ(int8_t * str_out_string) 
{ 
    memset(TxBuffer, '\0', sizeof(TxBuffer)); 
    strcpy(TxBuffer, str_out_string); 
    USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE); 
    DMA_Cmd (DMA1_Channel7, ENABLE); 
} 

マイDMA初期化されている

SCICommsStringIntoTxQ("\n\rTEST_CODE V0.01: \r\n"); 

:私のようなコマンドを使用して、TXバッファにデータを送信しようとしています

void DMA1_Channel7_IRQHandler(void) 
{ 
    // USART2 TX handler 
    /* Test on DMA Stream Transfer Complete interrupt */ 
    if (DMA_GetITStatus(DMA1_IT_TC7)) 
    { 
     /* Clear DMA Stream Transfer Complete interrupt pending bit */ 
     DMA_ClearITPendingBit(DMA1_IT_GL7 | DMA1_IT_TC7); 
    } 
    DMA_Cmd(DMA1_Channel7, DISABLE); 
} 

/* Configures the DMA1 Channel7 for UART2_CHAN Transmission. */ 
    DMA_DeInit(DMA_Channel_USART2_TX); 
    DMA7_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(USART2->DR); 
    DMA7_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; 
    DMA7_InitStructure.DMA_BufferSize = (uint16_t)sizeof(TxBuffer) -1; 
    DMA7_InitStructure.DMA_MemoryBaseAddr = (uint32_t)TxBuffer; 
    DMA7_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 
    DMA7_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; 
    DMA7_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 
    DMA7_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; 
    DMA7_InitStructure.DMA_Mode = DMA_Mode_Normal; 
    DMA7_InitStructure.DMA_Priority = DMA_Priority_High; 
    DMA7_InitStructure.DMA_M2M = DMA_M2M_Disable; 
    DMA_Init(DMA_Channel_USART2_TX, &DMA7_InitStructure); 

    USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE); // Enable USART2 DMA TX 
    DMA_ITConfig(DMA_Channel_USART2_TX, DMA_IT_TC, ENABLE); 

最初の送信は問題なく動作しますが、すぐ次の文字列を送信しようとするとすぐに、最初の文字列が破損します。誰かが私が間違ったことをアドバイスできますか?

答えて

0

USARTが2番目の文字列を送信する前に最初のメッセージの送信を終了するのを待っているかどうかはわかりません。

もしそうでなければ、TxBufferが両方の文字列の同じメモリ位置を指している場合、memsetを呼び出す2度目は、DMAがUSARTに提供しているメモリ部分を変更していますが、文字列。

EDIT:あなたの質問に答える 、ウィキペディアレポート:DMAで

を、CPUが最初の転送を開始転送が進行中であり、それが最終的にからの割り込みを受信して​​いる間、それは他の操作を行います操作が完了したらDMAコントローラ。

これは、USARTバスを介して送信を開始すると、DMAコントローラがRAMからデータを取得し、CPUが他の操作を実行できる間にUSARTコントローラにこのデータを送信することを意味します。これは、CPUが、USARTコントローラを処理している間に、DMAコントローラがアクセスしているRAM部分を潜在的に変更する可能性があることを意味します。

具体的な実装とハードウェア構成はわかりませんが、USARTまたはDMAコントローラが2回目の転送を開始する前に送信を終了するかどうかを確認する必要があります。これを行う方法は、現在の設定によって異なります。 XEが動作しているかどうか、またはDMAが送信を終了したときに発生する割り込みに依存する可能性があります。例えば

多分あなたは、このブロック内の内部フラグable_to_transmit設定することができます。

/* Test on DMA Stream Transfer Complete interrupt */ 
if (DMA_GetITStatus(DMA1_IT_TC7)) { 
    able_to_transmit = 1; 
} 

を、送信する前にこのような何かを:

while(!able_to_transmit) 
    ; //wait or do something else 
SCICommsStringIntoTxQ("\n\rTEST_CODE V0.01: \r\n"); 
able_to_transmit = 0; 

私はこのことができます願っています。

0

お返事ありがとうございます。私はUSARTが終了するのをチェックしたり、待ったりしていません。私はDMAがそれを世話したと仮定しました。次の文字列をDMAに送る前に、UART XE(送信データエンプティフラグ)を調べるべきですか?

関連する問題