# ifdef BOOTSTUB
void gpio_usb_init ( void ) {
# else
static void gpio_usb_init ( void ) {
# endif
// A11,A12: USB
set_gpio_alternate ( GPIOA , 11 , GPIO_AF10_OTG_FS ) ;
set_gpio_alternate ( GPIOA , 12 , GPIO_AF10_OTG_FS ) ;
GPIOA - > OSPEEDR = GPIO_OSPEEDER_OSPEEDR11 | GPIO_OSPEEDER_OSPEEDR12 ;
}
void gpio_spi_init ( void ) {
// A4-A7: SPI
set_gpio_alternate ( GPIOA , 4 , GPIO_AF5_SPI1 ) ;
set_gpio_alternate ( GPIOA , 5 , GPIO_AF5_SPI1 ) ;
set_gpio_alternate ( GPIOA , 6 , GPIO_AF5_SPI1 ) ;
set_gpio_alternate ( GPIOA , 7 , GPIO_AF5_SPI1 ) ;
register_set_bits ( & ( GPIOA - > OSPEEDR ) , GPIO_OSPEEDER_OSPEEDR4 | GPIO_OSPEEDER_OSPEEDR5 | GPIO_OSPEEDER_OSPEEDR6 | GPIO_OSPEEDER_OSPEEDR7 ) ;
}
void gpio_usart2_init ( void ) {
// A2,A3: USART 2 for debugging
set_gpio_alternate ( GPIOA , 2 , GPIO_AF7_USART2 ) ;
set_gpio_alternate ( GPIOA , 3 , GPIO_AF7_USART2 ) ;
}
// Common GPIO initialization
void common_init_gpio ( void ) {
// TODO: Is this block actually doing something???
// pull low to hold ESP in reset??
// enable OTG out tied to ground
GPIOA - > ODR = 0 ;
GPIOB - > ODR = 0 ;
GPIOA - > PUPDR = 0 ;
GPIOB - > AFR [ 0 ] = 0 ;
GPIOB - > AFR [ 1 ] = 0 ;
// C2: Voltage sense line
set_gpio_mode ( GPIOC , 2 , MODE_ANALOG ) ;
gpio_usb_init ( ) ;
// B8,B9: CAN 1
set_gpio_alternate ( GPIOB , 8 , GPIO_AF8_CAN1 ) ;
set_gpio_alternate ( GPIOB , 9 , GPIO_AF8_CAN1 ) ;
}
void flasher_peripherals_init ( void ) {
RCC - > AHB1ENR | = RCC_AHB1ENR_DMA2EN ;
RCC - > APB2ENR | = RCC_APB2ENR_SPI1EN ;
RCC - > AHB2ENR | = RCC_AHB2ENR_OTGFSEN ;
RCC - > APB1ENR | = RCC_APB1ENR_USART2EN ;
}
// Peripheral initialization
void peripherals_init ( void ) {
// enable GPIO(A,B,C,D)
RCC - > AHB1ENR | = RCC_AHB1ENR_GPIOAEN ;
RCC - > AHB1ENR | = RCC_AHB1ENR_GPIOBEN ;
RCC - > AHB1ENR | = RCC_AHB1ENR_GPIOCEN ;
RCC - > AHB1ENR | = RCC_AHB1ENR_GPIODEN ;
// Supplemental
RCC - > AHB1ENR | = RCC_AHB1ENR_DMA2EN ;
RCC - > APB1ENR | = RCC_APB1ENR_PWREN ; // for RTC config
RCC - > APB2ENR | = RCC_APB2ENR_SYSCFGEN ;
// Connectivity
RCC - > APB2ENR | = RCC_APB2ENR_SPI1EN ;
RCC - > AHB2ENR | = RCC_AHB2ENR_OTGFSEN ;
RCC - > APB1ENR | = RCC_APB1ENR_USART2EN ;
RCC - > APB1ENR | = RCC_APB1ENR_USART3EN ;
RCC - > APB1ENR | = RCC_APB1ENR_UART5EN ;
RCC - > APB1ENR | = RCC_APB1ENR_CAN1EN ;
RCC - > APB1ENR | = RCC_APB1ENR_CAN2EN ;
RCC - > APB1ENR | = RCC_APB1ENR_CAN3EN ;
// Analog
RCC - > APB2ENR | = RCC_APB2ENR_ADC1EN ;
RCC - > APB1ENR | = RCC_APB1ENR_DACEN ;
// Timers
RCC - > APB2ENR | = RCC_APB2ENR_TIM1EN ; // clock source timer
RCC - > APB1ENR | = RCC_APB1ENR_TIM2EN ; // main counter
RCC - > APB1ENR | = RCC_APB1ENR_TIM3EN ; // pedal and fan PWM
RCC - > APB1ENR | = RCC_APB1ENR_TIM4EN ; // IR PWM
RCC - > APB1ENR | = RCC_APB1ENR_TIM5EN ; // k-line init
RCC - > APB1ENR | = RCC_APB1ENR_TIM6EN ; // interrupt timer
RCC - > APB2ENR | = RCC_APB2ENR_TIM9EN ; // slow loop
}
void enable_interrupt_timer ( void ) {
register_set_bits ( & ( RCC - > APB1ENR ) , RCC_APB1ENR_TIM6EN ) ; // Enable interrupt timer peripheral
}