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

 
 
> STM32 и его RCC, почему так происходит
011119xx
сообщение Jan 19 2011, 05:02
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



За изучение STM32 я взялся совсем недавно. Как и полагается собрал отладочную плату на STM32F103RET6 по прилагаемой схеме. В качестве отладчика использую J-Link v7, в качестве среды Keil mVision 4 (конечно не последней версии). Сделал простейший проект, основную часть программы привожу, к PC3 подключил светодиод через резистор к + питания:

Код
#include "stm32f10x.h"

ErrorStatus HSEStartUpStatus;
GPIO_InitTypeDef GPIO_InitStructure;

void RCC_Configuration(void)
{  
    // Сброс системы RCC (for debug purpose)
      RCC_DeInit();
      // Разрешение HSE
      RCC_HSEConfig(RCC_HSE_ON);
      // Ожидание готовности HSE
      HSEStartUpStatus = RCC_WaitForHSEStartUp();

      if(HSEStartUpStatus == SUCCESS)                        // Если HSE готов, то
      {
            // HCLK = SYSCLK
            RCC_HCLKConfig(RCC_SYSCLK_Div1);
            // PCLK2 = HCLK
            RCC_PCLK2Config(RCC_HCLK_Div1);
            // PCLK1 = HCLK/2
            RCC_PCLK1Config(RCC_HCLK_Div2);
            // PLLCLK = 8 МГц * 9 = 72 МГц
            RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
             // Разрешение PLL
            RCC_PLLCmd(ENABLE);
             // Ожидание готовности PLL
            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
            {}
            // Выбор PLL как источника системного тактирования
            RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
            // Ожидание готовности PLL для использования как источника системного тактирования
            while(RCC_GetSYSCLKSource() != 0x08)
            {}
      }
}

int main(void)
{
      RCC_Configuration();                           

      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

      GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_Init(GPIOC, &GPIO_InitStructure);                

    while(1)
    {
            GPIO_SetBits( GPIOC, GPIO_Pin_3);
        GPIO_ResetBits( GPIOC, GPIO_Pin_3);
    }
}


В общем запускаю программу на выполнение по шагам. В результате вижу, что HSE не готов, не хочет включаться. Тем не менее, светодиод загорается. Много над этим думал ... В результате пришел к выводу, что кварц какой-то не совсем рабочий и решил его заменить. Поставил другой, на 6 МГц (другого на 8 МГц под рукой не оказалось). Запустил программу на выполнение по шагам. Теперь HSE запускается, бит готовности выставляется, но снова возникли проблемы уже в другом месте. Оказалось, что теперь не запускается PLL и программа зациклилась тут, естественно, что светодиод не загорается:

Код
             // Ожидание готовности PLL
            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
            {}


Долго мучился над этой проблемой, но так и не решил. Все выключил, потом решил включить отладочную плату со снятым отладчиком и в результате светодиод загорелся, что свидетельствует о том, что зацикливания не произошло и PLL все же работает.

Значит получается, что это отладчик не дает запускаться PLL?

Пробовал менять функцию RCC_Configuration на такую, то есть запускать PLL от HSI:

Код
void RCC_Configuration(void)
{  
    // Сброс системы RCC (for debug purpose)
      RCC_DeInit();
      // Разрешение HSE
      RCC_HSEConfig(RCC_HSE_ON);
      // Ожидание готовности HSE
      HSEStartUpStatus = RCC_WaitForHSEStartUp();

    // HCLK = SYSCLK
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    // PCLK2 = HCLK
    RCC_PCLK2Config(RCC_HCLK_Div1);
    // PCLK1 = HCLK/2
    RCC_PCLK1Config(RCC_HCLK_Div2);
    // PLLCLK = 8/2 МГц * 9 = 36 МГц
    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9);
    // Разрешение PLL
    RCC_PLLCmd(ENABLE);
    // Ожидание готовности PLL
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {}
    // Выбор PLL как источника системного тактирования
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    // Ожидание готовности PLL для использования как источника системного тактирования
    while(RCC_GetSYSCLKSource() != 0x08)
    {}
}


При этом PLL запускается и светодиод горит.

Почему так происходит?

Сообщение отредактировал 011119xx - Jan 19 2011, 05:04
Прикрепленные файлы
Прикрепленный файл  _____Controller__STM32_.BMP ( 1.46 мегабайт ) Кол-во скачиваний: 34
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sonycman
сообщение Jan 19 2011, 15:15
Сообщение #2


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



А может лучше не пользоваться всякими сомнительными библиотеками?
Имхо, прямая работа с периферией много эффективнее, хотя и несколько сложнее в освоении...
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jan 20 2011, 04:19
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Цитата(sonycman @ Jan 19 2011, 20:15) *
А может лучше не пользоваться всякими сомнительными библиотеками?
Имхо, прямая работа с периферией много эффективнее, хотя и несколько сложнее в освоении...

Да нет Вова, хорошая библиотека, очень облегчает освоение.

В общем моя история продолжилась тем, что купил я новый кварц на 8 МГц и поставил его, прошил, запустил отладку по шагам. HSE запускается, PLL тоже, по крайней мере, не зацикливается там, где это происходило ранее. Но вот то что отображается в окне Peripherals/RCC вызывает недоумение. Флаг PLLRDY, то стоит, то не стоит. Частоты тактирования разных модулей (те что в самом низу окна) тоже как-то отображаются, то правильно, то не правильно... Думаю может у меня версия Keil какая-то глючная или может дело в J-Link... При отключенном отладчике зацикливания не происходит и светодиод начинает мигать (добавил задержки после установки и сброса бита PC3). Но вот что интересно, если произвести сброс кнопкой, то частота работы процессора уменьшается, светодиод начинает мигать медленнее... Кто что думает по этому поводу?
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 20 2011, 10:35
Сообщение #4


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(011119xx @ Jan 20 2011, 07:19) *
Да нет Вова, хорошая библиотека, очень облегчает освоение.

