Acabo de comenzar con ARM y he hecho una pequeña tabla de ruptura con un STM32F030 en el paquete TSSOP20.
He cargado el siguiente programa que funciona cuando la velocidad de reloj del dispositivo está configurada a 8MHz y también a 24MHz:
#include "stm32f030xx.h"
void delay(unsigned int);
void delay(volatile unsigned int num) {
volatile unsigned int index = 0;
for(index = (num); index != 0; index--) {}
}
void initClock()
{
RCC_CR &= ~BIT24;
while( (RCC_CR & BIT25)); // wait for PLL ready to be cleared
FLASH_ACR |= BIT0;
FLASH_ACR &=~(BIT2 | BIT1);
FLASH_ACR |= BIT4;
RCC_CFGR &= ~(BIT21 | BIT20 | BIT19 | BIT18);
RCC_CFGR |= (BIT18); // set x3 multiplier (24mhz)
RCC_CR |= BIT24; // and turn the PLL back on again
RCC_CFGR |= BIT1; // set PLL as system clock source
}
void configPins() {
RCC_AHBENR |= BIT17; // Power up PORTA
GPIOA_MODER = BIT10; // make pin 5 (2x5=10) an output
}
int main() {
initClock();
configPins();
while(1) {
GPIOA_ODR |= BIT5; // pin 5 has an LED to ground via a resistor
delay(24000*12);
GPIOA_ODR &= ~BIT5;
delay(240000*12);
}
return 0;
}
Ahora, esto simplemente pulsa un LED conectado a PA5.
Cuando aumenté el PLL de x3 a x5, cambiando:
RCC_CFGR | = (BIT18);
a
RCC_CFGR | = (BIT18 | BIT19);
en lugar de pulsar más rápido, el LED permaneció encendido, aunque es probable que se encienda y apague muy rápido en lugar de permanecer encendido. Sin embargo, debería parpadear como antes, pero solo un poco más rápido (1,6 veces la velocidad anterior, según mis cálculos).
¿Hay algún extraño 'gotcha' en el que no haya pensado? Esta es la primera vez que utilizo chips ARM, así que estoy luchando para resolverlo. Gracias por cualquier ayuda.