@@ -126,9 +126,32 @@ static uint32_t calculateApb(rtc_cpu_freq_config_t * conf){
126
126
127
127
void esp_timer_impl_update_apb_freq (uint32_t apb_ticks_per_us ); //private in IDF
128
128
129
- bool setCpuFrequency (uint32_t cpu_freq_mhz ){
129
+ bool setCpuFrequencyMhz (uint32_t cpu_freq_mhz ){
130
130
rtc_cpu_freq_config_t conf , cconf ;
131
131
uint32_t capb , apb ;
132
+ //Get XTAL Frequency and calculate min CPU MHz
133
+ rtc_xtal_freq_t xtal = rtc_clk_xtal_freq_get ();
134
+ uint32_t min_cpu_mhz = 10 ;
135
+ if (xtal > RTC_XTAL_FREQ_AUTO ){
136
+ if (xtal < RTC_XTAL_FREQ_40M ) {
137
+ min_cpu_mhz = xtal / 2 ; //13Mhz for 26Mhz XTAL
138
+ if (cpu_freq_mhz <= xtal && cpu_freq_mhz != xtal && cpu_freq_mhz != (xtal /2 )){
139
+ log_e ("Bad frequency: %u MHz! Options are: 240, 160, 80, %u and %u MHz" , cpu_freq_mhz , xtal , xtal /2 );
140
+ return false;
141
+ }
142
+ } else if (cpu_freq_mhz <= xtal && cpu_freq_mhz != xtal && cpu_freq_mhz != (xtal /2 ) && cpu_freq_mhz != (xtal /4 )){
143
+ log_e ("Bad frequency: %u MHz! Options are: 240, 160, 80, %u, %u and %u MHz" , cpu_freq_mhz , xtal , xtal /2 , xtal /4 );
144
+ return false;
145
+ }
146
+ }
147
+ if (cpu_freq_mhz > xtal && cpu_freq_mhz != 240 && cpu_freq_mhz != 160 && cpu_freq_mhz != 80 ){
148
+ if (xtal >= RTC_XTAL_FREQ_40M ){
149
+ log_e ("Bad frequency: %u MHz! Options are: 240, 160, 80, %u, %u and %u MHz" , cpu_freq_mhz , xtal , xtal /2 , xtal /4 );
150
+ } else {
151
+ log_e ("Bad frequency: %u MHz! Options are: 240, 160, 80, %u and %u MHz" , cpu_freq_mhz , xtal , xtal /2 );
152
+ }
153
+ return false;
154
+ }
132
155
//Get current CPU clock configuration
133
156
rtc_clk_cpu_freq_get_config (& cconf );
134
157
//return if frequency has not changed
@@ -144,7 +167,7 @@ bool setCpuFrequency(uint32_t cpu_freq_mhz){
144
167
capb = calculateApb (& cconf );
145
168
//New APB
146
169
apb = calculateApb (& conf );
147
- log_i ("%s: %u / %u = %u Mhz, APB: %u Hz" , (conf .source == RTC_CPU_FREQ_SRC_PLL )?"PLL" :((conf .source == RTC_CPU_FREQ_SRC_APLL )?"APLL" :((conf .source == RTC_CPU_FREQ_SRC_XTAL )?"XTAL" :"8M" )), conf .source_freq_mhz , conf .div , conf .freq_mhz , apb );
170
+ log_d ("%s: %u / %u = %u Mhz, APB: %u Hz" , (conf .source == RTC_CPU_FREQ_SRC_PLL )?"PLL" :((conf .source == RTC_CPU_FREQ_SRC_APLL )?"APLL" :((conf .source == RTC_CPU_FREQ_SRC_XTAL )?"XTAL" :"8M" )), conf .source_freq_mhz , conf .div , conf .freq_mhz , apb );
148
171
//Call peripheral functions before the APB change
149
172
if (apb_change_callbacks ){
150
173
triggerApbChangeCallback (APB_BEFORE_CHANGE , capb , apb );
@@ -171,12 +194,16 @@ bool setCpuFrequency(uint32_t cpu_freq_mhz){
171
194
return true;
172
195
}
173
196
174
- uint32_t getCpuFrequency (){
197
+ uint32_t getCpuFrequencyMhz (){
175
198
rtc_cpu_freq_config_t conf ;
176
199
rtc_clk_cpu_freq_get_config (& conf );
177
200
return conf .freq_mhz ;
178
201
}
179
202
203
+ uint32_t getXtalFrequencyMhz (){
204
+ return rtc_clk_xtal_freq_get ();
205
+ }
206
+
180
207
uint32_t getApbFrequency (){
181
208
rtc_cpu_freq_config_t conf ;
182
209
rtc_clk_cpu_freq_get_config (& conf );
0 commit comments