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

 
 
> 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
Ответов
topkin
сообщение Jan 19 2011, 05:55
Сообщение #2


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

Группа: Свой
Сообщений: 152
Регистрация: 21-12-05
Из: Москва
Пользователь №: 12 476



Вы начали пользоваться библиотекой, так там в файле system_stm32f10x.с происходит инициализация МК до входа в main, там с помощью комментариев задаются стандартные частоты, выставьте одну из них, 36МГц вроде бы там есть, заодно посмотрите как там происходит настройка... Так же удостоверьтесь в правильности настройки проекта, я про макросы в свойствах проекта...
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jan 19 2011, 06:25
Сообщение #3


Местный
***

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



Цитата(topkin @ Jan 19 2011, 10:55) *
Вы начали пользоваться библиотекой, так там в файле system_stm32f10x.с происходит инициализация МК до входа в main, там с помощью комментариев задаются стандартные частоты, выставьте одну из них, 36МГц вроде бы там есть, заодно посмотрите как там происходит настройка... Так же удостоверьтесь в правильности настройки проекта, я про макросы в свойствах проекта...


Вы считаете, что функция SystemInit, которая в файле system_stm32f10x.с вызывается сама, тогда почему я не вижу в отдадчике результат ее работы? Да и настройка в ней такая же, что и приведена мной выше. Мне не нужна частота 36 МГц, я хочу минимум 72 МГц. А вот про макросы в свойствах проекта можно поподробнее?
Go to the top of the page
 
+Quote Post
topkin
сообщение Jan 19 2011, 06:57
Сообщение #4


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

Группа: Свой
Сообщений: 152
Регистрация: 21-12-05
Из: Москва
Пользователь №: 12 476



Цитата(011119xx @ Jan 19 2011, 09:25) *
Вы считаете, что функция SystemInit, которая в файле system_stm32f10x.с вызывается сама, тогда почему я не вижу в отдадчике результат ее работы? Да и настройка в ней такая же, что и приведена мной выше. Мне не нужна частота 36 МГц, я хочу минимум 72 МГц. А вот про макросы в свойствах проекта можно поподробнее?

Скорее всего у вас стоит галка в свойствах проекта "Debugger -> Setup-> Run to main", вот уберите ее и вы увидите, как испольняется функция SystemInit.
Возьмите готовый проект и посмотрите его свойства, например, для того, чтобы пользоваться библиотекой ST и указать правильный камень для нее, нужно прописать в свойствах проекта "С\C++ compiler-> Preprocessor-> defined symbols" строки:
USE_STDPERIPH_DRIVER
STM32F10X_MD_VL - тип контроллера, в данном случае это medium-density value line, короче это один их контроллеров линейки STM32F100
Go to the top of the page
 
+Quote Post
011119xx
сообщение Jan 19 2011, 08:02
Сообщение #5


Местный
***

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



Цитата(topkin @ Jan 19 2011, 11:57) *
Скорее всего у вас стоит галка в свойствах проекта "Debugger -> Setup-> Run to main", вот уберите ее и вы увидите, как испольняется функция SystemInit.
Возьмите готовый проект и посмотрите его свойства, например, для того, чтобы пользоваться библиотекой ST и указать правильный камень для нее, нужно прописать в свойствах проекта "С\C++ compiler-> Preprocessor-> defined symbols" строки:
USE_STDPERIPH_DRIVER
STM32F10X_MD_VL - тип контроллера, в данном случае это medium-density value line, короче это один их контроллеров линейки STM32F100


А разве не достаточно того, что в файле stm32f10x.h есть такие строки:

Код
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
  /* #define STM32F10X_LD */     /*!< STM32F10X_LD: STM32 Low density devices */
  /* #define STM32F10X_LD_VL */  /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */  
  /* #define STM32F10X_MD */     /*!< STM32F10X_MD: STM32 Medium density devices */
  /* #define STM32F10X_MD_VL */  /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */  
   #define STM32F10X_HD      /*!< STM32F10X_HD: STM32 High density devices */
  /* #define STM32F10X_XL */     /*!< STM32F10X_XL: STM32 XL-density devices */
  /* #define STM32F10X_CL */     /*!< STM32F10X_CL: STM32 Connectivity line devices */
#endif

#if !defined  USE_STDPERIPH_DRIVER
/**
* @brief Comment the line below if you will not use the peripherals drivers.
   In this case, these drivers will not be included and the application code will
   be based on direct access to peripherals registers
   */
  #define USE_STDPERIPH_DRIVER
#endif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 011119xx   STM32 и его RCC   Jan 19 2011, 05:02
- - sonycman   А может лучше не пользоваться всякими сомнительным...   Jan 19 2011, 15:15
|- - 011119xx   Цитата(sonycman @ Jan 19 2011, 20:15) А м...   Jan 20 2011, 04:19
|- - Danis   Цитата(011119xx @ Jan 20 2011, 07:19) Кто...   Jan 20 2011, 06:08
||- - 011119xx   Цитата(Danis @ Jan 20 2011, 11:08) Какая ...   Jan 20 2011, 06:13
|- - sonycman   Цитата(011119xx @ Jan 20 2011, 07:19) Да ...   Jan 20 2011, 10:35
- - 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:21
Рейтинг@Mail.ru


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