237 uint8_t smi, uint8_t l,
SM_regs & r)
238 : pio(p), pio_set(ps), pio_clr(pc), pio_index(pi),
239 sm_index(smi), load_addr(l), regs(r) {
244 inline void execute(uint16_t instruction) {
245 regs.SM_INSTR = instruction;
252 void setRegister(out_dest_t reg, uint32_t val,
253 uint8_t offset = 0, uint8_t size = 32);
256 void setClock(uint32_t hz);
259 inline bool TxFifoFull()
const {
260 return pio.FSTAT.TXFULL & (1 << sm_index);
264 inline bool TxFifoEmpty()
const {
265 return pio.FSTAT.TXEMPTY & (1 << sm_index);
269 inline bool RxFifoEmpty()
const {
270 return pio.FSTAT.RXEMPTY & (1 << sm_index);
274 inline void writeTxFifo(uint32_t val) {
275 while(TxFifoFull()) ;
276 pio.TXF[sm_index] = val;
280 inline uint32_t readRxFifo() {
281 while(RxFifoEmpty()) ;
282 return pio.RXF[sm_index];
287 inline void setWrap(uint8_t bottom, uint8_t top) {
288 regs.SM_EXECCTRL.WRAP_BOTTOM = bottom + load_addr;
289 regs.SM_EXECCTRL.WRAP_TOP = top + load_addr;
293 inline void enable() {
294 pio_set.CTRL.SM_ENABLE = (1 << sm_index);
298 inline void disable() {
299 pio_clr.CTRL.SM_ENABLE = (1 << sm_index);
303 inline bool isEnabled()
const {
304 return pio.CTRL.SM_ENABLE & (1 << sm_index);
307 inline bool isStalled() {
309 pio.FDEBUG.TXSTALL = (1 << sm_index);
310 pio.FDEBUG.RXSTALL = (1 << sm_index);
311 return (pio.FDEBUG.TXSTALL & (1 << sm_index)) ||
312 (pio.FDEBUG.RXSTALL & (1 << sm_index));
315 void attachIrq(function<
void()> handler);
319 void attachTXNFULLIrq(function<
void()> handler);
320 void enableTXNFULLIrq();
321 void disableTXNFULLIrq();
323 void attachRXNEMPTYIrq(function<
void()> handler);
324 void enableRXNEMPTYIrq();
325 void disableRXNEMPTYIrq();