[英]ESP32 changing clock frequency (C)
我正在使用 C(使用 ESP32 的工具鏈)對 ESP32 進行編程,我正在嘗試更改 ESP32 的時鍾頻率,但我不確定我是否做對了(我使用了文檔https://docs .espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/power_management.html#_CPPv418esp_pm_lock_type_t但我沒有找到任何代碼示例)。 我認為我已經正確完成了程序部分,但我認為它仍然不起作用。 有沒有辦法弄清楚設置的時鍾頻率? 我也不確定文檔中的這一部分:“ESP_PM_CPU_FREQ_MAX Require CPU frequency to be at the maximum value set via esp_pm_configure. Argument is unused and should be set to 0.” 最后一部分是否意味着我不應該使用這個 makro?
最后但同樣重要的是,我不明白我是否必須更改我的 sdkconfig 或者是否有辦法在 C 中完成所有操作?
我必須測量 ns 區域的項目時間,因此我需要 esp32 的最大性能。
代碼:
// ____________________________________________________________________________
esp_pm_config_esp32_t config_clock_struct;
// ____________________________________________________________________________
esp_pm_config_esp32_t* pointer_config_clock = &config_clock_struct;
// ____________________________________________________________________________
esp_pm_lock_handle_t handle;
void config_clock(int max_cpu_freq, int min_cpu_freq, bool light_sleep_enable,
esp_pm_config_esp32_t* pointer_config_clock) {
pointer_config_clock->max_freq_mhz = max_cpu_freq;
pointer_config_clock->min_freq_mhz = min_cpu_freq;
pointer_config_clock->light_sleep_enable = light_sleep_enable;
esp_err_t status = esp_pm_configure(pointer_config_clock);
if (status == ESP_OK) {
return;
} else if (status == ESP_ERR_INVALID_ARG) {
printf("Error %d: Configuration values aren't correct.", status);
exit(1);
} else if (status == ESP_ERR_NOT_SUPPORTED) {
printf("Error %d: Combination of values aren't supported or CONFIG_PM_ENABLE isn't enabled in sdkconfig.",
status);
exit(1);
}
}
// ____________________________________________________________________________
void init_clock(int max_cpu_freq, int min_cpu_freq, bool light_sleep_enable,
esp_pm_lock_type_t lock_type, int arg, const char* name,
esp_pm_config_esp32_t* pointer_config_clock, esp_pm_lock_handle_t* out_handle) {
config_clock(max_cpu_freq, min_cpu_freq, light_sleep_enable, pointer_config_clock);
esp_err_t status = esp_pm_lock_create(lock_type, arg, name, out_handle);
if (status == ESP_OK) {
return;
} else if (status == ESP_ERR_NO_MEM) {
printf("Error %d: Struct can't allocated.", status);
} else if (status == ESP_ERR_INVALID_ARG) {
printf("Error: %d: Invalid arguments.", status);
} else if(ESP_ERR_NOT_SUPPORTED == status) {
printf("Error %d: config pm is not enabled in sdkconfig.", status);
}
}
以及主function的相關部分:
#define MAX_FREQUENCY 240
#define MIN_FREQUENCY 40
#define DISABLE_SLEEP 0
init_clock(MAX_FREQUENCY, MIN_FREQUENCY, DISABLE_SLEEP, ESP_PM_CPU_FREQ_MAX, ESP_PM_CPU_FREQ_MAX,
"measure mode", pointer_config_clock, &handle);
esp_err_t status_acquire = esp_pm_lock_acquire(handle);
當改變 MCU 時鍾頻率時,它會改變所有與頻率相關的總線。 例如 UART 和 I2C。 這里有一個巧妙的技巧來演示時鍾頻率的變化如何影響serial.print
output。請注意,您計算的串行波特率因每個時鍾速度設置而異。
//function takes the following frequencies as valid values:
// 240, 160, 80 <<< For all XTAL types
// 40, 20, 10 <<< For 40MHz XTAL
// 26, 13 <<< For 26MHz XTAL
// 24, 12 <<< For 24MHz XTAL
// 32Bit MCUs . change for 16bit
uint32_t Freq = 0;
int MCU_FREQUENCY_SERIAL_SPEED=115200;
int SERIAL_DEFAULT_SPEED = 115200;
void changeMcuFreq(int Freq){
delay(500);
setCpuFrequencyMhz(Freq);
changeSerialBaudRate(Freq);
delay(500);
}
void serialMcuFreq(){
Freq = getCpuFrequencyMhz();
Serial.print("CPU Freq = ");
Serial.print(Freq);
Serial.println(" MHz");
Freq = getXtalFrequencyMhz();
Serial.print("XTAL Freq = ");
Serial.print(Freq);
Serial.println(" MHz");
Freq = getApbFrequency();
Serial.print("APB Freq = ");
Serial.print(Freq/1000000);
Serial.println(" MHz");
}
void changeSerialBaudRate(uint32_t Freq){
if (Freq < 80) {
MCU_FREQUENCY_SERIAL_SPEED = 80 / Freq * SERIAL_DEFAULT_SPEED;
}
else {
MCU_FREQUENCY_SERIAL_SPEED = SERIAL_DEFAULT_SPEED;
}
Serial.end();
delay(1000);
Serial.begin(MCU_FREQUENCY_SERIAL_SPEED);
delay(1000);
Serial.print("\nSerial Baud Rate Speed is ");
Serial.println(MCU_FREQUENCY_SERIAL_SPEED);
}
void setup()
{
Serial.begin(MCU_FREQUENCY_SERIAL_SPEED);
}
void loop()
{
changeMcuFreq(240);
serialMcuFreq();
delay(2000);
changeMcuFreq(160);
serialMcuFreq();
delay(2000);
changeMcuFreq(80);
serialMcuFreq();
delay(2000);
changeMcuFreq(40);
serialMcuFreq();
delay(2000);
changeMcuFreq(20);
serialMcuFreq();
delay(2000);
changeMcuFreq(10);
serialMcuFreq();
delay(2000);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.