mirror of
https://github.com/eddyem/stm32samples.git
synced 2026-08-12 09:39:25 +03:00
307 lines
14 KiB
C
307 lines
14 KiB
C
/*
|
|
* 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
|
|
}
|
|
};
|