/* ******************************************************************************* * Copyright (c) 2020-2021, STMicroelectronics * All rights reserved. * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ******************************************************************************* */ #if defined(STM32H723xx) #include "pins_arduino.h" // Digital PinName array const PinName digitalPin[] = { PA_0, // D0/A0 PA_1, // D1/A1 PA_2, // D2/A2 PA_3, // D3/A3 PA_4, // D4/A4 PA_5, // D5/A5 PA_6, // D6/A6 PA_7, // D7/A7 PA_8, // D8 PA_9, // D9 PA_10, // D10 PA_11, // D11 PA_12, // D12 PA_13, // D13 PA_14, // D14 PA_15, // D15 PB_0, // D16/A8 PB_1, // D17/A9 PB_2, // D18 PB_3, // D19 PB_4, // D20 PB_5, // D21 PB_6, // D22 PB_7, // D23 PB_8, // D24 PB_9, // D25 PB_10, // D26 PB_11, // D27 PB_12, // D28 PB_13, // D29 PB_14, // D30 PB_15, // D31 PC_0, // D32/A10 PC_1, // D33/A11 PC_4, // D34/A12 PC_5, // D35/A13 PC_6, // D36 PC_7, // D37 PC_8, // D38 PC_9, // D39 PC_10, // D40 PC_11, // D41 PC_12, // D42 PC_13, // D43 PC_14, // D44 PC_15, // D45 PD_0, // D46 PD_1, // D47 PD_2, // D48 PD_3, // D49 PD_4, // D50 PD_5, // D51 PD_6, // D52 PD_7, // D53 PD_8, // D54 PD_9, // D55 PD_10, // D56 PD_11, // D57 PD_12, // D58 PD_13, // D59 PD_14, // D60 PD_15, // D61 PE_0, // D62 PE_1, // D63 PE_2, // D64 PE_3, // D65 PE_4, // D66 PE_5, // D67 PE_6, // D68 PE_7, // D69 PE_8, // D70 PE_9, // D71 PE_10, // D72 PE_11, // D73 PE_12, // D74 PE_13, // D75 PE_14, // D76 PE_15, // D77 PF_0, // D78 PF_1, // D79 PF_2, // D80 PF_3, // D81/A14 PF_4, // D82/A15 PF_5, // D83/A16 PF_6, // D84/A17 PF_7, // D85/A18 PF_8, // D86/A19 PF_9, // D87/A20 PF_10, // D88/A21 PF_11, // D89/A22 PF_12, // D90/A23 PF_13, // D91/A24 PF_14, // D92/A25 PF_15, // D93 PG_0, // D94 PG_1, // D95 PG_2, // D96 PG_3, // D97 PG_4, // D98 PG_5, // D99 PG_6, // D100 PG_7, // D101 PG_8, // D102 PG_9, // D103 PG_10, // D104 PG_11, // D105 PG_12, // D106 PG_13, // D107 PG_14, // D108 PG_15, // D109 PH_0, // D110 PH_1, // D111 PC_2_C, // D112/A26 PC_3_C, // D113/A27 PC_2, // D114/A28 PC_3 // D115/A29 }; // Analog (Ax) pin number array const uint32_t analogInputPin[] = { 0, // A0, PA0 1, // A1, PA1 2, // A2, PA2 3, // A3, PA3 4, // A4, PA4 5, // A5, PA5 6, // A6, PA6 7, // A7, PA7 16, // A8, PB0 17, // A9, PB1 32, // A10, PC0 33, // A11, PC1 34, // A12, PC4 35, // A13, PC5 81, // A14, PF3 82, // A15, PF4 83, // A16, PF5 84, // A17, PF6 85, // A18, PF7 86, // A19, PF8 87, // A20, PF9 88, // A21, PF10 89, // A22, PF11 90, // A23, PF12 91, // A24, PF13 92, // A25, PF14 112, // A26, PC2_C 113, // A27, PC3_C 114, // A28, PC2 115 // A29, PC3 }; void MPU_Config(void) { MPU_Region_InitTypeDef MPU_InitStruct = {0}; /* Disables the MPU */ HAL_MPU_Disable(); /** Initializes and configures the Region and the memory to be protected */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER0; MPU_InitStruct.BaseAddress = 0x0; MPU_InitStruct.Size = MPU_REGION_SIZE_4GB; MPU_InitStruct.SubRegionDisable = 0x87; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); /* Enables the MPU */ HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); } /* * @brief System Clock Configuration * @param None * @retval None */ WEAK void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {}; MPU_Config(); /** Supply configuration update enable */ HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); /** Configure the main internal regulator output voltage */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0); while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48 | RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSI48State = RCC_HSI48_ON; // 48Mhz for USB RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 5; // 25Mhz / 5 = 5Mhz RCC_OscInitStruct.PLL.PLLN = 110; // 25Mhz / 5 * 110 = 550Mhz RCC_OscInitStruct.PLL.PLLP = 1; // 550Mhz / 1 = 550Mhz RCC_OscInitStruct.PLL.PLLQ = 10; // 550Mhz / 10 = 55Mhz RCC_OscInitStruct.PLL.PLLR = 10; // unused RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2; RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE; RCC_OscInitStruct.PLL.PLLFRACN = 0; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2 |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2; RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2; RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) { Error_Handler(); } PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB | RCC_PERIPHCLK_SDMMC | RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_LPUART1 | RCC_PERIPHCLK_USART16 | RCC_PERIPHCLK_USART234578 | RCC_PERIPHCLK_I2C123 | RCC_PERIPHCLK_I2C4 | RCC_PERIPHCLK_SPI123 | RCC_PERIPHCLK_SPI45 | RCC_PERIPHCLK_SPI6; /* HSI48 used for USB 48 Mhz */ /* PLL1 qclk also used for FMC, SDMMC, RNG, SAI */ /* PLL2 pclk is needed for adc max 80 Mhz (p,q,r same) */ /* PLL2 pclk also used for LP timers 2,3,4,5, SPI 1,2,3 */ /* PLL2 qclk is needed for uart, can, spi4,5,6 80 Mhz */ /* PLL3 r clk is needed for i2c 80 Mhz (p,q,r same) */ PeriphClkInitStruct.PLL2.PLL2M = 15; // M DIV 15 vco 25 / 15 ~ 1.667 Mhz PeriphClkInitStruct.PLL2.PLL2N = 96; // N MUL 96 PeriphClkInitStruct.PLL2.PLL2P = 2; // P div 2 PeriphClkInitStruct.PLL2.PLL2Q = 2; // Q div 2 PeriphClkInitStruct.PLL2.PLL2R = 2; // R div 2 // RCC_PLL1VCIRANGE_0 Clock range frequency between 1 and 2 MHz PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_0; PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOMEDIUM; PeriphClkInitStruct.PLL2.PLL2FRACN = 0; PeriphClkInitStruct.PLL3.PLL3M = 15; // M DIV 15 vco 25 / 15 ~ 1.667 Mhz PeriphClkInitStruct.PLL3.PLL3N = 96; // N MUL 96 PeriphClkInitStruct.PLL3.PLL3P = 2; // P div 2 PeriphClkInitStruct.PLL3.PLL3Q = 2; // Q div 2 PeriphClkInitStruct.PLL3.PLL3R = 2; // R div 2 // RCC_PLL1VCIRANGE_0 Clock range frequency between 1 and 2 MHz PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0; PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOMEDIUM; PeriphClkInitStruct.PLL3.PLL3FRACN = 0; // ADC from PLL2 pclk PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2; // USB from HSI48 PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48; // SDMMC from PLL1 qclk PeriphClkInitStruct.SdmmcClockSelection = 0; //PeriphClkInitStruct.SdmmcClockSelection = RCC_SDMMCCLKSOURCE_PLL; // LPUART from PLL2 qclk PeriphClkInitStruct.Lpuart1ClockSelection = 0; //PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PLL2; // USART from PLL2 qclk PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_PLL2; // USART from PLL2 qclk PeriphClkInitStruct.Usart234578ClockSelection = 0; //PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_PLL2; // I2C123 from PLL3 rclk PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_PLL3; // I2C4 from PLL3 rclk PeriphClkInitStruct.I2c4ClockSelection = 0; //PeriphClkInitStruct.I2c4ClockSelection = RCC_I2C4CLKSOURCE_PLL3; // SPI123 from PLL2 pclk PeriphClkInitStruct.Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL2; // SPI45 from PLL2 qclk PeriphClkInitStruct.Spi45ClockSelection = 0; //PeriphClkInitStruct.Spi45ClockSelection = RCC_SPI45CLKSOURCE_PLL2; // SPI6 from PLL2 qclk PeriphClkInitStruct.Spi6ClockSelection = 0; //PeriphClkInitStruct.Spi6ClockSelection = RCC_SPI6CLKSOURCE_PLL2; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } } #endif /* ARDUINO_GENERIC_* */