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