Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 15.01.2015
Сообщений: 16

Не могу разобраться в настройке тактирования STM32

09.05.2017, 13:51. Показов 1503. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго для и с праздником Победы. Начал изучать микроконтроллеры STM на примере STM32F103C8T6, и столкнулся с проблемой: не могу нормально настроить тактирование ядра, вроде все делаю по даташиту согласно схеме тактирования МК, и в теории все кажется просто и понятно, однако на практике получить желаемый результат не удается, может кто подскажет что я делаю не так, ниже привожу код с комментариями. Проект собирался в Keil'е uVision5

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
int main(void){
    *(unsigned long*)(0x40021000) |= 0x00010000;//Установим бит HSEON регистра RCC_CR
    char hse_rdy = 0, hse_count = 0;
    do{ //подождем пока включится внешний кварц, проверку производим по биту HSERDY регистра RCC_CR
            //если все нормально бит установится хардварно после 6 тактов кварца по спадающему фронту
        hse_rdy = *(unsigned long*)(0x40021000) & 0x00020000 >> 16;
        hse_count++;
    }while(hse_count < 12 && !hse_rdy); //проверку проводим не более 12 раз или пока бит HSERDY не будет установлен
    if(hse_rdy == 0x02){
        *(unsigned long*)(0x40021004) |= 0x00000000;  //устанавливаем биты HPRE регистра RCC_CFGR в 0b0000
                                  //что соответствует AHB prescaler = /1
        *(unsigned long*)(0x40021004) |= 0x00000000;  //устанавливаем биты PPRE2 регистра RCC_CFGR в 0b000
                                  //что соответсвует APB2 prescaler = /1
        *(unsigned long*)(0x40021004) |= 0x00000400;  //устанавливаем биты PPRE1 регистра RCC_CFGR в 0b100
                                  //что соответствует APB1 prescaler = /2
        *(unsigned long*)(0x40021004) |= 0x001c0000;  //устанавливаем биты PLLMUL регистра RCC_CFGR в 0b0111
                                  //что соответствует PLLMUL = *9
        *(unsigned long*)(0x40021004) |= 0x00000000;  //устанавливаем бит PLLXTPRE регистра PLL_CFGR в 0b0
                                  //что соответствует PLLXTPRE = /1
        *(unsigned long*)(0x40021004) |= 0x00010000;  //устанавливаем бит PLLSRC регистра PCC_CFGR 
                                                      //чтобы выбрать в качестве источника тактирования PREDIV1
        *(unsigned long*)(0x40021000) |= 0x01000000; //устанавливаем бит PLLON регистра RCC_CR
        while((*(unsigned long*)(0x40021000) & 0x04000000)); //ждем пока бит PLLRDY регистра RCC_CR установиться
                                                           //тут есть первая странность, почему-то PLLRDY не устанавливается
        *(unsigned long*)(0x40021004) |= 0x00000002; //устанавлтваем биты SW регистра RCC_CFGR в 0x10
                                                     //что соответствует установке PLL в качестве источника тактирования
        *(unsigned long*)(0x40021000) &= 0xfffffffe; //отключаем HSI
        while(!(*(unsigned long*)(0x40021004) & 0x00000008)); //ждем пока PLL не установиться в качестве источника тактирования
                                      //вторая странность, вроде бы источником тактирования выбран PLL
                                      //однако такое ощущение что как это все работало от 8 МГц так и продолжает
                                      //диод горит примерно 1 сек и на 1 сек гаснет
    }
    *((unsigned long*)0x40021018) = 0x00000010; // RCC_APB2ENR = RCC_APB2ENR_IOPCEN
    *((unsigned long*)0x40011004) = 0x00300000; // GPIOC_CRH = MODER_OUTPUT_13
    while(1){
        *((unsigned long*)0x4001100C) ^= 0x00002000; // GPIOC_ODR ^= BIT_13
        for(int i = 0; i < 8000000; i++);
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.05.2017, 13:51
Ответы с готовыми решениями:

Не могу разобраться в настройке
Здравствуйте, дома стоит сервер ubuntu на нем настроем apache2 mysql php и.т.д. Подключен к интернету через роутер D-Link Dir615. Проблема...

STM32 Система тактирования
Здравствуйте. Решил вот освоить контроллеры STM32. Имеется контроллер STM32F103C8T6 и минимальная разводочка к ней. С системой...

в STM32 у разных таймеров разные источники тактирования?
К примеру у TYM1 если ставишь коэфф. деления 180 - получаешь 200кГц. Прескалер 0. Тот же самый режим для таймера TIM3, коэфф. деления 180...

7
 Аватар для Shamrel
82 / 80 / 16
Регистрация: 11.03.2016
Сообщений: 206
09.05.2017, 17:41
Нежелание использовать STM32CubeMX принципиальное?
Или задача стоит чисто академическая?
0
0 / 0 / 1
Регистрация: 15.01.2015
Сообщений: 16
09.05.2017, 18:23  [ТС]
Как сказать, во-первых хочется во всем разобраться самому с самых азов, в то время как CubeMX все сделает за меня (я ведь правильно понял что в нем просто надо тыкнуть где и сколько МГц я хочу получить и он уже сгенерирует код за меня), а вторая причина в том, что мне с большой вероятностью скоро нужно будет колдовать над миландровскими МК которые построены на том же ядре, а так как у меня под рукой только STM32 на данный момент, то желательно опять же покопать их без сторонних примочек, чтобы потом не оказаться у разбитого корыта когда выясниться что к миландру нет примочек вообще или есть но другие.
Вообще я так понял косяк или косяки могут идти из-за стандартных примочек от ST, таких как библиотека system startup без которой проект не компилится, хотя и пишут что вроде как можно раскомментировать пару строк в их файлах чтобы получить нужную частоту я так до конца и не понял что это за строки, да и не интересно это))
0
 Аватар для Shamrel
