Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-авг-23 05:28

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
СообщениеДобавлено: 2016-ноя-16 15:01 
Не в сети

Зарегистрирован: 2015-ноя-05 10:50
Сообщения: 15
Доброго дня.
На плате стоит внешний генератор на 25МГц, который подключен напрямую через резистор ко входу OSC_IN МК 1986BE1T.
Подскажите как правильно произвести инициализацию контроллера тактовой частоты?
Необходимо от этого кварца тактировать ядро МК и Ethernet.

Подойдет ли такой код?
Открыть
Код:
// Настройка контроллера тактовой частоты.
void RST_CLK_Config(void)
{
   MDR_RST_CLK->PER_CLOCK = RST_CLK_PER_CLOCK_PCLK_EN_RST_CLK;

   // Вкл. управление HSE2 осциллятором с ревизии 2 и режим внешнего генератора
   MDR_RST_CLK->HS_CONTROL = (0 << RST_CLK_HS_CONTROL_HSE_ON_Pos)  |
                                          (0 << RST_CLK_HS_CONTROL_HSE_BYP_Pos) |
                                          (1 << RST_CLK_HS_CONTROL_HSE_ON2_Pos) |
                                          (1 << RST_CLK_HS_CONTROL_HSE_BYP2_Pos);

   // Ожидаем запуск...
   while((MDR_RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_HSE_RDY2) == 0){};
   
   // Выбираем HSE как источник тактирования для HCLK
   MDR_RST_CLK->CPU_CLOCK =
      (RST_CLK_CPU_CLOCK_CPU_C1_SEL_HSE << RST_CLK_CPU_CLOCK_CPU_C1_SEL_Pos) |
      (RST_CLK_CPU_CLOCK_CPU_C2_SEL_CPU_C1 << RST_CLK_CPU_CLOCK_CPU_C2_SEL_Pos) |
      (RST_CLK_CPU_CLOCK_CPU_C3_SEL_CPU_C2 << RST_CLK_CPU_CLOCK_CPU_C3_SEL_Pos) |
      (RST_CLK_CPU_CLOCK_HCLK_SEL_CPU_C3 << RST_CLK_CPU_CLOCK_HCLK_SEL_Pos);
      
   MDR_RST_CLK->PLL_CONTROL =
      (0 << RST_CLK_PLL_CONTROL_PLL_USB_ON_Pos)  |
      (0 << RST_CLK_PLL_CONTROL_PLL_USB_RLD_Pos) |
      (0 << RST_CLK_PLL_CONTROL_PLL_CPU_ON_Pos)  |
      (0 << RST_CLK_PLL_CONTROL_PLL_CPU_PLD_Pos) |
      (0 << RST_CLK_PLL_CONTROL_PLL_USB_MUL_Pos) |
      (1 << RST_CLK_PLL_CONTROL_PLL_CPU_MUL_Pos);
   
   SET_BIT(MDR_RST_CLK->PLL_CONTROL, RST_CLK_PLL_CONTROL_PLL_CPU_ON_Pos);
   
   SET_BIT(MDR_RST_CLK->PLL_CONTROL, RST_CLK_PLL_CONTROL_PLL_CPU_PLD_Pos);
   CLR_BIT(MDR_RST_CLK->PLL_CONTROL, RST_CLK_PLL_CONTROL_PLL_CPU_PLD_Pos);
   
   while ((MDR_RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_PLL_CPU_RDY) == 0){};

   // EEPROM_CNTRL Clock enable   
   MDR_RST_CLK->PER_CLOCK |= RST_CLK_PER_CLOCK_PCLK_EN_EEPROM_CNTRL;
   MDR_EEPROM->CMD = (4 << EEPROM_CMD_DELAY_Pos);
   MDR_RST_CLK->PER_CLOCK &= ~RST_CLK_PER_CLOCK_PCLK_EN_EEPROM_CNTRL;

      // Выбираем для CPU_C1 - HSE; CPU_C2 - PLLCPU0;
   // CPU_C3 - CPU_C2; HCLK - CPU_C3
   MDR_RST_CLK->CPU_CLOCK =
      (RST_CLK_CPU_CLOCK_CPU_C1_SEL_HSE << RST_CLK_CPU_CLOCK_CPU_C1_SEL_Pos) |
      (RST_CLK_CPU_CLOCK_CPU_C2_SEL_PLL_CPU << RST_CLK_CPU_CLOCK_CPU_C2_SEL_Pos) |
      (RST_CLK_CPU_CLOCK_CPU_C3_SEL_CPU_C2 << RST_CLK_CPU_CLOCK_CPU_C3_SEL_Pos) |
      (RST_CLK_CPU_CLOCK_HCLK_SEL_CPU_C3 << RST_CLK_CPU_CLOCK_HCLK_SEL_Pos);
}

