Skip to content

Commit 2d1fd0e

Browse files
committed
added set_psram_clock
1 parent 2b69ca9 commit 2d1fd0e

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

teensy4/clockspeed.c

+34
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,37 @@ uint32_t set_arm_clock(uint32_t frequency)
176176
return frequency;
177177
}
178178

179+
#ifdef ARDUINO_TEENSY41
180+
void set_psram_clock(int speed_mhz) {
181+
// What clocks exist:
182+
static const int flexspio2_clock_speeds[] = { 396, 720, 665, 528 };
183+
184+
// See what the closest setting might be:
185+
uint8_t clk_save = 0;
186+
uint8_t divider_save =0;
187+
int min_delta = speed_mhz;
188+
for (uint8_t clk = 0; clk < 4; clk++) {
189+
uint8_t divider = (flexspio2_clock_speeds[clk] + (speed_mhz / 2)) / speed_mhz;
190+
int delta = abs(speed_mhz - flexspio2_clock_speeds[clk] / divider);
191+
if ((delta < min_delta) && (divider < 8)) {
192+
min_delta = delta;
193+
clk_save = clk;
194+
divider_save = divider;
195+
}
196+
}
197+
198+
// first turn off FLEXSPI2
199+
CCM_CCGR7 &= ~CCM_CCGR7_FLEXSPI2(CCM_CCGR_ON);
200+
201+
divider_save--; // 0 biased.
202+
//Serial.printf("Update FLEXSPI2 speed: %u clk:%u div:%u Actual:%u\n", speed_mhz, clk_save, divider_save,
203+
// flexspio2_clock_speeds[clk_save]/ (divider_save + 1));
204+
205+
// Set the clock settings.
206+
CCM_CBCMR = (CCM_CBCMR & ~(CCM_CBCMR_FLEXSPI2_PODF_MASK | CCM_CBCMR_FLEXSPI2_CLK_SEL_MASK))
207+
| CCM_CBCMR_FLEXSPI2_PODF(divider_save) | CCM_CBCMR_FLEXSPI2_CLK_SEL(clk_save);
208+
209+
// Turn FlexSPI2 clock back on
210+
CCM_CCGR7 |= CCM_CCGR7_FLEXSPI2(CCM_CCGR_ON);
211+
}
212+
#endif

0 commit comments

Comments
 (0)