2017-10-15 17 views
0

DMAを使用して同じグローバルアレイに2つの異なる文字列を送信しようとしましたが、UART経由で送信されて私の端末ログとして機能します。しかし、何が起こるかは、最初の文字列を送信し、何を試みても(DMAとUART全体をもう一度初期化して、最初の文字列を送信するだけです) 書き込みするたびに任意の文字列を1回送信します。グローバル配列stm32f407xxをターミナルログとして使用するDMA USART Tx

char result2[100]; 
char result[100]; 

void UART2INIT(void) 
{ 


    RCC->APB1ENR|=RCC_APB1ENR_USART2EN; 
    RCC->AHB1ENR|=RCC_AHB1ENR_GPIOAEN; 
    GPIOA->MODER|=((2U<<4)|(2U<<6)); 
    GPIOA->AFR[0]=0x7777; 
    USART2->CR1|=(1U << 13) | (1U<<5); 
    // USART2->CR1|=USART_CR1_M; //IF YOU NEED TO TURN IT ON TO SELECT ANOTHER WORD LENGTH 
    USART2->CR2 &=~ (1U << 13); 
// CR2 IS MAINLY USED IN CASE IF YOU WANTED TO USE UART AS UNIVERSAL SYNCHRONOUS, THUS IT IS NOT WEIRD YOU CAN FIND POLARITY AND PHASE SETTINGS BY  WHICH YOU CAN SET IT UP 
/* 
    The baud rate is computed using the following formula: 
    - IntegerDivider = ((PCLKx)/(8 * (OVR8+1) * (USART_InitStruct->USART_BaudRate))) 
- FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 8 * (OVR8+1)) + 0.5 
    Where OVR8 is the "oversampling by 8 mode" configuration bit in the CR1 register. */ 



    USART2->BRR=((42*1000000)/19200)+0.5; 
    USART2->CR1|=USART_CR1_TCIE|USART_CR1_RXNEIE; //enabling exceptions mask 
    USART2->CR3|=USART_CR3_DMAT; 
    USART2->CR3|=USART_CR3_DMAR; 
    USART2->CR1|=(1U<<2)|(1U<<3); 

    while(!(USART2->SR) & (USART_SR_TC)); 
} 






void DMA_UART_INIT(void) 
{ 

    RCC->AHB1ENR|=RCC_AHB1ENR_DMA1EN; 
    DMA1_Stream6->CR=0; 
    while(DMA1_Stream6->CR); 
    DMA1->LISR=0; 
    DMA1->HISR=0; 
    DMA1_Stream6->M0AR= (uint32_t) &result; 
    DMA1_Stream6->PAR=0x40004404; 
    DMA1_Stream6->NDTR=100; //x items 
    DMA1_Stream6->CR&=~((1U<<5)|(1U<<9)|(1U<<11)|(1U<<13)|(1U<<15)|(1u<<21)); 
    DMA1_Stream6->CR|=(1u<<4)| (1u<<6)|(1u<<10)|(2u<<16)|(4u<<25)|(1U<<1); 

    USART2->SR&=~(1U<<6); 
    DMA1_Stream6->CR&=~(1u<<0); 


} 

while (1) 
{ 
strcpy(result,"testing DMA"); 
DMA1_Stream6->CR|=(1u<<0); 
Delay(0XFFFFFf); 
DMA1_Stream6->CR &= ~(1u<<0); 
DMA1->HIFCR &=~ (DMA_HIFCR_CHTIF6 | DMA_HIFCR_CTCIF6 | DMA_HIFCR_CFEIF6); 
while(!(USART2->SR) & (USART_SR_TC)); 
strcpy(result2,"TESTING DMA"); 
DMA_UART_RESET(); 
UART2INIT(); 

DMA_UART_INIT(); 
DMA1_Stream6->M0AR= (uint32_t) &result2; 

DMA1_Stream6->NDTR=100; 
DMA1_Stream6->CR|=(1u<<0); 


Delay(0XFFFFFf); 
} 

に注意してください:私はすでに、しかし、私は、問題がどこにあるかに取り組むために(1)しばらく使用しようとしていた機能でこれらを書いて、まだ私はそれを見つけることができませんでした コード。

答えて

0

問題がどこでデバッグされていないのかわかりにくいですが、:

  1. while(!(USART2->SR) & (USART_SR_TC))は間違っています。最初に論理的にSRを反転し、ビット単位のANDだけを適用します。
  2. DMAでペリフェラルを使用する場合、ペリフェラルのステータスレジスタをチェックしないで、DMA完了ステータスをチェックしてください。 DMAが動作している間は、ペリフェラルの状態は任意に変化する可能性があります。 DMAが完了すると、必要に応じて周辺機器のエラーなどをチェックすることができます。
  3. UARTでの送信と受信の両方でDMAを有効にしますが、コードは送信用にDMAチャネルを初期化するだけです。最初にDMARを設定せずにデバッグを試みてください。
  4. (1U<<5)|(1U<<9)|(1U<<11)|(1U<<13)|(1U<<15)|(1u<<21)の意味は本当に分かりません。
関連する問題