[stm32] Add new target for stm32f429i-disc1 w/ HAL
This is a new target for the discovery board based on the in-tree
target but with stm32cubef4 HAL support.
The main differences are that it uses STM's code for initializing the
FPU, reclocks the board to its 180Mhz maximum, and uses the stm32cubef4
backends for blinky.
It does not yet support the test runner, but the existing one in-tree
should work with all STM32F4xx boards that have a ST-Link/v2.1 with
minimal changes.
Change-Id: I2bdd17d5958b5204bf9d2b44909bd8bd1e25402c
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/experimental/+/39770
Commit-Queue: Varun Sharma <vars@google.com>
Reviewed-by: Ali Zhang <alizhang@google.com>
diff --git a/targets/stm32f429i-disc1-stm32cube/vector_table.c b/targets/stm32f429i-disc1-stm32cube/vector_table.c
new file mode 100644
index 0000000..fd7691e
--- /dev/null
+++ b/targets/stm32f429i-disc1-stm32cube/vector_table.c
@@ -0,0 +1,65 @@
+// Copyright 2020 The Pigweed Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+#include <stdbool.h>
+
+#include "pw_boot_armv7m/boot.h"
+#include "stm32f4xx.h"
+
+// Default handler to insert into the ARMv7-M vector table (below).
+// This function exists for convenience. If a device isn't doing what you
+// expect, it might have hit a fault and ended up here.
+static void DefaultFaultHandler(void) {
+ while (true) {
+ // Wait for debugger to attach.
+ }
+}
+
+// This is the device's interrupt vector table. It's not referenced in any
+// code because the platform (STM32F4xx) expects this table to be present at the
+// beginning of flash. The exact address is specified in the pw_boot_armv7m
+// configuration as part of the target config.
+//
+// For more information, see ARMv7-M Architecture Reference Manual DDI 0403E.b
+// section B1.5.3.
+
+// This typedef is for convenience when building the vector table. With the
+// exception of SP_main (0th entry in the vector table), all the entries of the
+// vector table are function pointers.
+typedef void (*InterruptHandler)(void);
+
+// This is the timer interrupt handler implemented by the stm32cubef4 timer
+// template.
+void TIM6_DAC_IRQHandler(void);
+
+PW_KEEP_IN_SECTION(".vector_table")
+const InterruptHandler vector_table[] = {
+ // The starting location of the stack pointer.
+ // This address is NOT an interrupt handler/function pointer, it is simply
+ // the address that the main stack pointer should be initialized to. The
+ // value is reinterpret casted because it needs to be in the vector table.
+ [0] = (InterruptHandler)(&pw_boot_stack_high_addr),
+
+ // Reset handler, dictates how to handle reset interrupt. This is the
+ // address that the Program Counter (PC) is initialized to at boot.
+ [1] = pw_boot_Entry,
+
+ // NMI handler.
+ [2] = DefaultFaultHandler,
+ // HardFault handler.
+ [3] = DefaultFaultHandler,
+
+ // stm32f4xx_hal sys-tick handler.
+ [TIM6_DAC_IRQn + 16] = TIM6_DAC_IRQHandler,
+};