我正在使用STM32F303VC 发现套件,但对其性能感到有些困惑。为了熟悉该系统,我编写了一个非常简单的程序,只是为了测试该MCU的位速。该代码可以分解如下:
- HSI时钟(8 MHz)已打开;
- 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引脚上的信号如下所示:
SYSCLK似乎配置正确,因为MCO(橙色曲线)显示出近64 MHz的振荡(考虑到内部时钟的误差容限)。对我来说,奇怪的是PE10上的行为(蓝色曲线)。在无限while(1)循环中,需要4 + 4 + 5 = 13个时钟周期来执行基本的3步操作(即位设置/位复位/返回)。在其他优化级别(例如-O2,-O3,ar -Os)上,情况甚至更糟:几个额外的时钟周期被添加到信号的LOW部分,即在PE10的下降沿和上升沿之间(以某种方式启用LSI纠正这种情况)。
此MCU有这种现象吗?我可以想象像设置和重置这样简单的任务应该快2-4倍。有办法加快速度吗?