***Question***

*MCU STM32 with stepper motor driver Allegro A4988 are moving a 2 coil, 4 wire, bipolar stepper motor ridiculously slowly, with flickers and stutters.  How to fix?*

---

[![a4988 pic 1][1]][1]

---

[![a4988 pic 3][2]][2]

---

[![a4988 pic 2][3]][3]

---

*The OP's original code (See Appendix A, B, and C below)*

---

***Answer***

*The schematic v0.1*

---

[![a4988 v0.1][4]][4]

---



*/ to continue, ...*

---

***References***

*/ to continue, ...*

---

***Appendices***

*Appendix A - The OP's Original Code - main.c*

---

    #include "./headers/stm32f767xx.h"
    #include <stdint.h>
    
    int main(void)
    {
        initMotor(0); // initialise the motor
        initLed(7); // initialise the led
        unsigned long a = 0;
        while (1)
        {
            if (a == 50000)
            {
                toggleLed(7); // this LED flashes a little quicker than twice per second 
                stepMotor(0); // output a pulse to the driver to step the motor, attached to PA2
                a = 0;
            }
            a++;
        }
    }

---

*Appenidx B - The OP's Original Code - ./drivers/led.c*

---

        #include "../headers/stm32f767xx.h"
        
        void initLed(int pin)
        {
            RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; // enable the GPIOB clock
            GPIOB->MODER |= (0x1 << (pin * 2)); // set to output
            GPIOB->OTYPER = 0x00; // push-pull mode
            GPIOB->ODR = 0x00; // set output register to 0 across all pins
        }
        
        void toggleLed(int pin)
        {
            GPIOB->ODR ^= (0x1 << pin); // toggle the pin
        }
    
    ---
    
*Appenidx C - The OP's Original Code - ./drivers/motor.c*
    
    ---
    
    #include "../headers/stm32f767xx.h"
    
    void initMotor(int step_pin)
    {
        RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // enable the GPIOA clock
        GPIOA->MODER |= (0x1 << (step_pin * 2)); // set to output
        GPIOA->OTYPER = 0x00; // push-pull mode
        GPIOA->PUPDR |= (0x2 << (step_pin * 2)); // pull down the pin specified
        GPIOA->ODR = 0x00; // set output register to 0 across all pins
    }
    
    void stepMotor(int step_pin)
    {
        GPIOA->ODR |= (1 << step_pin); // output to the pin specified
        GPIOA->ODR &= ~(1 << step_pin); // reset the output back to 0
    }

----

*/ to continue, ...*


  [1]: https://i.sstatic.net/FN7SL.jpg
  [2]: https://i.sstatic.net/Kf6Mj.jpg
  [3]: https://i.sstatic.net/QeS1S.jpg
  [4]: https://i.sstatic.net/V71gH.jpg