ฉันกำลังทำงานกับชุดค้นพบ STM32F303VC และฉันก็สับสนกับประสิทธิภาพของมันเล็กน้อย เพื่อทำความคุ้นเคยกับระบบฉันได้เขียนโปรแกรมง่าย ๆ เพียงเพื่อทดสอบความเร็วบิตของ MCU นี้ รหัสสามารถแยกย่อยได้ดังนี้:
- นาฬิกา HSI (8 MHz) เปิดอยู่;
- PLL เริ่มต้นด้วยกับ prescaler ที่ 16 เพื่อให้ได้ HSI / 2 * 16 = 64 MHz
- PLL ถูกกำหนดให้เป็น SYSCLK;
- SYSCLK ถูกตรวจสอบบน MCO pin (PA8) และหนึ่งในพิน (PE10) จะถูกสลับในลูปไม่สิ้นสุด
ซอร์สโค้ดสำหรับโปรแกรมนี้แสดงอยู่ด้านล่าง:
#include "stm32f3xx.h"
int main(void)
{
// Initialize the HSI:
RCC->CR |= RCC_CR_HSION;
while(!(RCC->CR&RCC_CR_HSIRDY));
// Initialize the LSI:
// RCC->CSR |= RCC_CSR_LSION;
// while(!(RCC->CSR & RCC_CSR_LSIRDY));
// PLL configuration:
RCC->CFGR &= ~RCC_CFGR_PLLSRC; // HSI / 2 selected as the PLL input clock.
RCC->CFGR |= RCC_CFGR_PLLMUL16; // HSI / 2 * 16 = 64 MHz
RCC->CR |= RCC_CR_PLLON; // Enable PLL
while(!(RCC->CR&RCC_CR_PLLRDY)); // Wait until PLL is ready
// Flash configuration:
FLASH->ACR |= FLASH_ACR_PRFTBE;
FLASH->ACR |= FLASH_ACR_LATENCY_1;
// Main clock output (MCO):
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
GPIOA->MODER |= GPIO_MODER_MODER8_1;
GPIOA->OTYPER &= ~GPIO_OTYPER_OT_8;
GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR8;
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8;
GPIOA->AFR[0] &= ~GPIO_AFRL_AFRL0;
// Output on the MCO pin:
//RCC->CFGR |= RCC_CFGR_MCO_HSI;
//RCC->CFGR |= RCC_CFGR_MCO_LSI;
//RCC->CFGR |= RCC_CFGR_MCO_PLL;
RCC->CFGR |= RCC_CFGR_MCO_SYSCLK;
// PLL as the system clock
RCC->CFGR &= ~RCC_CFGR_SW; // Clear the SW bits
RCC->CFGR |= RCC_CFGR_SW_PLL; //Select PLL as the system clock
while ((RCC->CFGR & RCC_CFGR_SWS_PLL) != RCC_CFGR_SWS_PLL); //Wait until PLL is used
// Bit-bang monitoring:
RCC->AHBENR |= RCC_AHBENR_GPIOEEN;
GPIOE->MODER |= GPIO_MODER_MODER10_0;
GPIOE->OTYPER &= ~GPIO_OTYPER_OT_10;
GPIOE->PUPDR &= ~GPIO_PUPDR_PUPDR10;
GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10;
while(1)
{
GPIOE->BSRRL |= GPIO_BSRR_BS_10;
GPIOE->BRR |= GPIO_BRR_BR_10;
}
}
โค้ดถูกคอมไพล์ด้วย CoIDE V2 พร้อมกับ GNU ARM Embedded Toolchain โดยใช้การเพิ่มประสิทธิภาพ -O1 สัญญาณบนหมุด PA8 (MCO) และ PE10 ที่ตรวจสอบด้วยออสซิลโลสโคปมีลักษณะดังนี้:
SYSCLK ดูเหมือนจะได้รับการกำหนดค่าอย่างถูกต้องเนื่องจาก MCO (เส้นโค้งสีส้ม) แสดงความผันผวนเกือบ 64 MHz (พิจารณาจากระยะขอบผิดพลาดของนาฬิกาภายใน) ส่วนที่แปลกสำหรับฉันคือพฤติกรรมของ PE10 (เส้นโค้งสีน้ำเงิน) ในอนันต์ขณะที่ (1) ลูปจะใช้เวลา 4 + 4 + 5 = 13 รอบนาฬิกาเพื่อดำเนินการขั้นตอนพื้นฐาน 3 ขั้นตอน (เช่นบิตเซ็ต / บิตรีเซ็ต / ส่งคืน) มันยิ่งแย่ลงในระดับการปรับให้เหมาะสมอื่น ๆ (เช่น -O2, -O3, ar -Os): เพิ่มรอบสัญญาณนาฬิกาจำนวนมากลงในส่วนที่ต่ำของสัญญาณนั่นคือระหว่างขอบที่ลดลงและเพิ่มขึ้นของ PE10 เพื่อแก้ไขสถานการณ์นี้)
พฤติกรรมนี้คาดหวังจาก MCU นี้หรือไม่ ฉันคิดว่างานง่าย ๆ เพียงตั้งค่าและรีเซ็ตบิตควรเร็วขึ้น 2-4 เท่า มีวิธีเร่งความเร็วของสิ่งต่างๆหรือไม่?