I'm trying to use a PIO to output a step pulse for 4 motors. The PIO routine sets IRQ0, but the interrupt handler is never called. The RP2350 is new to me and I have been looking for examples as well as searching the forums. This function is the result of that effort. Since it's not working, I must have left something out and/or misunderstood how things work. If someone can explain what I've done wrong I would appreciated it.
void pio_step_init(PIO pio, uint sm, uint prog_offs)
My environment:
Windows 10
Arduino IDE 2.3.5
Raspberry Pi Pico C/C++ SDK 4.5.1
Here's the code. Thanks in advance
void pio_step_init(PIO pio, uint sm, uint prog_offs)
My environment:
Windows 10
Arduino IDE 2.3.5
Raspberry Pi Pico C/C++ SDK 4.5.1
Here's the code. Thanks in advance
Code:
// -------------------------------------------------- //// This file is autogenerated by pioasm; do not edit! //// -------------------------------------------------- //#pragma once#if !PICO_NO_HARDWARE#include "hardware/pio.h"#endif// ----------- //// pio_stepper //// ----------- //#define pio_stepper_wrap_target 0#define pio_stepper_wrap 8#define pio_stepper_pio_version 0static const uint16_t pio_stepper_program_instructions[] = { // .wrap_target 0x80a0, // 0: pull block 0x6034, // 1: out x, 20 0x6004, // 2: out pins, 4 0x6044, // 3: out y, 4 0x0084, // 4: jmp y--, 4 0x6004, // 5: out pins, 4 0x0046, // 6: jmp x--, 6 0xc000, // 7: irq nowait 0 0x0000, // 8: jmp 0 // .wrap};#if !PICO_NO_HARDWAREstatic const struct pio_program pio_stepper_program = { .instructions = pio_stepper_program_instructions, .length = 9, .origin = -1, .pio_version = 0,#if PICO_PIO_VERSION > 0 .used_gpio_ranges = 0x0#endif};static inline pio_sm_config pio_stepper_program_get_default_config(uint offset) { pio_sm_config c = pio_get_default_sm_config(); sm_config_set_wrap(&c, offset + pio_stepper_wrap_target, offset + pio_stepper_wrap); return c;}#endif// ----------- //// pio_set_dir //// ----------- //#define pio_set_dir_wrap_target 0#define pio_set_dir_wrap 2#define pio_set_dir_pio_version 0static const uint16_t pio_set_dir_program_instructions[] = { // .wrap_target 0x80a0, // 0: pull block 0x6004, // 1: out pins, 4 0x0000, // 2: jmp 0 // .wrap};#if !PICO_NO_HARDWAREstatic const struct pio_program pio_set_dir_program = { .instructions = pio_set_dir_program_instructions, .length = 3, .origin = -1, .pio_version = 0,#if PICO_PIO_VERSION > 0 .used_gpio_ranges = 0x0#endif};static inline pio_sm_config pio_set_dir_program_get_default_config(uint offset) { pio_sm_config c = pio_get_default_sm_config(); sm_config_set_wrap(&c, offset + pio_set_dir_wrap_target, offset + pio_set_dir_wrap); return c;}#endif/*************************************C++ File : PIO_Stepper.cc*************************************/#include <Adafruit_TinyUSB.h>#include "hardware/clocks.h"#include "hardware/structs/pll.h"#include "hardware/structs/clocks.h"#include "hardware/gpio.h"#include "hardware/pio.h"#include "PIO_Stepper.h"#include "Step_IO.hh"#define pin_step 2#define pin_dir 6 PIO pio_s; uint sm_s; uint offset_s; PIO pio_d; uint sm_d; uint offset_d; uint8_t Dir = 0;uint f_clk_sys;float pio__clkdiv;void Do_Step(uint32_t Step_Width, uint8_t Step_Pulse, uint8_t Pins)// Up to 4 axes{ // // |----|----|----|----.----.----.----.----| // zero Pulse Pins Step_Width // Step_Pulse = Step_Pulse & 0x0F; Step_Width = (Step_Width & 0x000FFFFF) - Step_Pulse; Pins = Pins & 0x0F; Step_Width = Step_Width | (Pins << 20) | (Step_Pulse << 24); // Serial.printf(" %8x \r \n", Step_Width); pio_sm_put_blocking(pio_s, sm_s, Step_Width);}void IRQ_Handler_Stepper(void) { // Serial.printf("IRQ: %02x, PIO %02x, CRTL: %02x \r\n", pio_s->irq, pio_s->inte0, pio_s->ctrl); pio_interrupt_clear(pio_s, 0); Dir++; Dir &= 15; pio_set_direction(Dir); Do_Step(500000, 10, 15);}void pio_step_init(PIO pio, uint sm, uint prog_offs) { pio_sm_config c = pio_stepper_program_get_default_config(prog_offs); for (int i = 0; i < 4; i++) pio_gpio_init(pio, pin_step + i); sm_config_set_out_pins(&c, pin_step, 4); pio_sm_set_consecutive_pindirs(pio, sm, pin_step, 4, true); sm_config_set_clkdiv(&c, pio__clkdiv); pio_sm_init(pio, sm, prog_offs, &c); pio_sm_set_enabled(pio, sm, true); // setup irq pio_set_irq0_source_enabled(pio, pis_interrupt0, true); irq_set_exclusive_handler(PIO0_IRQ_0, IRQ_Handler_Stepper); irq_set_enabled(PIO0_IRQ_0, true);} void pio_dir_init(PIO pio, uint sm, uint prog_offs) { pio_sm_config c = pio_set_dir_program_get_default_config(prog_offs); for (int i = 0; i < 4; i++) pio_gpio_init(pio, pin_dir + i); sm_config_set_out_pins(&c, pin_dir, 4); pio_sm_set_consecutive_pindirs(pio, sm, pin_dir, 4, true); sm_config_set_clkdiv(&c, pio__clkdiv); pio_sm_init(pio, sm, prog_offs, &c); pio_sm_set_enabled(pio, sm, true);}void pio_load_step(void) { f_clk_sys = frequency_count_khz(CLOCKS_FC0_SRC_VALUE_CLK_SYS); bool success = pio_claim_free_sm_and_add_program_for_gpio_range( &pio_stepper_program, &pio_s, &sm_s, &offset_s, pin_step, 4, true); hard_assert(success); pio__clkdiv = 150.0f; pio_step_init(pio_s, sm_s, offset_s); Serial.printf("IRQ: %02x, PIO %02x, CRTL: %02x \r\n", pio_s->irq, pio_s->inte0, pio_s->ctrl); return;}void pio_load_dir(void) { f_clk_sys = frequency_count_khz(CLOCKS_FC0_SRC_VALUE_CLK_SYS); bool success = pio_claim_free_sm_and_add_program_for_gpio_range( &pio_set_dir_program, &pio_d, &sm_d, &offset_d, pin_dir, 4, true); hard_assert(success); pio__clkdiv = 1.0; pio_dir_init(pio_d, sm_d, offset_d); return;}void pio_set_direction(uint8_t dir_pins) { pio_sm_put_blocking(pio_d, sm_d, dir_pins);}Statistics: Posted by jag63 — Mon Apr 14, 2025 7:21 pm