cpq / bare-metal-programming-guide

A bare metal programming guide (ARM microcontrollers)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Weird gpio_write issue: more than six calls do not work

kumawatb opened this issue · comments

Hi,
I'm trying to follow along with the guide for a STM32F3Discovery board. I wrote the GPIO/RCC API as in the instructions, making sure I used the correct register addresses for my MCU. The gpio_write function works fine when I turn on individual LEDs on the board, or even six of them together. However, as soon as I try calling gpio_write 7 times on seven different led pins, all the LEDs stop working. It seems like they come on for a split-second when I flash the firmware, but then go completely dark. Essentially,

This works:

   // Specify some pins
   uint16_t led1 = PIN('E',12); 
   uint16_t led2 = PIN('E',11);
   uint16_t led3 = PIN('E',10);
   uint16_t led4 = PIN('E',9);
   uint16_t led5 = PIN('E',8);
   uint16_t led6 = PIN('E',13);
   // uint16_t led7 = PIN('E',14);
   // uint16_t led8 = PIN('E',15);
   
   RCC->AHBENR |= BIT(PINPERI(led1)+17); // PINPERI==PINBANK

   gpio_set_mode(led1, GPIO_MODE_OUTPUT);
   gpio_set_mode(led2, GPIO_MODE_OUTPUT);
   gpio_set_mode(led3, GPIO_MODE_OUTPUT);
   gpio_set_mode(led4, GPIO_MODE_OUTPUT);
   gpio_set_mode(led5, GPIO_MODE_OUTPUT);
   gpio_set_mode(led6, GPIO_MODE_OUTPUT);
   // gpio_set_mode(led7, GPIO_MODE_OUTPUT);
   // gpio_set_mode(led8, GPIO_MODE_OUTPUT);
   
   gpio_write(led1, true);
   gpio_write(led2, true);
   gpio_write(led3, true);
   gpio_write(led4, true);
   gpio_write(led5, true);
   gpio_write(led6, true);
   // gpio_write(led7, true);
   //gpio_write(led8, true);

This doesn't work:

    // Specify some pins
    uint16_t led1 = PIN('E',12); 
    uint16_t led2 = PIN('E',11);
    uint16_t led3 = PIN('E',10);
    uint16_t led4 = PIN('E',9);
    uint16_t led5 = PIN('E',8);
    uint16_t led6 = PIN('E',13);
    uint16_t led7 = PIN('E',14);
    // uint16_t led8 = PIN('E',15);
    
    RCC->AHBENR |= BIT(PINPERI(led1)+17); // PINPERI==PINBANK

    gpio_set_mode(led1, GPIO_MODE_OUTPUT);
    gpio_set_mode(led2, GPIO_MODE_OUTPUT);
    gpio_set_mode(led3, GPIO_MODE_OUTPUT);
    gpio_set_mode(led4, GPIO_MODE_OUTPUT);
    gpio_set_mode(led5, GPIO_MODE_OUTPUT);
    gpio_set_mode(led6, GPIO_MODE_OUTPUT);
    gpio_set_mode(led7, GPIO_MODE_OUTPUT);
    // gpio_set_mode(led8, GPIO_MODE_OUTPUT);
    
    gpio_write(led1, true);
    gpio_write(led2, true);
    gpio_write(led3, true);
    gpio_write(led4, true);
    gpio_write(led5, true);
    gpio_write(led6, true);
    gpio_write(led7, true);
    //gpio_write(led8, true);

This issue also seems to be affecting the second part of the tutorial for me, where the spin function is used. In that case, even with one led, I get no blinking. I've attached my main.c, Makefile, and link.ld file with this issue.

Thanks for your help, and thanks for this great resource!
Bhaskar

gpio_error_blinky.zip

Okay after a bit of Ozone debugging, I figured out that I was using the wrong linker specification. I mistakenly assumed the STM32F303VC6 had 48kB of RAM (it only has 40kB).