/* * This file is part of the OpenMV project. * Copyright (c) 2013/2014 Ibrahim Abdelkader * This work is licensed under the MIT license, see the file LICENSE for details. * * HAL MSP. * */ #include STM32_HAL_H #include "omv_boardconfig.h" /* GPIO struct */ typedef struct { GPIO_TypeDef *port; uint16_t pin; } gpio_t; /* DCMI GPIOs */ static const gpio_t dcmi_pins[] = { {DCMI_D0_PORT, DCMI_D0_PIN}, {DCMI_D1_PORT, DCMI_D1_PIN}, {DCMI_D2_PORT, DCMI_D2_PIN}, {DCMI_D3_PORT, DCMI_D3_PIN}, {DCMI_D4_PORT, DCMI_D4_PIN}, {DCMI_D5_PORT, DCMI_D5_PIN}, {DCMI_D6_PORT, DCMI_D6_PIN}, {DCMI_D7_PORT, DCMI_D7_PIN}, {DCMI_HSYNC_PORT, DCMI_HSYNC_PIN}, {DCMI_VSYNC_PORT, DCMI_VSYNC_PIN}, {DCMI_PXCLK_PORT, DCMI_PXCLK_PIN}, }; #define NUM_DCMI_PINS (sizeof(dcmi_pins)/sizeof(dcmi_pins[0])) void SystemClock_Config(void); void HAL_MspInit(void) { #if defined(STM32F765xx) || defined(STM32F769xx) // Invalidate each cache before enabling it SCB_InvalidateICache(); SCB_InvalidateDCache(); /* Enable the CPU Cache */ SCB_EnableICache(); SCB_EnableDCache(); #endif /* Set the system clock */ SystemClock_Config(); /* Config Systick */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); /* Enable GPIO clocks */ __GPIOA_CLK_ENABLE(); __GPIOB_CLK_ENABLE(); __GPIOC_CLK_ENABLE(); __GPIOD_CLK_ENABLE(); __GPIOE_CLK_ENABLE(); #if defined(STM32F769xx) __GPIOF_CLK_ENABLE(); __GPIOG_CLK_ENABLE(); __GPIOH_CLK_ENABLE(); __GPIOI_CLK_ENABLE(); __GPIOJ_CLK_ENABLE(); __GPIOK_CLK_ENABLE(); /* Enable JPEG clock */ __HAL_RCC_JPEG_CLK_ENABLE(); #endif /* Enable DMA clocks */ __DMA1_CLK_ENABLE(); __DMA2_CLK_ENABLE(); /* Configure DCMI GPIO */ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.Pull = GPIO_PULLDOWN; GPIO_InitStructure.Speed = GPIO_SPEED_LOW; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Pin = DCMI_RESET_PIN; HAL_GPIO_Init(DCMI_RESET_PORT, &GPIO_InitStructure); GPIO_InitStructure.Pin = DCMI_PWDN_PIN; HAL_GPIO_Init(DCMI_PWDN_PORT, &GPIO_InitStructure); GPIO_InitStructure.Pin = DCMI_FSIN_PIN; HAL_GPIO_Init(DCMI_FSIN_PORT, &GPIO_InitStructure); } void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c) { if (hi2c->Instance == SCCB_I2C) { /* Enable I2C clock */ SCCB_CLK_ENABLE(); /* Configure SCCB GPIOs */ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Speed = GPIO_SPEED_LOW; GPIO_InitStructure.Mode = GPIO_MODE_AF_OD; GPIO_InitStructure.Alternate = SCCB_AF; GPIO_InitStructure.Pin = SCCB_SCL_PIN; HAL_GPIO_Init(SCCB_PORT, &GPIO_InitStructure); GPIO_InitStructure.Pin = SCCB_SDA_PIN; HAL_GPIO_Init(SCCB_PORT, &GPIO_InitStructure); } } void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c) { if (hi2c->Instance == SCCB_I2C) { SCCB_CLK_DISABLE(); } } void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) { #if (OMV_XCLK_SOURCE == OMV_XCLK_TIM) if (htim->Instance == DCMI_TIM) { /* Enable DCMI timer clock */ DCMI_TIM_CLK_ENABLE(); /* Timer GPIO configuration */ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.Pin = DCMI_TIM_PIN; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Speed = GPIO_SPEED_LOW; GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Alternate = DCMI_TIM_AF; HAL_GPIO_Init(DCMI_TIM_PORT, &GPIO_InitStructure); } #endif // (OMV_XCLK_SOURCE == OMV_XCLK_TIM) } void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi) { /* DCMI clock enable */ __DCMI_CLK_ENABLE(); /* DCMI GPIOs configuration */ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.Pull = GPIO_PULLDOWN; GPIO_InitStructure.Speed = GPIO_SPEED_LOW; GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Alternate = GPIO_AF13_DCMI; for (int i=0; i