|
STM32 и его RCC, почему так происходит |
|
|
|
Jan 19 2011, 05:02
|

Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Jan 19 2011, 06:25
|

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

|
Цитата(topkin @ Jan 19 2011, 10:55)  Вы начали пользоваться библиотекой, так там в файле system_stm32f10x.с происходит инициализация МК до входа в main, там с помощью комментариев задаются стандартные частоты, выставьте одну из них, 36МГц вроде бы там есть, заодно посмотрите как там происходит настройка... Так же удостоверьтесь в правильности настройки проекта, я про макросы в свойствах проекта... Вы считаете, что функция SystemInit, которая в файле system_stm32f10x.с вызывается сама, тогда почему я не вижу в отдадчике результат ее работы? Да и настройка в ней такая же, что и приведена мной выше. Мне не нужна частота 36 МГц, я хочу минимум 72 МГц. А вот про макросы в свойствах проекта можно поподробнее?
|
|
|
|
|
Jan 19 2011, 06:57
|
Частый гость
 
Группа: Свой
Сообщений: 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
|
|
|
|
Сообщений в этой теме
011119xx STM32 и его RCC Jan 19 2011, 05:02   011119xx Цитата(topkin @ Jan 19 2011, 11:57) Скоре... Jan 19 2011, 08: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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|