mirror of
https://github.com/eddyem/stm32samples.git
synced 2026-08-13 19:49:24 +03:00
add G431-blink
This commit is contained in:
306
G4:G431/inc/startup/vector.c
Normal file
306
G4:G431/inc/startup/vector.c
Normal file
@@ -0,0 +1,306 @@
|
||||
/*
|
||||
* This file is part of the libopencm3 project.
|
||||
*
|
||||
* Copyright (C) 2010 Piotr Esden-Tempski <piotr@esden.net>,
|
||||
* Copyright (C) 2012 chrysn <chrysn@fsfe.org>
|
||||
*
|
||||
* This library is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include "vector.h"
|
||||
#include "common_macros.h"
|
||||
|
||||
// would change later
|
||||
uint32_t SysFreq = 8000000;
|
||||
|
||||
typedef void (*vector_table_entry_t)(void);
|
||||
typedef void (*funcp_t) (void);
|
||||
|
||||
void main(void);
|
||||
void blocking_handler(void);
|
||||
void null_handler(void);
|
||||
|
||||
#ifndef STM32G4
|
||||
#error "Not supported STM32 family"
|
||||
#endif
|
||||
|
||||
#include "stm32g4xx.h"
|
||||
|
||||
#define NVIC_IRQ_COUNT 102
|
||||
|
||||
#if defined STM32G431xx
|
||||
#define IRQ_HANDLERS \
|
||||
[WWDG_IRQn] = wwdg_isr, \
|
||||
[PVD_PVM_IRQn] = pvd_isr, \
|
||||
[RTC_TAMP_LSECSS_IRQn] = rtc_tamp_css_isr, \
|
||||
[RTC_WKUP_IRQn] = rtc_wkup_isr, \
|
||||
[FLASH_IRQn] = flash_isr, \
|
||||
[RCC_IRQn] = rcc_isr, \
|
||||
[EXTI0_IRQn] = exti0_isr, \
|
||||
[EXTI1_IRQn] = exti1_isr, \
|
||||
[EXTI2_IRQn] = exti2_isr, \
|
||||
[EXTI3_IRQn] = exti3_isr, \
|
||||
[EXTI4_IRQn] = exti4_isr, \
|
||||
[DMA1_Channel1_IRQn] = dma1_channel1_isr, \
|
||||
[DMA1_Channel2_IRQn] = dma1_channel2_isr, \
|
||||
[DMA1_Channel3_IRQn] = dma1_channel3_isr, \
|
||||
[DMA1_Channel4_IRQn] = dma1_channel4_isr, \
|
||||
[DMA1_Channel5_IRQn] = dma1_channel5_isr, \
|
||||
[DMA1_Channel6_IRQn] = dma1_channel6_isr, \
|
||||
[ADC1_2_IRQn] = adc12_isr, \
|
||||
[USB_HP_IRQn] = usb_hp_isr, \
|
||||
[USB_LP_IRQn] = usb_lp_isr, \
|
||||
[FDCAN1_IT0_IRQn] = fdcan1_it0_isr, \
|
||||
[FDCAN1_IT1_IRQn] = fdcan1_it1_isr, \
|
||||
[EXTI9_5_IRQn] = exti9_5_isr, \
|
||||
[TIM1_BRK_TIM15_IRQn] = tim1_brk_tim15_isr, \
|
||||
[TIM1_UP_TIM16_IRQn] = tim1_up_tim16_isr, \
|
||||
[TIM1_TRG_COM_TIM17_IRQn] = tim1_trg_tim17_isr, \
|
||||
[TIM1_CC_IRQn] = tim1_cc_isr, \
|
||||
[TIM2_IRQn] = tim2_isr, \
|
||||
[TIM3_IRQn] = tim3_isr, \
|
||||
[TIM4_IRQn] = tim4_isr, \
|
||||
[I2C1_EV_IRQn] = i2c1_ev_isr, \
|
||||
[I2C1_ER_IRQn] = i2c1_er_isr, \
|
||||
[I2C2_EV_IRQn] = i2c2_ev_isr, \
|
||||
[I2C2_ER_IRQn] = i2c2_er_isr, \
|
||||
[SPI1_IRQn] = spi1_isr, \
|
||||
[SPI2_IRQn] = spi2_isr, \
|
||||
[USART1_IRQn] = usart1_isr, \
|
||||
[USART2_IRQn] = usart2_isr, \
|
||||
[USART3_IRQn] = usart3_isr, \
|
||||
[EXTI15_10_IRQn] = exti15_10_isr, \
|
||||
[RTC_Alarm_IRQn] = rtc_alarm_isr, \
|
||||
[USBWakeUp_IRQn] = usb_wakeup_isr, \
|
||||
[TIM8_BRK_IRQn] = tim8_brk_isr, \
|
||||
[TIM8_UP_IRQn] = tim8_up_isr, \
|
||||
[TIM8_TRG_COM_IRQn] = tim8_trg_isr, \
|
||||
[TIM8_CC_IRQn] = tim8_cc_isr, \
|
||||
[LPTIM1_IRQn] = lptim1_isr, \
|
||||
[SPI3_IRQn] = spi3_isr, \
|
||||
[UART4_IRQn] = uart4_isr, \
|
||||
[TIM6_DAC_IRQn] = tim6_dac13under_isr, \
|
||||
[TIM7_IRQn] = tim7_dac24under_isr, \
|
||||
[DMA2_Channel1_IRQn] = dma2_channel1_isr, \
|
||||
[DMA2_Channel2_IRQn] = dma2_channel2_isr, \
|
||||
[DMA2_Channel3_IRQn] = dma2_channel3_isr, \
|
||||
[DMA2_Channel4_IRQn] = dma2_channel4_isr, \
|
||||
[DMA2_Channel5_IRQn] = dma2_channel5_isr, \
|
||||
[UCPD1_IRQn] = ucpd1_isr, \
|
||||
[COMP1_2_3_IRQn] = comp123_isr, \
|
||||
[COMP4_IRQn] = comp456_isr, \
|
||||
[CRS_IRQn] = crs_isr, \
|
||||
[SAI1_IRQn] = sai_isr, \
|
||||
[FPU_IRQn] = fpu_isr, \
|
||||
[RNG_IRQn] = rng_isr, \
|
||||
[LPUART1_IRQn] = lpuart_isr, \
|
||||
[I2C3_EV_IRQn] = i2c3_ev_isr, \
|
||||
[I2C3_ER_IRQn] = i2c3_er_isr, \
|
||||
[DMAMUX_OVR_IRQn] = dmamux_ovr_isr, \
|
||||
[DMA2_Channel6_IRQn] = dma2_channel6_isr, \
|
||||
[CORDIC_IRQn] = cordic_isr, \
|
||||
[FMAC_IRQn] = fmac_isr
|
||||
#else
|
||||
#error "Not supported STM32G4 MCU"
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
unsigned int *initial_sp_value; /**< Initial stack pointer value. */
|
||||
vector_table_entry_t reset;
|
||||
vector_table_entry_t nmi;
|
||||
vector_table_entry_t hard_fault;
|
||||
vector_table_entry_t memory_manage_fault; /* not in CM0 */
|
||||
vector_table_entry_t bus_fault; /* not in CM0 */
|
||||
vector_table_entry_t usage_fault; /* not in CM0 */
|
||||
vector_table_entry_t reserved_x001c[4];
|
||||
vector_table_entry_t sv_call;
|
||||
vector_table_entry_t debug_monitor; /* not in CM0 */
|
||||
vector_table_entry_t reserved_x0034;
|
||||
vector_table_entry_t pend_sv;
|
||||
vector_table_entry_t systick;
|
||||
vector_table_entry_t irq[NVIC_IRQ_COUNT];
|
||||
} vector_table_t;
|
||||
|
||||
extern unsigned _stack;
|
||||
|
||||
void WEAK __attribute__ ((naked)) __attribute__ ((noreturn)) reset_handler(void){
|
||||
extern uint32_t _sdata; // .data section start
|
||||
extern uint32_t _edata; // .data section end
|
||||
extern uint32_t _sbss; // .bss section start
|
||||
extern uint32_t _ebss; // .bss section end
|
||||
extern uint32_t _ldata; // .data load address
|
||||
|
||||
uint32_t *dst = &_sdata;
|
||||
uint32_t *src = &_ldata;
|
||||
|
||||
// copy initialized variables data
|
||||
while ( dst < &_edata ) { *dst++ = *src++; }
|
||||
|
||||
// clear uninitialized variables
|
||||
for ( dst = &_sbss; dst < &_ebss; dst++ ) { *dst = 0; }
|
||||
|
||||
/* Enable access to Floating-Point coprocessor. */
|
||||
#if (__FPU_PRESENT == 1)
|
||||
SCB->CPACR = 0x0f << 20 ; /* set CP10 and CP11 Full Access */
|
||||
nop();
|
||||
__DSB();
|
||||
__ISB();
|
||||
#endif
|
||||
|
||||
// call main
|
||||
main();
|
||||
|
||||
// halt
|
||||
for(;;) {}
|
||||
}
|
||||
|
||||
void blocking_handler(void){
|
||||
while (1);
|
||||
}
|
||||
|
||||
void null_handler(void){
|
||||
/* Do nothing. */
|
||||
}
|
||||
|
||||
void WEAK nmi_handler(void);
|
||||
void WEAK hard_fault_handler(void);
|
||||
void WEAK sv_call_handler(void);
|
||||
void WEAK pend_sv_handler(void);
|
||||
void WEAK sys_tick_handler(void);
|
||||
void WEAK mem_manage_handler(void);
|
||||
void WEAK bus_fault_handler(void);
|
||||
void WEAK usage_fault_handler(void);
|
||||
void WEAK debug_monitor_handler(void);
|
||||
|
||||
#if defined STM32G431xx
|
||||
void wwdg_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void pvd_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void rtc_tamp_css_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void rtc_wkup_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void flash_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void rcc_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void exti0_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void exti1_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void exti2_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void exti3_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void exti4_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void dma1_channel1_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void dma1_channel2_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void dma1_channel3_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void dma1_channel4_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void dma1_channel5_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void dma1_channel6_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void dma1_channel7_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void adc12_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void usb_hp_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void usb_lp_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void fdcan1_it0_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void fdcan1_it1_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void exti9_5_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim1_brk_tim15_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim1_up_tim16_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim1_trg_tim17_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim1_cc_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim2_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim3_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim4_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void i2c1_ev_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void i2c1_er_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void i2c2_ev_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void i2c2_er_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void spi1_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void spi2_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void usart1_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void usart2_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void usart3_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void exti15_10_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void rtc_alarm_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void usb_wakeup_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim8_brk_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim8_up_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim8_trg_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim8_cc_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void adc3_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void fsmc_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void lptim1_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim5_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void spi3_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void uart4_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void uart5_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim6_dac13under_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim7_dac24under_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void dma2_channel1_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void dma2_channel2_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void dma2_channel3_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void dma2_channel4_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void dma2_channel5_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void adc4_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void adc5_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void ucpd1_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void comp123_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void comp456_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void comp7_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void hrtim_master_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void hrtim_tima_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void hrtim_timb_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void hrtim_timc_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void hrtim_timd_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void hrtim_time_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void hrtim_fault_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void hrtim_timf_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void crs_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void sai_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim20_brk_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim20_up_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim20_trg_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void tim20_cc_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void fpu_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void i2c4_ev_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void i2c4_er_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void spi4_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void aes_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void fdcan2_it0_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void fdcan2_it1_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void fdcan3_it0_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void fdcan3_it1_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void rng_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void lpuart_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void i2c3_ev_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void i2c3_er_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void dmamux_ovr_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void quadspi_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void dma1_channel8_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void dma2_channel6_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void dma2_channel7_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void dma2_channel8_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void cordic_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
void fmac_isr(void) __attribute__((weak, alias("blocking_handler")));
|
||||
#endif
|
||||
|
||||
|
||||
vector_table_t vector_table __attribute__ ((used, section(".vector_table"))) = {
|
||||
.initial_sp_value = &_stack,
|
||||
.reset = reset_handler,
|
||||
.nmi = nmi_handler,
|
||||
.hard_fault = hard_fault_handler,
|
||||
.memory_manage_fault = mem_manage_handler,
|
||||
.bus_fault = bus_fault_handler,
|
||||
.usage_fault = usage_fault_handler,
|
||||
.debug_monitor = debug_monitor_handler,
|
||||
.sv_call = sv_call_handler,
|
||||
.pend_sv = pend_sv_handler,
|
||||
.systick = sys_tick_handler,
|
||||
.irq = {
|
||||
IRQ_HANDLERS
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user