реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Проблема с тактовой частотой., STM32F103RBT6
Jenya7
сообщение Oct 16 2013, 05:27
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Привет всем.
Выставляю тактовую частоту -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Мгц. Что я делаю не так?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Oct 16 2013, 08:50
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



как минимум, как следует из комментариев вы пин на 50 МГц настроили, как вы на нем 72 увидеть хотите?
Go to the top of the page
 
+Quote Post
A.Lex
сообщение Oct 16 2013, 09:30
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 138
Регистрация: 27-12-11
Пользователь №: 69 107



В доке написано: I/Os on APB2 with up to 18 MHz toggling speed
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 16 2013, 09:45
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Я понял. Попробую подрезать частоту.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 20 2013, 05:58
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



изменил опцию MCO пина - чтоб выдавал PLL/2
Код
RCC->CFGR    |=RCC_CFGR_MCO_PLL;


на скопе вижу 12Мгц т.е. 24/2. что то не так, а что не могу понять.

Сообщение отредактировал Jenya7 - Oct 20 2013, 05:59
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 22 2013, 07:21
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



я так понимаю, что 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()
должна переписать частоту по идее.

Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 22 2013, 08:20
Сообщение #7


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



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

А вы свою функцию вызываете?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 22 2013, 09:41
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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


конечно
Код
int main(void)
{
  SysClockInit();  //первым делом натроить частоту
  PeriphClockInit();
  UsartInit();
  DWT_Init();
  GpioInit();
  McoPinInit();
   while(1)
  {
  }
}
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 22 2013, 09:59
Сообщение #9


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



А на выводах резонатора генерация есть?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 22 2013, 10:15
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(ViKo @ Oct 22 2013, 15:59) *
А на выводах резонатора генерация есть?

вопрос не в бровь а в глаз, демо борд выполнен очень добротно, но скопом все равно надо ткнуть.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 23 2013, 05:28
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



посмотрел частоту на кварце - красивые 8 Мгц, в чем проблема не понимаю.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 23 2013, 05:54
Сообщение #12


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



В отладчике Keil можно увидеть состояние RCC.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 23 2013, 06:02
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(ViKo @ Oct 23 2013, 11:54) *
В отладчике Keil можно увидеть состояние RCC.

я пишу в IAR
Go to the top of the page
 
+Quote Post
antis
сообщение Oct 23 2013, 06:03
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 11-01-09
Пользователь №: 43 172



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


SysClockInit() вызывается до main, если вы не переписали стандартный startup
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Oct 23 2013, 06:15
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

SysClockInit() - это уже моя функция,сначала как я понимаю выполняется стартаповский SystemInit () который делает то что делает, а потом я запускаю свою функцию.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 08:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01714 секунд с 7
ELECTRONIX ©2004-2016