Estoy usando la configuración predeterminada (según UM1061, sección RCC) para configurar un SMT32F215RG para que funcione con el reloj de la CPU de 120MHZ. Aquí están mis configuraciones:
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M 25 /* For HSE value equal to 25 MHz */
#define PLL_N 240
/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P 2
/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */
#define PLL_Q 5
/* In this example:
PLL_VCO = 240 MHz
SYSCLK = 120 MHz
*/
/***************************************************************/
/* PLL (clocked by HSE) used as System clock(SYSCLK) source */
/***************************************************************/
__IO uint32_t StartUpCounter = 0, HSEStartUpStatus = 0;
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if (HSEStartUpStatus == SUCCESS)
{
/* Flash 3 wait state, prefetch buffer and cache ON */
FLASH_SetLatency(FLASH_Latency_3);
FLASH_PrefetchBufferCmd(ENABLE);
FLASH_InstructionCacheCmd(ENABLE);
FLASH_DataCacheCmd(ENABLE);
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK/2 */
RCC_PCLK2Config(RCC_HCLK_Div2);
/* PCLK1 = HCLK/4 */
RCC_PCLK1Config(RCC_HCLK_Div4);
/* Configure the main PLL clock to 120 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE, PLL_M, PLL_N, PLL_P, PLL_Q);
/* Enable the main PLL */
RCC_PLLCmd(ENABLE);
/* Wait till the main PLL is ready */
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{}
/* Select the main PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till the main PLL is used as system clock source */
while (RCC_GetSYSCLKSource() != RCC_CFGR_SWS_PLL)
{}
}
else
{ /* If HSE fails to start-up, user can add here some code
to deal with this error */
}
para probar eso, estoy usando un LED parpadeante (en modo de agrupación), VDD es 3.3 voltios y amp; Yo uso un cuarzo de 25 MHZ.
El problema es que el programa NO funciona en absoluto o comienza a funcionar & se detiene después de uno o dos segundos.
Utilicé un depurador para rastrearlo & Encontré que ocurre una falla dura & la ejecución entra en el bucle infinito HardFault_Handler de startup_stm32fxx.s
Revisé el tablero varias veces y amp; Estoy seguro de que no tiene ningún problema, también el mismo programa funciona bien cuando disminuyo el reloj de la CPU a un valor más bajo (al cambiar los parámetros de PLL, por ejemplo, establecer PLL_P = 4).
Parece que todas las frecuencias por encima de 100MHZ causan algún tipo de problema. Supuse que podría estar relacionado con la latencia del acceso a Flash, pero de acuerdo con la hoja de datos con 3.3V de VDD, debe funcionar con 3 estados de espera & Cambiar los ciclos de espera no me ayudó.