int main() { /* Clear .bss. We'll do this inline (vs. calling memset) just to be * certain that there are no issues with the state of global variables. */ uint32_t *dest; for (dest = _START_BSS; dest < _END_BSS; ) { *dest++ = 0; } /* enable clock on GPIOD peripheral */ putreg32((getreg32(STM32_RCC_AHB1ENR) | 0x00000008),STM32_RCC_AHB1ENR); /* set LED pin output mode */ putreg32(((uint32_t)GPIO_MODER_OUTPUT << GPIO_MODER_SHIFT(LED_PIN_INDICATE)),STM32_GPIOD_MODER); // go to c++ code _g_globalvar = myclass_main(0, NULL); while(1) { putreg32(GPIO_BSRR_SET(LED_PIN_INDICATE),STM32_GPIOD_BSRR); // set LED pin high delay(200000); putreg32(GPIO_BSRR_RESET(LED_PIN_INDICATE),STM32_GPIOD_BSRR); // set LED pin low delay(200000); } }
int stm32_hardfault(void) { /* enable clock on GPIOD peripheral */ putreg32((getreg32(STM32_RCC_AHB1ENR) | 0x00000008),STM32_RCC_AHB1ENR); /* set LED pin output mode */ putreg32(((uint32_t)GPIO_MODER_OUTPUT << GPIO_MODER_SHIFT(LED_PIN_PANIC)),STM32_GPIOD_MODER); for (;;) { putreg32(GPIO_BSRR_SET(LED_PIN_PANIC),STM32_GPIOD_BSRR); // set LED pin high delay(200000); putreg32(GPIO_BSRR_RESET(LED_PIN_PANIC),STM32_GPIOD_BSRR); // set LED pin low delay(200000); } }
int stm32_configgpio(uint32_t cfgset) { uintptr_t base; uint32_t regval; uint32_t setting; unsigned int regoffset; unsigned int port; unsigned int pin; unsigned int pos; unsigned int pinmode; //irqstate_t flags; /* Verify that this hardware supports the select GPIO port */ port = (cfgset & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT; if (port >= STM32_NGPIO_PORTS) { return -EINVAL; } /* Get the port base address */ base = g_gpiobase[port]; /* Get the pin number and select the port configuration register for that * pin */ pin = (cfgset & GPIO_PIN_MASK) >> GPIO_PIN_SHIFT; /* Set up the mode register (and remember whether the pin mode) */ switch (cfgset & GPIO_MODE_MASK) { default: case GPIO_INPUT: /* Input mode */ pinmode = GPIO_MODER_INPUT; break; case GPIO_OUTPUT: /* General purpose output mode */ pinmode = GPIO_MODER_OUTPUT; break; case GPIO_ALT: /* Alternate function mode */ pinmode = GPIO_MODER_ALT; break; case GPIO_ANALOG: /* Analog mode */ pinmode = GPIO_MODER_ANALOG; break; } /* Interrupts must be disabled from here on out so that we have mutually * exclusive access to all of the GPIO configuration registers. */ //flags = irqsave(); CoSchedLock(); /* Now apply the configuration to the mode register */ regval = getreg32(base + STM32_GPIO_MODER_OFFSET); regval &= ~GPIO_MODER_MASK(pin); regval |= ((uint32_t)pinmode << GPIO_MODER_SHIFT(pin)); putreg32(regval, base + STM32_GPIO_MODER_OFFSET); /* Set up the pull-up/pull-down configuration (all but analog pins) */ setting = GPIO_PUPDR_NONE; if (pinmode != GPIO_MODER_ANALOG) { switch (cfgset & GPIO_PUPD_MASK) { default: case GPIO_FLOAT: /* No pull-up, pull-down */ break; case GPIO_PULLUP: /* Pull-up */ setting = GPIO_PUPDR_PULLUP; break; case GPIO_PULLDOWN: /* Pull-down */ setting = GPIO_PUPDR_PULLDOWN; break; } } regval = getreg32(base + STM32_GPIO_PUPDR_OFFSET); regval &= ~GPIO_PUPDR_MASK(pin); regval |= (setting << GPIO_PUPDR_SHIFT(pin)); putreg32(regval, base + STM32_GPIO_PUPDR_OFFSET); /* Set the alternate function (Only alternate function pins) */ if (pinmode == GPIO_MODER_ALT) { setting = (cfgset & GPIO_AF_MASK) >> GPIO_AF_SHIFT; }