82 / 80 / 16
Регистрация: 11.03.2016
Сообщений: 206
09.05.2017, 18:56
Ну дык необязательно использовать нагенерированное кубом в боевом проекте. На нем же можно учиться. Там довольно таки внятная инициализация клоков.

Генерируете Кубом, проверяете, что все заводится. Смотрите на код Куба, смотрите на свой код, потом опять на код куба, потом опять на свой ... И Бах! Озарение!
У меня так работает.
Главное, обязательно проверьте, что код Куба заводится. К сожалению, бывают и промашки и магия.
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
10.05.2017, 10:00
ИМХО: делать код без библиотек, чисто на регистрах, да еще и не используя их мнемонические названия из заголовочного файла, конечно похвально, но боюсь, что здесь ни кто такой подвиг не совершал.
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
10.05.2017, 12:48
Цитата Сообщение от Витальич Посмотреть сообщение
что здесь ни кто такой подвиг не совершал.
Совершить то, может и не трудно, но трудоемко. Проверить код написанный напрямую к регистрам и так-то трудоемко (на память их не помню все, тем более их значения), а по прямым адресам тем паче. Просто физически не имею времени чтобы проверить весь код с даташитом наперевес. Хотя вроде задача поднятия тактирования тривиальная.

Не по теме:

Представляю как выглядит код настройки ацп или DMA...вообще глаза разбегутся))

0
210 / 163 / 36
Регистрация: 15.11.2012
Сообщений: 788
08.06.2017, 01:06
По строке hse_rdy = *(unsigned long*)(0x40021000) & 0x00020000 >> 16;
операция >> имеет приоритет выше &, поэтому ваше выражение фактически получается таким:
hse_rdy = *(unsigned long*)(0x40021000) & (0x00020000 >> 16);
Бит 0x0002 (HSI_RDY) в RCC_CR первоначально всегда установлен, поэтому проверка сразу проходит, да не та.
Я вообще не понимаю зачем вам нужен этот сдвиг - проверяйте просто 0x20000.
Когда-то я читал, что тип int для 32-разрядных контроллеров работает быстрее, чем char (фактически он все равно приводится к int, на что тратится время), поэтому hse_rdy вполне можно сделать типом int.

Также не понятно, почему вы считаете, что за 12 циклов начальной проверки внешний кварц уже заведется. В datasheet на stm32f103 (раздел электрических параметров, в моем случае страница 53 из 117) сказано про типовое время стабилизации в 2 мс - это явно больше по времени, чем ваши 12 циклов проверки.

Теперь о Миландре. Не знаю, какой будете юзать Вы, но мой опыт использования 1986ве1 выявил проблемы в работе с внешней памятью. В Errata этого нет.

Добавлено через 11 минут
И кстати вот еще:
while((*(unsigned long*)(0x40021000) & 0x04000000)); //ждем пока бит PLLRDY регистра RCC_CR установится.
//тут есть первая странность, почему-то PLLRDY не устанавливается
Тоже ничего странного в принципе, поскольку бит PLLRDY 0x02000000, а не 0x04000000.

Добавлено через 4 минуты
А поскольку к моменту выполнения строки
*(unsigned long*)(0x40021004) |= 0x00000002; //устанавлтваем биты SW регистра RCC_CFGR в 0x10
//что соответствует установке PLL в качестве источника тактирования
ни кварц, ни ФАПЧ еще так и не завелся, то она игнорируется. Вот у Вас все и работает на 8 МГц внутреннего клока.
0
 Аватар для shepard127
16 / 16 / 1
Регистрация: 20.10.2013
Сообщений: 81
20.07.2017, 16:31
Помню я так начинал разработку(как автор) под F100, уххх... Сколько волос я выдрал у себя на голове(и не только)... Потом по касательной работал с STL, потом HAL. Сейчас RTOS учу

Товарищ автор, мой вам совет... Используйте хотя бы
Цитата Сообщение от Витальич Посмотреть сообщение
мнемонические названия из заголовочного файла
... на скорость это не повлияет, но глаза хоть выедать не будет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.07.2017, 16:31
Помогаю со студенческими работами здесь

Не могу найти инструкцию по настройке Dlink DVG N5402GF на прошивке от длинка В часности настройке Voip шлюза
Не могу найти инструкцию по настройке Dlink DVG N5402GF на прошивке от длинка В часности настройке Voip шлюза

Не могу разобраться с DFU-bootloader в STM32. Плата видна на USB шине, но dfu-util ее не видит
Привет, народ. Пытаюсь разобраться как прошивать плату STM32F103C8T6 (Blue Pill) по miniUSB-кабелю. Свои изыскания я записываю...

Не могу разобраться с загрузкой данных из файлов,и чтоб в дальнейшем с ними мжно было работать как с массивом,не могу разобраться(
void __fastcall TPoisk::Button3Click(TObject *Sender) { Memo2-&gt;Lines-&gt;Clear(); x=StrToInt(Edit3-&gt;Text); for (i=0;i&lt;100;i++) { ...

Задали работу, не могу разобраться. Используется делфи 10, не могу разобраться, как это сделать
В одномерном массиве, состоящем из n вещественных элементов, вычислить: минимальный элемент массива и сумму элементов массива,...

Поомгите разобраться с CAN в stm32
Помогите, опжалуйста, разобраться с CANом для stm32. Постановка задачи следующая. Есть отладочная плата sk-mstm32f107 и самодельная...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru