stm32/dma: Fix re-start of DMA stream by clearing all event flags.
As per the datasheet, all event flags for a stream must be cleared before enabling it. Fixes issue #4944 (with DAC.write_timed).
This commit is contained in:
parent
e9593d5075
commit
b1129df478
|
@ -922,6 +922,30 @@ void dma_nohal_deinit(const dma_descr_t *descr) {
|
|||
}
|
||||
|
||||
void dma_nohal_start(const dma_descr_t *descr, uint32_t src_addr, uint32_t dst_addr, uint16_t len) {
|
||||
// Must clear all event flags for this stream before enabling it
|
||||
DMA_TypeDef *dma_ctrl;
|
||||
uint32_t ch = descr->id;
|
||||
if (ch < NSTREAMS_PER_CONTROLLER) {
|
||||
dma_ctrl = DMA1;
|
||||
} else {
|
||||
dma_ctrl = DMA2;
|
||||
ch -= NSTREAMS_PER_CONTROLLER;
|
||||
}
|
||||
__IO uint32_t *ifcr;
|
||||
if (ch <= 3) {
|
||||
ifcr = &dma_ctrl->LIFCR;
|
||||
} else {
|
||||
ifcr = &dma_ctrl->HIFCR;
|
||||
ch -= 4;
|
||||
}
|
||||
if (ch <= 1) {
|
||||
ch = ch * 6;
|
||||
} else {
|
||||
ch = 4 + ch * 6;
|
||||
}
|
||||
*ifcr = 0x3d << ch;
|
||||
|
||||
// Configure and enable stream
|
||||
DMA_Stream_TypeDef *dma = descr->instance;
|
||||
dma->CR &= ~DMA_SxCR_DBM;
|
||||
dma->NDTR = len;
|
||||
|
|
Loading…
Reference in New Issue