Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/102: Рейтинг темы: голосов - 102, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
1

Настройка тактирования STM32F103

13.10.2015, 02:16. Показов 18729. Ответов 25
Метки нет (Все метки)

Доброго времени суток.
Пытаюсь разобраться с тактированием STM32F103. Пишу код, вроде все верно:
Код
//********************************************************************************
//Function: настройкa системы тактирования контроллера STM32F103xx              //
//          источник сигнала - HSE генератор с кварцем 8MHz через PLL           //
//return:   0 - ok; 1 - генератор HSE не запустился                             //
//********************************************************************************
unsykned char InitClk()
{
unsykned long int TimeOut = 10000;

//Запустить HSE
RCC->CR   |=  RCC_CR_HSEON;            //Включить генератор HSE
while((RCC->CR & RCC_CR_HSERDY)==0)    //Ожидание готовности HSE
if(TimeOut) TimeOut--;
if(TimeOut==0) return 1;               //Ошибка!!! Генератор HSE не запустился
RCC->CR   |=  RCC_CR_CSSON;            //Разрешить работу системы защиты сбоя HSE

RCC->CFGR &= ~RCC_CFGR_PLLXTPRE;       //Не использовать делитель HSE

//Настройка PLL
RCC->CFGR  |= RCC_CFGR_PLLSRC;         //Источником сигнала для PLL выбран HSE
RCC->CR   &= ~RCC_CR_PLLON;            //Отключить генератор PLL
RCC->CFGR &= ~RCC_CFGR_PLLMULL;        //Очистить PLLMULL
RCC->CFGR |=  RCC_CFGR_PLLMULL2;       //Коэффициент умножения = 2
RCC->CR   |=  RCC_CR_PLLON;            //Включить генератор PLL
while((RCC->CR & RCC_CR_PLLRDY)==0) {} //Ожидание готовности PLL

FLASH->ACR &= ~FLASH_ACR_LATENCY; // Предочистка.
FLASH->ACR |= FLASH_ACR_LATENCY_0; // Если SystemCoreClock <= 24 МГц, без пропусков.

//Переключиться на тактирование от PLL
RCC->CFGR &= ~RCC_CFGR_SW;             //Очистка битов выбора источника тактового сигнала
RCC->CFGR |=  RCC_CFGR_SW_PLL;         //Выбрать источником тактового сигнала PLL
while((RCC->CFGR&RCC_CFGR_SWS)!=0x08){}//Ожидание переключения на PLL

return 0;                              //Все ok, работаем от HSE
}
Ничего не зависает, но и тактовая частота не меняется. Абсолютно все равно какой множитель я пропишу, МК все равно молотит на 72МГц. Кварц 8МГц. Что я упускаю?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2015, 02:16
Ответы с готовыми решениями:

Настройка тактирования STM32F407VG
Начал изучать МК семейства ST. Прикупил себе отладочную плату STM32 discovery - disc1. IDE - iar...

STM32F4Discovery. ШИМ, настройка тактирования
Задача стоит такая. Управляю сервоприводом. Нужно настроить предделитель таймера правильно, исходя...

АЦП STM32F103 настройка
здравствуйте, уважаемые форумчане. Хочу я настроить ацп STM32F103CBT6. Не могу понять регистры SQR1...

STM32F103 настройка и использование USB
Доброго времени суток. Добрался я все таки до USB интерфейса в STM32. Работал с программным USB...

25
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 48
13.10.2015, 10:21 2
А до запуска этой функции частота 72МГц? С кварца или HSI?

Может быть не хватает времени на запуск HSE? Если просто на HSE перейти -- работает?
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,520
13.10.2015, 11:38 3
Тут ошибка, по-любому!
Код
while((RCC->CR & RCC_CR_HSERDY)==0)    //Ожидание готовности HSE
if(TimeOut) TimeOut--;
if(TimeOut==0) return 1;               //Ошибка!!! Генератор HSE не запустился
Смотрите что происходит - Вы декрименируете переменную пока выполняется условие while, но проверку переменной делаете за пределами цикла!
То есть переменная может уйти в "минус", Вы проскочите значение 0.

