Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с тактовой частотой.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Jenya7
Привет всем.
Выставляю тактовую частоту -72Мгц.
CODE
void SysClockInit(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;

/* Configuration SYSCLK, HCLK, PCLK2 и PCLK1 ---------------------------*/
/* Switch on HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);

/* Wait for HSE ready bit or timeout*/
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while( (HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut));

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

/* if HSE started good */
if ( HSEStatus == (uint32_t)0x01)
{
/* Включаем буфер предвыборки FLASH */
FLASH->ACR |= FLASH_ACR_PRFTBE;

/* Конфигурируем Flash на 2 цикла ожидания */
/* Это нужно потому, что Flash не может работать на высокой частоте */
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;

/* HCLK = SYSCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

/* PCLK2 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

/* PCLK1 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

/* Конфигурируем множитель PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
/* При условии, что кварц на 8МГц! */
/* RCC_CFGR_PLLMULL9 - множитель на 9. Если нужна другая частота, не 72МГц */
/* то выбираем другой множитель. */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);

/* Switch on PLL */
RCC->CR |= RCC_CR_PLLON;

/* wait for PLL ready bit */
while((RCC->CR & RCC_CR_PLLRDY) == 0) { }

/* choose PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;

/* Ожидаем, пока PLL выберется как источник системной частоты */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) { }
}
else
{
/* All is bad... HSE didn't turn on... Something wrong...
If we are here our source is HSI! */
}

//return HSEStatus;
}


Настраиваю MCO Pin чтобы видеть частоту.

CODE
void McoPinInit(void)
{
//RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Подаем тактирование на порт

GPIOA->CRH &= ~GPIO_CRH_CNF8; // Сбрасываем биты CNF для бита 8. Режим 00 - Push-Pull
GPIOA->CRH |= GPIO_CRH_CNF8_1; // Ставим режим для 8 го бита режим CNF = 10 (альтернативная функция, Push-Pull)

GPIOA->CRH &=~GPIO_CRH_MODE8; // Сбрасываем биты MODE для бита 8
GPIOA->CRH |= GPIO_CRH_MODE8_1 | GPIO_CRH_MODE8_0; // Выставляем бит MODE для пятого пина. Режим MODE11 = Max Speed 50MHz

RCC->CFGR &=~(RCC_CFGR_MCO); // Обнуляем MCO
//RCC->CFGR |=RCC_CFGR_MCO_PLL; // Выставлем для MCO сигнал с PLL/2
RCC->CFGR |=RCC_CFGR_MCO_SYSCLK; // Выставляем для МСО сигнал с SYSCLK
}


Вижу на скопе частоту 24Мгц вместо 72Мгц. Что я делаю не так?
Golikov A.
как минимум, как следует из комментариев вы пин на 50 МГц настроили, как вы на нем 72 увидеть хотите?
A.Lex
В доке написано: I/Os on APB2 with up to 18 MHz toggling speed
Jenya7
Я понял. Попробую подрезать частоту.
Jenya7
изменил опцию MCO пина - чтоб выдавал PLL/2
Код
RCC->CFGR    |=RCC_CFGR_MCO_PLL;


на скопе вижу 12Мгц т.е. 24/2. что то не так, а что не могу понять.
Jenya7
я так понимаю, что STM32F103RBT6 это Medium-density performance line.
в stm32f10x.h выставляю
Код
#define STM32F10X_MD  /*!< STM32F10X_MD: STM32 Medium density devices */

это приводит нас к #define SYSCLK_FREQ_72MHz 72000000 так как в system_stm32f10x.h определено
Код
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
#define SYSCLK_FREQ_24MHz  24000000  //original
  //#define SYSCLK_FREQ_72MHz  72000000
#else
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz  24000000 */
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
#define SYSCLK_FREQ_72MHz  72000000
#endif


но SystemInit почему то приводит нас к SetSysClockTo24() вместо SetSysClockTo72() но даже при всем при этом моя функция SysClockInit()
должна переписать частоту по идее.

