STM32F0 in clock

Procesor 072 skušam spraviti na 48MHz, vendar ko dal PLL mnogokratnik (PLLMUL) na 12 tu in tam dobim HardFault, na 11 še deluje. Izvor za PLL (PLLSRC) je privzet (HSI/2), torej 4 MHz. CubeMX pri takšni nastavitvi ne javi napake, čeprav pa ravno nima na izbiro te možnosti HSI/2 kot jo ponuja register.
Če namesto 11 dam 12, mi LED več ne utripa. Včasih se ustavi pri nastavljanju OSPEEDR. Včasih pa gre naprej in utripa.
Celotna koda s katero se igram je
RCC->CFGR &= ~RCC_CFGR_PLLSRC;
RCC->CFGR &= ~RCC_CFGR_PLLMUL;
RCC->CFGR |= RCC_CFGR_PLLMUL11;
RCC->CR |= RCC_CR_PLLON;
while (!(RCC->CR & RCC_CR_PLLRDY));
RCC->CFGR |= RCC_CFGR_SW_PLL;
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL);
Če namesto 11 dam 12, mi LED več ne utripa. Včasih se ustavi pri nastavljanju OSPEEDR. Včasih pa gre naprej in utripa.
Celotna koda s katero se igram je
- Koda: Izberi vse
#include <stdint.h>
#include "cmsis/stm32f072xb.h"
void on(void) {
GPIOA->BSRR = GPIO_BSRR_BS_5;
}
void off(void) {
GPIOA->BSRR = GPIO_BSRR_BR_5;
}
static void _delay_ms(uint16_t ms)
{
TIM6->ARR = ms - 1;
TIM6->CR1 = TIM_CR1_CEN;
while(!(TIM6->SR & TIM_SR_UIF));
TIM6->CR1 &= ~TIM_CR1_CEN;
TIM6->SR &= ~TIM_SR_UIF;
}
void _clock_pll48mhz(void)
{
RCC->CFGR &= ~RCC_CFGR_SW;
RCC->CR &= ~RCC_CR_PLLON;
RCC->CFGR &= ~RCC_CFGR_PLLSRC;
RCC->CFGR &= ~RCC_CFGR_PLLMUL;
RCC->CFGR |= RCC_CFGR_PLLMUL12;
RCC->CR |= RCC_CR_PLLON;
while (!(RCC->CR & RCC_CR_PLLRDY));
RCC->CFGR |= RCC_CFGR_SW_PLL;
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL);
//RCC->CFGR |= RCC_CFGR_HPRE_DIV2;
FLASH->ACR = FLASH_ACR_LATENCY;
}
int main(void)
{
_clock_pll48mhz();
RCC->APB1ENR = RCC_APB1ENR_TIM6EN;
TIM6->PSC = 7999;
RCC->AHBENR = RCC_AHBENR_GPIOAEN;
GPIOA->MODER &= ~GPIO_MODER_MODER5;
GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR5;
GPIOA->MODER |= GPIO_MODER_MODER5_0;
while (1) {
on();
_delay_ms(1000);
off();
_delay_ms(1000);
}
return 0;
}