Jump to content

    
Sign in to follow this  
Donker

Настройка тактирования STM32F030F4 через CMSIS

Recommended Posts

Как настроить тактирование STM32F030F4 через CMSIS на максимальные частоты от кварца 8мгц, как на скрине от CubeMX ?

Вот так работает не на 48мгц а на 8мгц (засекал по частоте срабатывания таймера TIM3 т.к. частоту 48мгц мерить нечем,

TIM3 срабатывает через 3сек а не через 0,5сек):

 

Спойлер

 

 


{//настройка тактирования
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
//************************************************************************************************************
RCC->CR |= RCC_CFGR_SW_HSE;  //сброс //RCC_CFGR_SW_HSE (0x00000001U) //!< HSE selected as system clock // 
	
/* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
/* Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
do
{
 HSEStatus = RCC->CR & RCC_CR_HSERDY;
 StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != 0x1000)); 

if ((RCC->CR & RCC_CR_HSERDY) != RESET) HSEStatus = (uint32_t)0x01;
else HSEStatus = (uint32_t)0x00;

if (HSEStatus == (uint32_t)0x01)
{
 /* Enable Prefetch Buffer and set Flash Latency */
 FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
 /* HCLK = SYSCLK:16 */
 RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
 /* PCLK = HCLK */
 RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;
 /* PLL configuration = HSE * 2 = 24 MHz */
 //RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
 RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMUL));  
 //RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL2); 
 RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR_PLLXTPRE_HSE_PREDIV_DIV1 | RCC_CFGR_PLLMUL6);
 /* Select HSE as system clock source */
 RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
 RCC->CFGR |= (uint32_t)RCC_CFGR_SW_HSE;

 /* Wait till PLL is used as system clock source */
 while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_HSE)
 {
 }
}
RCC->CR &= (uint32_t)~(0x00000001);
RCC->CR &= ~RCC_CR_PLLON;	
	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////	
}	

{//настройка таймеров
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//---------------------------------------------------TIM3----------------------------------------------------------------------
NVIC_SetPriority(TIM3_IRQn, 1); //Приоритет прерывания таймера 3
NVIC_EnableIRQ(TIM3_IRQn); //Разрешаем обработку прерывания от таймера 3

RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;//Включаем тактирование таймера TIM3
TIM3->PSC = 48000; //Настройка предделителя таймера (1ms при 48мгц)
TIM3->ARR = 500;  //Загружаем число миллисекунд в регистр автоперезагрузки
TIM3->DIER |= TIM_DIER_UIE; //Разрешаем прерывание при переполнении счетчика
TIM3->CR1 |= TIM_CR1_CEN;//Запускаем счет	
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
}

extern "C" void TIM3_IRQHandler(void)
{
///////////////////////////////////////////////////////////////////////////	
TIM3->SR &= ~TIM_SR_UIF; //Clean UIF Flag
	
bibip(50,2000);	//пищим пищалкой  50mc на 2000гц
	
///////////////////////////////////////////////////////////////////////////	
}	

 

 

Что не так?

 

 

Безымянный.png

Edited by Donker

Share this post


Link to post
Share on other sites

Я точно сам не знаю что я тут включаю, скопипастил откуда то.

На другом форуме ответили (http://forum.easyelectronics.ru/viewtopic.php?f=35&amp;t=38368&amp;p=590328#p590328)

, такой код заработал:

FLASH->ACR = FLASH_ACR_LATENCY;

// настраиваем систему тактирования
RCC->CR |= RCC_CR_HSEON;  //включаем генератор HSE
while(!(RCC->CR & RCC_CR_HSERDY));  //ожидание готовности HSE
RCC->CFGR2 = RCC_CFGR2_PREDIV_DIV1;  // предделитель для PLL
RCC->CFGR = RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR_PLLMUL6;  // настройка PLL
RCC->CR |= RCC_CR_PLLON;  //включаем PLL
while(!(RCC->CR & RCC_CR_PLLRDY));  //ожидание готовности PLL
RCC->CFGR |= RCC_CFGR_SW_PLL;  // настраиваем делители шин и переводим тактирование от PLL

 

Edited by Donker

Share this post


Link to post
Share on other sites
RCC->CFGR |= RCC_CFGR_SW_PLL;  // настраиваем делители шин и переводим тактирование от PLL

Так намного лучше. :prankster2: 

Чтобы узнать, что делаешь, надо читать Reference Manual. :to_become_senile:

Bits 1:0 SW[1:0]: System clock switch
Set and cleared by software to select the system clock source.
Set by hardware to force the HSI selection when leaving the Stop or Standby mode or in 
case of failure of the HSE oscillator used directly or indirectly as the system clock.
00: HSI oscillator selected as system clock
01: HSE oscillator selected as system clock
10: PLL selected as system clock
11: not allowed

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this