You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
250 lines
7.0 KiB
C++
250 lines
7.0 KiB
C++
/*
|
|
*******************************************************************************
|
|
* Copyright (c) 2019, 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
|
|
*
|
|
*******************************************************************************
|
|
*/
|
|
|
|
#include "pins_arduino.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
// Digital PinName array
|
|
const PinName digitalPin[] = {
|
|
PA_0, //D0
|
|
PA_1, //D1
|
|
PA_2, //D2
|
|
PA_3, //D3
|
|
PA_4, //D4
|
|
PA_5, //D5
|
|
PA_6, //D6
|
|
PA_7, //D7
|
|
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
|
|
PB_1, //D17
|
|
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
|
|
PC_1, //D33
|
|
PC_2, //D34
|
|
PC_3, //D35
|
|
PC_4, //D36
|
|
PC_5, //D37
|
|
PC_6, //D38
|
|
PC_7, //D39
|
|
PC_8, //D40
|
|
PC_9, //D41
|
|
PC_10, //D42
|
|
PC_11, //D43
|
|
PC_12, //D44
|
|
PC_13, //D45
|
|
PC_14, //D46
|
|
PC_15, //D47
|
|
|
|
PD_0, //D48
|
|
PD_1, //D49
|
|
PD_2, //D50
|
|
PD_3, //D51
|
|
PD_4, //D52
|
|
PD_5, //D53
|
|
PD_6, //D54
|
|
PD_7, //D55
|
|
PD_8, //D56
|
|
PD_9, //D57
|
|
PD_10, //D58
|
|
PD_11, //D59
|
|
PD_12, //D60
|
|
PD_13, //D61
|
|
PD_14, //D62
|
|
PD_15, //D63
|
|
|
|
PE_0, //D64
|
|
PE_1, //D65
|
|
PE_2, //D66
|
|
PE_3, //D67
|
|
PE_4, //D68
|
|
PE_5, //D69
|
|
PE_6, //D70
|
|
PE_7, //D71
|
|
PE_8, //D72
|
|
PE_9, //D73
|
|
PE_10, //D74
|
|
PE_11, //D75
|
|
PE_12, //D76
|
|
PE_13, //D77
|
|
PE_14, //D78
|
|
PE_15, //D79
|
|
};
|
|
|
|
// 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, PC2
|
|
35, // A13, PC3
|
|
36, // A14, PC4
|
|
37, // A15, PC5
|
|
};
|
|
|
|
/******************************************************************************/
|
|
/* PLL (clocked by HSE) used as System clock source */
|
|
/******************************************************************************/
|
|
static bool SetSysClock_PLL_HSE(bool bypass)
|
|
{
|
|
RCC_OscInitTypeDef RCC_OscInitStruct = {};
|
|
RCC_ClkInitTypeDef RCC_ClkInitStruct = {};
|
|
RCC_PeriphCLKInitTypeDef PeriphClkInit = {};
|
|
bool ret = false;
|
|
|
|
// Initializes the CPU, AHB and APB busses clocks
|
|
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
|
|
if (bypass == false) {
|
|
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
|
|
} else {
|
|
RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
|
|
}
|
|
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
|
|
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
|
|
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
|
|
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
|
|
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // 8Mhz x 9 = 72MHz
|
|
|
|
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) {
|
|
// Initializes the CPU, AHB and APB busses clocks
|
|
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
|
|
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
|
|
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
|
|
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
|
|
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
|
|
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
|
|
|
|
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) == HAL_OK) {
|
|
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_USB;
|
|
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
|
|
PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5; // 72/1.5 = 48MHz
|
|
#ifndef USBCON
|
|
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
|
|
#endif
|
|
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) == HAL_OK) {
|
|
ret = true;
|
|
}
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
/******************************************************************************/
|
|
/* PLL (clocked by HSI) used as System clock source (64MHz max) */
|
|
/******************************************************************************/
|
|
bool SetSysClock_PLL_HSI(void)
|
|
{
|
|
RCC_OscInitTypeDef RCC_OscInitStruct = {};
|
|
RCC_ClkInitTypeDef RCC_ClkInitStruct = {};
|
|
RCC_PeriphCLKInitTypeDef PeriphClkInit = {};
|
|
bool ret = false;
|
|
|
|
// Initializes the CPU, AHB and APB busses clocks
|
|
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE;
|
|
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
|
|
RCC_OscInitStruct.HSEState = RCC_HSE_OFF;
|
|
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
|
|
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
|
|
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2; // 4 MHz
|
|
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12; // 48 MHz
|
|
#ifndef USBCON
|
|
// When the HSI is used as a PLL clock input, the maximum
|
|
// system clock frequency that can be achieved is 64 MHz.
|
|
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16; // 64 MHz, stay close to 72 for delay()
|
|
#endif
|
|
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) == HAL_OK) {
|
|
// Initializes the CPU, AHB and APB busses clocks
|
|
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
|
|
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
|
|
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
|
|
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
|
|
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
|
|
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
|
|
|
|
// FLASH_LATENCY_1 may cause boot loops
|
|
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) == HAL_OK) {
|
|
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC | RCC_PERIPHCLK_USB;
|
|
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV4;
|
|
PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL; // requires 48 MHz
|
|
#ifndef USBCON
|
|
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;// No USB, RTC nor I2S
|
|
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6; // 2 4 6 8
|
|
#endif
|
|
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) == HAL_OK) {
|
|
ret = true;
|
|
}
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void SystemClock_Config(void)
|
|
{
|
|
/*
|
|
* If HSE_VALUE is not 8MHz and you want use it, then:
|
|
* - Redefine HSE_VALUE to the correct HSE_VALUE
|
|
* - Redefine SystemClock_Config() with the correct settings
|
|
*/
|
|
#if HSE_VALUE == 8000000U
|
|
// 1- Try to start with HSE and external 8MHz xtal
|
|
if (SetSysClock_PLL_HSE(false) == false) {
|
|
// 2- If fail try to start with HSE and external clock
|
|
if (SetSysClock_PLL_HSE(true) == false) {
|
|
#endif
|
|
// 3- If fail start with HSI clock
|
|
if (SetSysClock_PLL_HSI() == false) {
|
|
Error_Handler();
|
|
}
|
|
#if HSE_VALUE == 8000000U
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|