// Настройка блока PHY
void PHY_Init(void)
{
   // PHY_CLK_SEL = HSE2, ETH_CLK_EN=1, PHY_CLK_EN=1, ETH_CLK = 25MHz
   MDR_RST_CLK->ETH_CLOCK &= ~(RST_CLK_ETH_CLOCK_PHY_BRG_Msk |
                                             RST_CLK_ETH_CLOCK_PHY_CLK_SEL_Msk);
      
   // Выбираем источник HSE2 для Ethernet PHY   
   MDR_RST_CLK->ETH_CLOCK |=
      (RST_CLK_ETH_CLOCK_PHY_BRG_PHY1_CLK << RST_CLK_ETH_CLOCK_PHY_BRG_Pos) |
      (1 << RST_CLK_ETH_CLOCK_ETH_CLK_EN_Pos) |
      (1 << RST_CLK_ETH_CLOCK_PHY_CLK_EN_Pos) |
      (RST_CLK_ETH_CLOCK_PHY_CLK_SEL_HSE2 << RST_CLK_ETH_CLOCK_PHY_CLK_SEL_Pos);
   
   // Устанавливаем режим работы 100Мбит/FD
   MDR_ETHERNET1->PHY_Control =
      (1 << ETH_PHY_CONTROL_nRST_Pos) |
      (ETH_PHY_CONTROL_MODE_100M_FD << ETH_PHY_CONTROL_MODE_Pos) |
      (0 << ETH_PHY_CONTROL_FX_EN_Pos) |
      (0 << ETH_PHY_CONTROL_MDI_Pos) |
      (0 << ETH_PHY_CONTROL_MDIO_SEL_Pos) |
      (0 << ETH_PHY_CONTROL_MDC_Pos) |
      (ETH_PHY_ADDR << ETH_PHY_CONTROL_PHYADD_Pos);
   
   // Ждем пока модуль в состоянии сброса
   while ((MDR_ETHERNET1->PHY_Status & ETH_PHY_STATUS_READY) == 0);
}

Закрыть


Платы пока под рукой нет, проверить не могу.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-ноя-18 10:06 
Не в сети

Зарегистрирован: 2015-ноя-05 10:50
Сообщения: 15
Удалось запустить со следующими изменениями:
Открыть
Настройка тактовой частоты.
Добавил включение батарейного домена:
Код:
MDR_RST_CLK->PER_CLOCK |= RST_CLK_PER_CLOCK_PCLK_EN_BKP;
MDR_BKP->REG_0E &= ~(BKP_REG_0E_LOW_Msk | BKP_REG_0E_SELECTRI_Msk);
MDR_BKP->REG_0E |= (6 << BKP_REG_0E_LOW_Pos) | (6 << BKP_REG_0E_SELECTRI_Pos);

Изменил значения бит в регистре HS_CONTROL:
Код:
MDR_RST_CLK->HS_CONTROL = (1 << RST_CLK_HS_CONTROL_HSE_ON_Pos)  |
                  (1 << RST_CLK_HS_CONTROL_HSE_BYP_Pos) |
                  (0 << RST_CLK_HS_CONTROL_HSE_ON2_Pos) |
                  (0 << RST_CLK_HS_CONTROL_HSE_BYP2_Pos);

while((MDR_RST_CLK->CLOCK_STATUS & RST_CLK_CLOCK_STATUS_HSE_ALL_RDY) == 0){};

Соответственно в настройке блока PHY изменил значение RST_CLK_ETH_CLOCK_PHY_CLK_SEL_HSE2 на RST_CLK_ETH_CLOCK_PHY_CLK_SEL_HSE
Закрыть


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-мар-10 13:14 
Не в сети

Зарегистрирован: 2017-мар-09 18:34
Сообщения: 1
Здравствуйте!
Есть задача, изменить коэффициент умножения CPU PLL в процессе работы от того же самого CPU PLL (HCLKSEL=01), т.е. "на лету".

Документация говорит, что "для корректной смены тактовой частоты сначала должны быть сформированы необходимые тактовые частоты, и затем осуществлено переключение на них с помощью соответствующих мультиплексоров".

Но в данном случае нет необходимости переключения на CPU PLL, т.к. он уже выбран. Нужно только поменять коэффициент умножения.

Скажите, какова последовательность действий должна быть в данном случае?

_________________
Быть пессимистом потрясающе. Я всегда или прав, или приятно удивлён.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-мар-10 13:29 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 968
Откуда: Тула
Nix_86 писал(а):
Скажите, какова последовательность действий должна быть в данном случае?

Переключиться с умножителя на другой источник (например, HSI), перенастроить умножитель, дождаться пока он выйдет на режим и переключиться обратно, работать на новой частоте.
Ещё нужно не забыть настроить EEPROM_Delay до переключения на более высокую частоту (или держать с наибольшим значением всегда).
Ещё есть SelectRI[2:0] и LOW[2:0] в MDR_BKP->REG_0E (должны быть равны друг другу).

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB