Разобрался с использованием флага TXSTALL для проверки завершения работы ПИО программы. Оказывается, флаг сам не очищается. Один раз выставленный, он остается висеть всегда, или пока его не очистишь принудительно. Причем очистка флага до запуска программы не помогает - пока вы запихиваете первое значение в FIFO, флаг уже успевает выставится!
Вообще, было бы логично, если бы флаг сбрасывался при помещении в FIFO нового значения. Но почему-то авторы SDK этого не сделали.
Решение - принудительно очищать флаг при помещении в буфер FIFO новых данных. Сделал так - теперь все работает правильно.
Да, добавлю - очистка флага производится записью единицы в соответствующий бит:
void pio_sm_tx_fifo_stall_clear(PIO pio, uint sm) {
pio->fdebug |= (1u << (PIO_FDEBUG_TXSTALL_LSB + sm)) ;
}