Вероятно, имелось в виду это?

Код
while((RCC->CR & RCC_CR_HSERDY)==0)    //Ожидание готовности HSE
{
if(TimeOut) TimeOut--;
if(TimeOut==0) return 1;               //Ошибка!!! Генератор HSE не запустился
}
Я бы так оформил (сути не меняет)

Код
while((RCC->CR & RCC_CR_HSERDY)==0)    //Ожидание готовности HSE
{
if(!(TimeOut--)) return 1;               //Ошибка!!! Генератор HSE не запустился
}
0
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
13.10.2015, 12:46 4
Цитата Сообщение от YvomSh
А до запуска этой функции частота 72МГц? С кварца или HSI?
Да. Частота 72МГц и с этой функцией и без нее. Работает от кварца. Функцию вызываю до инита всей периферии.

Цитата Сообщение от Pymkvym
Смотрите что происходит - Вы декрименируете переменную пока выполняется условие while, но проверку переменной делаете за пределами цикла!
То есть переменная может уйти в "минус", Вы проскочите значение 0.
Точно, не подумал об этом. Правда, ничего не изменилось... Кстати, забыл совсем. Вот эта строка:
Код
 FLASH->ACR &= ~FLASH_ACR_LATENCY;
Вешает МК намертво.

P.S.
Выяснил, что МК может работать на частоте выше 72 МГц. Воткнул ему ради интереса кварц 12 МГц, он его спокойно переварил и затактировался на частоте 108 МГц.
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,183
13.10.2015, 13:32 5
Цитата Сообщение от BORS_
P.S.
Выяснил, что МК может работать на частоте выше 72 МГц. Воткнул ему ради интереса кварц 12 МГц, он его спокойно переварил и затактировался на частоте 108 МГц.
Сейчас частота в большинстве случаев это сугубо маркетинговое ограничение.
0
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
13.10.2015, 15:36 6
Цитата Сообщение от Pymkvym
Тут ошибка, по-любому!
Код:
while((RCC->CR & RCC_CR_HSERDY)==0) //Ожидание готовности HSE
if(TimeOut) TimeOut--;
if(TimeOut==0) return 1; //Ошибка!!! Генератор HSE не запустился

Смотрите что происходит - Вы декрименируете переменную пока выполняется условие while, но проверку переменной делаете за пределами цикла!
То есть переменная может уйти в "минус", Вы проскочите значение 0.

В минус не уйдет, она беззнаковая :) Но и знаковая не уйдет - застрянет на нуле. Если внешний кварц не запустится, то здесь и повиснет.
0
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
13.10.2015, 15:38 7
Цитата Сообщение от YvomSh
А до запуска этой функции частота 72МГц? С кварца или HSI?
STM32F103 с HSI не может выдать 72МГц, максимум 64.
0
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
13.10.2015, 15:47 8
И все таки, из-за чего МК может не реагировать на настройки? От внутреннего генератора работает на 8Мгц, с кварцем всегда умножает на 9. Вне зависимости от настроек.
0
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
13.10.2015, 16:48 9
А как ты проверяешь работу от внутреннего? Просто кварц вынимаешь?
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,520
13.10.2015, 16:51 10
Цитата Сообщение от div
Цитата Сообщение от Pymkvym
Тут ошибка, по-любому!
Код:
while((RCC->CR & RCC_CR_HSERDY)==0) //Ожидание готовности HSE
if(TimeOut) TimeOut--;
if(TimeOut==0) return 1; //Ошибка!!! Генератор HSE не запустился

Смотрите что происходит - Вы декрименируете переменную пока выполняется условие while, но проверку переменной делаете за пределами цикла!
То есть переменная может уйти в "минус", Вы проскочите значение 0.

