Skip to content

Commit d0e8030

Browse files
committed
clear any pending interrupt flag
While debugging, I found that on RP2040 the first looped background write on a StateMachine would be garbled: It the first few outputs would be as expected, but then the data would go back to the start of the buffer. I realized that this could be due to there already being a pending interrupt on this DMA channel that had occurred previously but never been acknowledged. In fact, by printing the value of `dma_hw->intr` before this, I could see that it was the case. After this change, both my special case reproducer from the related issue works, and the odd gaps in LED data transmission seen in the WIP code for TM1814 LEDs was fixed. I never saw this problem on Feather RP2350, only on Metro RP2040, but I don't know why. It would depend on what had previously happened to the DMA channel that ends up allocated to this PIO state machine. Less likely, it could depend on details of the DMA peripheral that changed between the chips. Closes: #9678
1 parent fad755d commit d0e8030

File tree

1 file changed

+2
-0
lines changed

1 file changed

+2
-0
lines changed

ports/raspberrypi/common-hal/rp2pio/StateMachine.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,6 +1038,8 @@ bool common_hal_rp2pio_statemachine_background_write(rp2pio_statemachine_obj_t *
10381038
false);
10391039

10401040
common_hal_mcu_disable_interrupts();
1041+
// Acknowledge any previous pending interrupt
1042+
dma_hw->ints0 |= 1u << channel;
10411043
MP_STATE_PORT(background_pio)[channel] = self;
10421044
dma_hw->inte0 |= 1u << channel;
10431045
irq_set_mask_enabled(1 << DMA_IRQ_0, true);

0 commit comments

Comments
 (0)