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
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).