Skip to content

Commit 6728e7e

Browse files
committed
Add clock_configure_mhz
Trades off accuracy (only gets to +/- 1MHz) for reduced code size as it doesn't need 64 bit division
1 parent c7ff325 commit 6728e7e

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

src/rp2_common/hardware_clocks/clocks.c

+14
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,20 @@ bool clock_configure(clock_handle_t clock, uint32_t src, uint32_t auxsrc, uint32
123123
return true;
124124
}
125125

126+
bool clock_configure_mhz(clock_handle_t clock, uint32_t src, uint32_t auxsrc, uint16_t src_freq_mhz, uint16_t freq_mhz) {
127+
assert(src_freq_mhz >= freq_mhz);
128+
129+
if (freq_mhz > src_freq_mhz)
130+
return false;
131+
132+
uint32_t div = (uint32_t)((((uint32_t) src_freq_mhz) << CLOCKS_CLK_GPOUT0_DIV_INT_LSB) / freq_mhz);
133+
uint32_t actual_freq = (uint32_t) ((((uint32_t) src_freq_mhz) << CLOCKS_CLK_GPOUT0_DIV_INT_LSB) / div) * MHZ;
134+
135+
clock_configure_internal(clock, src, auxsrc, actual_freq, div);
136+
// Store the configured frequency
137+
return true;
138+
}
139+
126140
void clock_configure_int_divider(clock_handle_t clock, uint32_t src, uint32_t auxsrc, uint32_t src_freq, uint32_t int_divider) {
127141
clock_configure_internal(clock, src, auxsrc, src_freq / int_divider, int_divider << CLOCKS_CLK_GPOUT0_DIV_INT_LSB);
128142
}

src/rp2_common/hardware_clocks/include/hardware/clocks.h

+16
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,22 @@ typedef clock_num_t clock_handle_t;
318318
*/
319319
bool clock_configure(clock_handle_t clock, uint32_t src, uint32_t auxsrc, uint32_t src_freq, uint32_t freq);
320320

321+
/*! \brief Configure the specified clock to +/- 1MHz
322+
* \ingroup hardware_clocks
323+
*
324+
* This function differs from clock_configure in that it does not configure the clocks as accurately,
325+
* but therefore doesn't need to bring in 64-bit division functions, reducing the code size.
326+
*
327+
* See the tables in the description for details on the possible values for clock sources.
328+
*
329+
* \param clock The clock to configure
330+
* \param src The main clock source, can be 0.
331+
* \param auxsrc The auxiliary clock source, which depends on which clock is being set. Can be 0
332+
* \param src_freq_mhz Frequency of the input clock source in MHz
333+
* \param freq_mhz Requested frequency in MHz
334+
*/
335+
bool clock_configure_mhz(clock_handle_t clock, uint32_t src, uint32_t auxsrc, uint16_t src_freq_mhz, uint16_t freq_mhz);
336+
321337
/*! \brief Configure the specified clock to use the undivided input source
322338
* \ingroup hardware_clocks
323339
*

0 commit comments

Comments
 (0)