На всякий случай, приведу свою прямую инициализацию клоков для STM32 с кварцем 8 МГц для частоты 72 МГц, может, чем то поможет:
CODE

#define FLASH_ACR_LATENCY_1 ((u8)0x02)
#define RCC_CR_HSEON ((u32)0x00010000) /* External High Speed clock enable */
#define RCC_CFGR_PLLMULL9 ((u32)0x001C0000) /* PLL input clock*9 */
#define RCC_CFGR_PLLSRC ((u32)0x00010000) /* PLL entry clock source */
#define RCC_CFGR_PPRE1_DIV2 ((u32)0x00000400) /* HCLK divided by 2 */
#define RCC_CR_HSERDY ((u32)0x00020000) /* External High Speed clock ready flag */
#define RCC_CR_PLLON ((u32)0x01000000) /* PLL enable */
#define RCC_CR_PLLRDY ((u32)0x02000000) /* PLL clock ready flag */
#define RCC_CFGR_SW_PLL ((u32)0x00000002) /* PLL selected as system clock */
#define RCC_CFGR_SWS_HSE ((u32)0x00000004) /* HSE oscillator used as system clock */
#define RCC_CFGR_SWS_PLL ((u32)0x00000008) /* PLL used as system clock */

//configure clocks
FLASH->ACR |= FLASH_ACR_LATENCY_1; //flash latency = 2 wait states
RCC->CR |= RCC_CR_HSEON;
RCC->CFGR = RCC_CFGR_PLLMULL9 | RCC_CFGR_PLLSRC | RCC_CFGR_PPRE1_DIV2;
while (!(RCC->CR & RCC_CR_HSERDY));
RCC->CR |= RCC_CR_PLLON;
while (!(RCC->CR & RCC_CR_PLLRDY));
RCC->CFGR |= RCC_CFGR_SW_PLL;
while ((RCC->CFGR & (RCC_CFGR_SWS_HSE | RCC_CFGR_SWS_PLL)) != RCC_CFGR_SWS_PLL);

//Enable clocking of the peripherals - all the IO ports
RCC->APB2ENR = RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN |
RCC_APB2ENR_IOPDEN;

Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 011119xx   STM32 и его RCC   Jan 19 2011, 05:02
- - topkin   Вы начали пользоваться библиотекой, так там в файл...   Jan 19 2011, 05:55
|- - 011119xx   Цитата(topkin @ Jan 19 2011, 10:55) Вы на...   Jan 19 2011, 06:25
|- - topkin   Цитата(011119xx @ Jan 19 2011, 09:25) Вы ...   Jan 19 2011, 06:57
|- - 011119xx   Цитата(topkin @ Jan 19 2011, 11:57) Скоре...   Jan 19 2011, 08:02
|- - Danis   Цитата(011119xx @ Jan 20 2011, 07:19) Кто...   Jan 20 2011, 06:08
||- - 011119xx   Цитата(Danis @ Jan 20 2011, 11:08) Какая ...   Jan 20 2011, 06:13
- - 011119xx   Сейчас мы имеем ситуацию при которой, прямое управ...   Jan 21 2011, 04:37
|- - pr0m   Цитата(011119xx @ Jan 21 2011, 07:37) Обя...   Jan 22 2011, 20:22
- - 011119xx   Теория на практике не подтвердилась... Буфер предв...   Jan 24 2011, 05:01
|- - sonycman   Цитата(011119xx @ Jan 24 2011, 08:01) Но ...   Jan 24 2011, 05:40
- - 011119xx   Резистор на 1МОм пробовал ставить - не помогает. К...   Jan 24 2011, 06:50
- - 011119xx   На схеме отладочной платы STM3210E-EVAL стоит допо...   Jan 25 2011, 11:06
|- - shreck   Цитата(011119xx @ Jan 25 2011, 19:06) На ...   Jan 25 2011, 11:17
- - ViKo   Работает ли кварцевый генератор, вы можете увидеть...   Jan 25 2011, 11:20
|- - 011119xx   Цитата(ViKo @ Jan 25 2011, 16:20) Работае...   Jan 25 2011, 12:11
|- - ViKo   Цитата(011119xx @ Jan 25 2011, 14:11) В ч...   Jan 25 2011, 12:30
|- - 011119xx   Цитата(ViKo @ Jan 25 2011, 17:30) Та плат...   Jan 25 2011, 12:36
|- - ViKo   Цитата(011119xx @ Jan 25 2011, 14:36) Не ...   Jan 25 2011, 12:59
|- - sonycman   Цитата(ViKo @ Jan 25 2011, 15:59) ПМСМ, з...   Jan 25 2011, 14:56
- - 011119xx   Достал вчера мешочек в котором лежат кондеры на 22...   Jan 26 2011, 04:10
- - sonycman   Цитата(011119xx @ Jan 26 2011, 07:10) Дос...   Jan 26 2011, 07:34
- - ViKo   Цитата(sonycman @ Jan 26 2011, 09:34) Куп...   Jan 26 2011, 08:01


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

 


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


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