В минус не уйдет, она беззнаковая :) Но и знаковая не уйдет - застрянет на нуле. Если внешний кварц не запустится, то здесь и повиснет.
Все зависит от интерпретации.
Знаковая -1 и беззнаковое 255 в бинарном виде - одно и то же.
Можете поэкспериментировать.
0
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
13.10.2015, 17:21 11
Цитата Сообщение от div
А как ты проверяешь работу от внутреннего? Просто кварц вынимаешь?
Ну да. При этом он переходит на работу от внутреннего кварца. При старте тоже спокойно заводится от внутреннего.
0
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
13.10.2015, 17:32 12
Тогда указная функция вообще не вызывается - первый while просто обязан повиснуть при отсутствии внешнего кварца.
0
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
13.10.2015, 17:38 13
Точно, это я немножко обманул =) Без кварца МК не стартует. На внутренний генератор переходит только если выдергнуть кварц во время работы МК. И только если убрать
Код
RCC->CR   |=  RCC_CR_CSSON;
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 553
13.10.2015, 17:53 14
Цитата Сообщение от BORS_
Ничего не зависает, но и тактовая частота не меняется. Абсолютно все равно какой множитель я пропишу, МК все равно молотит на 72МГц. Кварц 8МГц. Что я упускаю?
Не вникал в сам код, но после его запуска частота у моего проца 16МГц (STM32F103RE, кварц 8МГц).
0
1 / 1 / 0
Регистрация: 14.02.2013
Сообщений: 446
13.10.2015, 18:05 15
Цитата Сообщение от BORS_
И все таки, из-за чего МК может не реагировать на настройки? От внутреннего генератора работает на 8Мгц, с кварцем всегда умножает на 9. Вне зависимости от настроек.
Всё просто. До вашей настройки уже было всё настроено, вот и всё. Подключите отладку, ресетните дебагером и пошагово пройдитесь, удивитесь.
0
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
14.10.2015, 01:50 16
Это понятно, что настроено. А как мне это перенастроить? Дебигом пройтись, к сожалению, не могу. Пишу в Eclipce.
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,520
14.10.2015, 06:44 17
Цитата Сообщение от BORS_
Это понятно, что настроено. А как мне это перенастроить? Дебигом пройтись, к сожалению, не могу. Пишу в Eclipce.
Первый раз слышу, что в Eclipse нельзя дебажить!
Настройте правильно - никаких проблем.
0
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
14.10.2015, 09:22 18
Цитата Сообщение от BORS_
И все таки, из-за чего МК может не реагировать на настройки? От внутреннего генератора работает на 8Мгц, с кварцем всегда умножает на 9. Вне зависимости от настроек.
PLL после запуска не должен реагировать на множители, так-же как делители и переключатели такта - до самого главного переключателя Sustem Clock Mux. Вот его можно менять, но только в одну сторону - переключением на HIS. Потом нужно выключить PLL, станут доступны его регистры и переключатель источника такта для него. И только потом становится доступным сам генератор кварца.
Его конечно можно насильно рубануть, но для уже настроенного и запущенного мк - это равносильно отстрелу колёс у машины на треке.
0
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
14.10.2015, 13:12 19
Т.е. я должен сначала переключит на HSI, потом произвести настройки PLL, потом переключиться на HSE?
0
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 278
18.10.2015, 02:18 20
И тишина в ответ...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2015, 02:18

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Настройка OSC_OUT как GPIO для STM32f103
Добрый день. Контроллер STM32f103 тактируется от внешнего генератора, неиспользованный пин OSC_OUT...

Сброс настроек тактирования
При отладке (SWD,ST-Link) кода (Keil 4.23) на плате дискавери (камень - stm32f100rb) выявил вот...

Система тактирования Cortex-M4
Подскажите, где по теме можно на русском почитать? Было бы неплохо и код посмотреть... какой...

Частота тактирования ядра
Здравствуйте. Пытаюсь использовать мк stm32f103c8t6. Как полный чайник хочу прояснить для себя один...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.