ViKo
Цитата(Jenya7 @ Oct 22 2013, 10:21) *
но SystemInit почему то приводит нас к SetSysClockTo24() вместо SetSysClockTo72() но даже при всем при этом моя функция SysClockInit()
должна переписать частоту по идее.

А вы свою функцию вызываете?
Jenya7
Цитата(ViKo @ Oct 22 2013, 14:20) *
А вы свою функцию вызываете?


конечно
Код
int main(void)
{
  SysClockInit();  //первым делом натроить частоту
  PeriphClockInit();
  UsartInit();
  DWT_Init();
  GpioInit();
  McoPinInit();
   while(1)
  {
  }
}
ViKo
А на выводах резонатора генерация есть?
Jenya7
Цитата(ViKo @ Oct 22 2013, 15:59) *
А на выводах резонатора генерация есть?

вопрос не в бровь а в глаз, демо борд выполнен очень добротно, но скопом все равно надо ткнуть.
Jenya7
посмотрел частоту на кварце - красивые 8 Мгц, в чем проблема не понимаю.
ViKo
В отладчике Keil можно увидеть состояние RCC.
Jenya7
Цитата(ViKo @ Oct 23 2013, 11:54) *
В отладчике Keil можно увидеть состояние RCC.

я пишу в IAR
antis
Цитата(Jenya7 @ Oct 22 2013, 13:41) *
конечно
Код
int main(void)
{
  SysClockInit();  //первым делом натроить частоту
  PeriphClockInit();
  UsartInit();
  DWT_Init();
  GpioInit();
  McoPinInit();
   while(1)
  {
  }
}


SysClockInit() вызывается до main, если вы не переписали стандартный startup
Jenya7
Цитата(antis @ Oct 23 2013, 12:03) *
SysClockInit() вызывается до main, если вы не переписали стандартный startup

SysClockInit() - это уже моя функция,сначала как я понимаю выполняется стартаповский SystemInit () который делает то что делает, а потом я запускаю свою функцию.
antis
Цитата(Jenya7 @ Oct 23 2013, 10:15) *
SysClockInit() - это уже моя функция,сначала как я понимаю выполняется стартаповский SystemInit () который делает то что делает, а потом я запускаю свою функцию.


Сорь, перепутал название функции.
Но стандартный SystemInit () сам настраивает тактовую частоту, взависимости от значения SYSCLK_FREQ_xxx (файл system_stm32f10x.c)


Jenya7
Цитата(antis @ Oct 23 2013, 12:29) *
Сорь, перепутал название функции.
Но стандартный SystemInit () сам настраивает тактовую частоту, взависимости от значения SYSCLK_FREQ_xxx (файл system_stm32f10x.c)

в том то и дело,что после SystemInit() у меня частота 24Мгц, хотя все дефайны
на 72Мгц. Поэтому я своей функцией переписываю частоту, но она остается 24Мгц.
ViKo
На всякий случай спрошу - а у вас точно STM32F103, а не STM32F100?
А вы в стартапе замените вызов SystemInit на вызов своей функции. Я иногда так делал (а потом стал свою функцию называть SystemInit).
smk
Как я помню на лету так просто переписать регистры не выйдет. Проверьте, что настройки Ваши реально прописываются. А еще лучше настройте инициализацию по умолчанию, без своей функции. Или при создании проекта укажите, что стандартную инициализацию не применять.
Jenya7
у меня STM32F103RBT6.
Мне кажется что system_stm32f10x.c игнорирует мои настройки, не пойму почему. Я выбрал #define STM32F10X_MD который по идее приводит к #define SYSCLK_FREQ_72MHz 72000000 и отсюда SystemInit () должен пойти к SetSysClockTo72().
Jenya7
На всякий случай, если кто будет биться головой об стену (как это делал я в течении недели). У ИАР есть такая байда C/C++ Compiler->Preprocessor->Defined Symbols
и там прописано STM32F10X_MD_VL вместо моего STM32F10X_MD исправил и получил свои 72Мгц.
Причем если убрать дефайн вообще, не знаю как он компилируется но дефайны с хедеров он не берет и тактовая частота вообще не устанавливается.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.