2017-10-15 106 views
0

我试图在同一个全局数组上发送2个不同的字符串,通过UART发送DMA作为终端日志。然而,发生的是它发送了第一个字符串,无论我尝试了什么(重新初始化整个DMA和UART,它只发送第一个字符串。 我希望它在每次写入时传输一次任何字符串全球阵列DMA USART使用stm32f407xx作为终端日志的发送端

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)的含义。