STM32 DMA interrupt

Stano stano.hw na gmail.com
Pondělí Prosinec 24 21:15:34 CET 2012


Zdravim konferenci
Uz dlhsie sa trapim s DMA na STM32F103RC. DMA je nakonfigurovana aby 
prenasala prijate znaky z USART1 do buffra.
Program sa sprava podla ocakavania (ked prijme pozadovany pocet znakov 
nastavy novu adresu buffra a novy pocet prijimanych znakov a prijem sa 
opakuje). Problem nastava ked program zahaltujem debuggerom a znova 
spustim. Prijem sa uz nerozbehne. Data do USARTu prudia dalej, usart 
ziavne data prijima vsetko v debugeri vidim, aj transfer complete flag 
na DMA je nahodeny ale ziaden dalsi interrupt uz nenastane.
Zbytok programu funguje stale korektne, tak hlavna sluca aj ostatne 
interrupty.
Z mojho subiektivneho hladiska, problem sa sprava ako keby interrupt DMA 
bol "edge" sensitive. Teda ked nastane a nieje mu koli debuggeru alebo 
inemu INT (aj to som skusal) dobolene hned vyvolat rutinu prerusenia tak 
nasledne prerusenie nenastane aj ked flag je nastaveny.
Toto je moja domnienka vytvorena podla chovania programu.

Dakujem za akykolvek napad ci inspiraciu, sam uz neviem co s tym dalej.


Prikladam ziednoduseny vektor problemoveho prerusenia.

void USARTx_Rx_DMA_IRQHandler(void){
    uint32_t len, adr;

    DMA1->IFCR = USARTx_Rx_DMA_FLAG;                                // 
Clear interrupt pending bit
    USARTx_Rx_DMA_Channel->CCR &= (uint16_t)(~DMA_CCR1_EN);            
// Disable DMA

   // nastavenie novych hodnot adr a len, len nemoze nikdy nadobudnut 
hodnotu 0

    USARTx_Rx_DMA_Channel->CNDTR = len;                                
// Sets the number of data bytes to receive
    USARTx_Rx_DMA_Channel->CMAR = adr;                                // 
Set received buffer adress
    USARTx_Rx_DMA_Channel->CCR |= DMA_CCR1_EN;                        // 
Enable DMA
}


Další informace o konferenci Hw-list