Skip to content

Commit ecf2260

Browse files
authored
Merge pull request #1486 from fpistm/PeriphCLKFreq
library: enhance peripheral clock frequency management
2 parents a8f9f66 + 3d12d24 commit ecf2260

File tree

2 files changed

+251
-184
lines changed

2 files changed

+251
-184
lines changed

Diff for: libraries/SPI/src/utility/spi_com.c

+89-73
Original file line numberDiff line numberDiff line change
@@ -55,95 +55,111 @@ extern "C" {
5555
uint32_t spi_getClkFreqInst(SPI_TypeDef *spi_inst)
5656
{
5757
uint32_t spi_freq = SystemCoreClock;
58-
59-
#if defined(STM32F0xx) || defined(STM32G0xx)
60-
UNUSED(spi_inst);
61-
/* SPIx source CLK is PCKL1 */
62-
spi_freq = HAL_RCC_GetPCLK1Freq();
63-
#elif defined(STM32H7xx)
64-
/* Get source clock depending on SPI instance */
6558
if (spi_inst != NP) {
66-
switch ((uint32_t)spi_inst) {
67-
case (uint32_t)SPI1:
68-
case (uint32_t)SPI2:
69-
case (uint32_t)SPI3:
70-
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI123);
71-
break;
72-
case (uint32_t)SPI4:
73-
case (uint32_t)SPI5:
59+
#if defined(STM32F0xx) || defined(STM32G0xx)
60+
/* SPIx source CLK is PCKL1 */
61+
spi_freq = HAL_RCC_GetPCLK1Freq();
62+
#else
63+
#if defined(SPI1_BASE)
64+
if (spi_inst == SPI1) {
65+
#if defined(RCC_PERIPHCLK_SPI1) || defined(RCC_PERIPHCLK_SPI123)
66+
#ifdef RCC_PERIPHCLK_SPI1
67+
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI1);
68+
#else
69+
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI123);
70+
#endif
71+
if (spi_freq == 0)
72+
#endif
73+
{
74+
/* SPI1, SPI4, SPI5 and SPI6. Source CLK is PCKL2 */
7475
spi_freq = HAL_RCC_GetPCLK2Freq();
75-
break;
76-
case (uint32_t)SPI6:
77-
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI6);
78-
break;
79-
default:
80-
core_debug("CLK: SPI instance not set");
81-
break;
76+
}
8277
}
83-
}
84-
#elif defined(STM32MP1xx)
85-
/* Get source clock depending on SPI instance */
86-
if (spi_inst != NP) {
87-
switch ((uint32_t)spi_inst) {
88-
case (uint32_t)SPI1:
89-
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI1);
90-
break;
91-
case (uint32_t)SPI2:
92-
case (uint32_t)SPI3:
93-
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI23);
94-
break;
95-
case (uint32_t)SPI4:
96-
case (uint32_t)SPI5:
97-
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI45);
98-
break;
99-
case (uint32_t)SPI6:
100-
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI6);
101-
break;
102-
default:
103-
core_debug("CLK: SPI instance not set");
104-
break;
78+
#endif // SPI1_BASE
79+
#if defined(SPI2_BASE)
80+
if (spi_inst == SPI2) {
81+
#if defined(RCC_PERIPHCLK_SPI2) || defined(RCC_PERIPHCLK_SPI123) ||\
82+
defined(RCC_PERIPHCLK_SPI23)
83+
#ifdef RCC_PERIPHCLK_SPI2
84+
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI2);
85+
#elif defined(RCC_PERIPHCLK_SPI123)
86+
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI123);
87+
#else
88+
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI23);
89+
#endif
90+
if (spi_freq == 0)
91+
#endif
92+
{
93+
/* SPI_2 and SPI_3. Source CLK is PCKL1 */
94+
spi_freq = HAL_RCC_GetPCLK1Freq();
95+
}
10596
}
106-
}
97+
#endif // SPI2_BASE
98+
#if defined(SPI3_BASE)
99+
if (spi_inst == SPI3) {
100+
#if defined(RCC_PERIPHCLK_SPI3) || defined(RCC_PERIPHCLK_SPI123) ||\
101+
defined(RCC_PERIPHCLK_SPI23)
102+
#ifdef RCC_PERIPHCLK_SPI3
103+
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI3);
104+
#elif defined(RCC_PERIPHCLK_SPI123)
105+
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI123);
107106
#else
108-
if (spi_inst != NP) {
109-
/* Get source clock depending on SPI instance */
110-
switch ((uint32_t)spi_inst) {
111-
#if defined(SPI1_BASE) || defined(SPI4_BASE) || defined(SPI5_BASE) || defined(SPI6_BASE)
112-
/* Some STM32's (eg. STM32F302x8) have no SPI1, but do have SPI2/3. */
113-
#if defined SPI1_BASE
114-
case (uint32_t)SPI1:
107+
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI23);
115108
#endif
116-
#if defined SPI4_BASE
117-
case (uint32_t)SPI4:
109+
if (spi_freq == 0)
118110
#endif
119-
#if defined SPI5_BASE
120-
case (uint32_t)SPI5:
111+
{
112+
/* SPI_2 and SPI_3. Source CLK is PCKL1 */
113+
spi_freq = HAL_RCC_GetPCLK1Freq();
114+
}
115+
}
116+
#endif // SPI3_BASE
117+
#if defined(SPI4_BASE)
118+
if (spi_inst == SPI4) {
119+
#if defined(RCC_PERIPHCLK_SPI4) || defined(RCC_PERIPHCLK_SPI45)
120+
#ifdef RCC_PERIPHCLK_SPI4
121+
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI4);
122+
#else
123+
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI45);
121124
#endif
122-
#if defined SPI6_BASE
123-
case (uint32_t)SPI6:
125+
if (spi_freq == 0)
124126
#endif
127+
{
125128
/* SPI1, SPI4, SPI5 and SPI6. Source CLK is PCKL2 */
126129
spi_freq = HAL_RCC_GetPCLK2Freq();
127-
break;
128-
#endif /* SPI[1456]_BASE */
129-
130-
#if defined(SPI2_BASE) || defined (SPI3_BASE)
131-
#if defined SPI2_BASE
132-
case (uint32_t)SPI2:
130+
}
131+
}
132+
#endif // SPI4_BASE
133+
#if defined(SPI5_BASE)
134+
if (spi_inst == SPI5) {
135+
#if defined(RCC_PERIPHCLK_SPI5) || defined(RCC_PERIPHCLK_SPI45)
136+
#ifdef RCC_PERIPHCLK_SPI5
137+
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI5);
138+
#else
139+
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI45);
133140
#endif
134-
#if defined SPI3_BASE
135-
case (uint32_t)SPI3:
141+
if (spi_freq == 0)
136142
#endif
137-
/* SPI_2 and SPI_3. Source CLK is PCKL1 */
138-
spi_freq = HAL_RCC_GetPCLK1Freq();
139-
break;
143+
{
144+
/* SPI1, SPI4, SPI5 and SPI6. Source CLK is PCKL2 */
145+
spi_freq = HAL_RCC_GetPCLK2Freq();
146+
}
147+
}
148+
#endif // SPI5_BASE
149+
#if defined(SPI6_BASE)
150+
if (spi_inst == SPI6) {
151+
#if defined(RCC_PERIPHCLK_SPI6)
152+
spi_freq = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI6);
153+
if (spi_freq == 0)
140154
#endif
141-
default:
142-
core_debug("CLK: SPI instance not set");
143-
break;
155+
{
156+
/* SPI1, SPI4, SPI5 and SPI6. Source CLK is PCKL2 */
157+
spi_freq = HAL_RCC_GetPCLK2Freq();
158+
}
144159
}
145-
}
160+
#endif // SPI6_BASE
146161
#endif
162+
}
147163
return spi_freq;
148164
}
149165

0 commit comments

Comments
 (0)