STM32F303VC 디스커버리 키트로 작업 중이며 성능에 약간 당황합니다. 시스템에 익숙해지기 위해이 MCU의 비트 뱅킹 속도를 테스트하는 매우 간단한 프로그램을 작성했습니다. 코드는 다음과 같이 분류 할 수 있습니다.
- HSI 클럭 (8MHz)이 켜져 있습니다.
- PLL은 16의 프리스케일러로 시작하여 HSI / 2 * 16 = 64 MHz를 달성한다;
- PLL은 SYSCLK로 지정됩니다.
- SYSCLK는 MCO 핀 (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;
}
}
코드는 -O1 최적화를 사용하여 GNU ARM 임베디드 툴체인과 함께 CoIDE V2로 컴파일되었습니다. 오실로스코프로 검사 한 핀 PA8 (MCO) 및 PE10의 신호는 다음과 같습니다.
MCO (주황색 곡선)가 거의 64MHz의 진동 (내부 클록의 오류 마진을 고려한)을 나타 내기 때문에 SYSCLK가 올바르게 구성된 것처럼 보입니다. 나에게 이상한 부분은 PE10 (파란색 곡선)의 동작입니다. 무한 while (1) 루프에서는 기본 3 단계 작업 (즉, 비트 세트 / 비트 리셋 / 리턴)을 수행하는 데 4 + 4 + 5 = 13 클록 사이클이 필요합니다. 다른 최적화 레벨 (예 : -O2, -O3, ar -Os)에서는 더욱 악화됩니다. 신호의 LOW 부분에 몇 가지 추가 클록 사이클이 추가됩니다 (예 : PE10의 하강 및 상승 에지 사이). 이 상황을 해결하기 위해).
이 동작은이 MCU에서 예상됩니까? 비트를 설정하고 재설정하는 것만 큼 간단한 작업을 2-4 배 더 빨라야한다고 생각합니다. 속도를 높일 수있는 방법이 있습니까?