Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keil и STM32
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > Keil
mihlit
Доброго времени суток всем!
Взялся за STM32 совсем недавно, поэтому прошу быть снисходительными к моим вопросам.
Перед STM32 были 8-битные AVR (у меня) на AVR Студии 4.19. Там в свойствах проекта выбираешь камень и частоту и пошел создавать проект. А как выбрать частоту в Keil? Задавая ее в окошке "Xtal"? А как мне сообщить нужную мне частоту SYSCLK?
Я не хочу использовать CubeMx (тут как раз все просто), как до него решались вопросы с тактированием?
Извините если спросил глупость, с Keil я еще очень на "вы". help.gif
ViKo
Xtal - она для симулятора имеет смысл.
А как программируется системная частота SYSCLK, смотрите в SystemInit функции. Согласно Reference Manual на МК.
Не хотите в CubeMX, в Run-Time Environment в Keil жмите галки. Чтобы чисто с пустого каталога проект создать, так я не делал. Правда, потом я все равно свою функцию SystenInit сочиняю.
mihlit
Reference Manual или Programming manual? Я вот как раз сейчас "курю" RM0090 для STM32F4xx, так там одно железо, в смысле регистры.
А "галок" я "наставился" в CubeMx. Мне хочется разобраться не не уровне "высоких абстракций HAL", а на уровне регистров.
ViKo
RM, раздел RCC.
Кроме регистров и памяти, в МК ничего больше программно недоступно. rolleyes.gif
x893
А если посмотреть, что делает Cube по F11 для инициализации RCC и потом сверится с RM.
И нести полученные знания по жизни.
Но это такая мелкая часть реального проекта, что даже непонятно зачем тратить на это время.
ViKo
Я тоже стараюсь всё по регистрам писать, безо всяких Кубов с прочими.
А где нажать F11, чтобы посмотреть? F1?
mihlit
Вот как раз сейчас и копаю RCC. Видел где-то в инете, что STM можно разогнать, решил попробовать. Простейший пример с диодами.
Запускаю проект в отладчике кейла, смотрю состояние регистров конфигурации и сразу первая непонятка:
PREDIV2 = 0x04 (деление на 5 ?)
PREDIV1 = 0x04 (деление на 5 ?)
PLL2MUL = 0x06 (умножение на 8)
PLLMUL = 0x07 (умножение на 9)
Считаю частоту - получается 23,04MHz ? Или я что-то упускаю из виду. Ткните-пните плиз.
ViKo
Вот так делаю для STM32F207.
CODE
inline void SysClk_init(void)
{
/* Reset and disable RCC Interrupts, on HSI and HSE, switch to HSI */
RCC->CIR = 0xFFFF0000;
RCC->CR |= RCC_CR_HSION | RCC_CR_HSEON;
while ((RCC->CR & RCC_CR_HSIRDY) != RCC_CR_HSIRDY) { }
RCC->CFGR &= ~RCC_CFGR_SW;
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI) { }

/* Off PLL, set clock dividers */
RCC->CR &= ~RCC_CR_PLLON;
RCC->CFGR =
RCC_CFGR_SW_0 * 0 | // System clock Switch: HSI
RCC_CFGR_HPRE_0 * 0 | // AHB prescaler: SYSCLK / 1 = 120 MHz
RCC_CFGR_PPRE1_0 * 5 | // APB1 prescaler: AHB / 4 = 30 MHz
RCC_CFGR_PPRE2_0 * 4 | // APB2 prescaler: AHB / 2 = 60 MHz
RCC_CFGR_RTCPRE_0 * 0 | // HSE division factor for RTC clock
RCC_CFGR_MCO1_0 * 3 | // MCO1: PLL clock selected
RCC_CFGR_I2SSRC * 0 | // I2S clock selection: PLLI2S clock used
RCC_CFGR_MCO1PRE_0 * 5 | // MCO1 prescaler: PLL / 3 = 40 MHz
RCC_CFGR_MCO2PRE_0 * 5 | // MCO2 prescaler: SYSCLK / 3 = 40 MHz
RCC_CFGR_MCO2_0 * 0; // MCO2: System clock selected
RCC->PLLCFGR =
RCC_PLLCFGR_PLLM_0 * 4 | // Div factor for PLL input: HSE / 4 = 2 MHz
RCC_PLLCFGR_PLLN_0 * 120 | // PLL mult factor for VCO: 240 MHz
RCC_PLLCFGR_PLLP_0 * 0 | // PLL div factor for system clock: VCO / 2 = 120 MHz
RCC_PLLCFGR_PLLSRC * 1 | // PLL and PLLI2S clock source: HSE
RCC_PLLCFGR_PLLQ_0 * 5; // PLL div factor for USB OTG FS...: VCO / 5 = 48 MHz

/* Check HSE on, on PLL, set Flash Latency */
while ((RCC->CR & RCC_CR_HSERDY) != RCC_CR_HSERDY) { }
RCC->CR |= RCC_CR_PLLON;
FLASH->ACR =
FLASH_ACR_LATENCY_3WS | // Three wait states
FLASH_ACR_PRFTEN * 1 | // Prefetch enable
FLASH_ACR_ICEN * 1 | // Instruction cache enable
FLASH_ACR_DCEN * 1 | // Data cache enable
FLASH_ACR_ICRST * 0 | // Instruction cache reset
FLASH_ACR_DCRST * 0; // Data cache reset

/* Check PLL on, switch to PLL */
while ((RCC->CR & RCC_CR_PLLRDY) != RCC_CR_PLLRDY) { }
RCC->CFGR |= RCC_CFGR_SW_PLL;
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) { }
}


Цитата(mihlit @ Apr 12 2018, 17:27) *
Считаю частоту - получается 23,04MHz ? Или я что-то упускаю из виду. Ткните-пните плиз.

В Cube смотрите картинку с частотами, она на живая.
x893
Вот сразу видно мастера !

Интересно, что произойдет, если кварц отвалится от вибрации (например), а устройство стоит хрен знает где ?
ViKo
Цитата(x893 @ Apr 12 2018, 17:31) *
Интересно, что произойдет, если кварц отвалится от вибрации (например), а устройство стоит хрен знает где ?

У меня? Если кварц отвалится, нормальной работы уже не будет. HSI автоматически включится при сбое HSE.
Мои устройства стоят на столе.
mihlit
"Интересно, что произойдет, если кварц отвалится от вибрации (например), а устройство стоит хрен знает где ?"
Согласно RM, если включен контроль частоты, МК отключит HSE и перейдет на HSI/
x893
Можно и так конечно, а можно использовать HSI и пискнуть создателю последним писком, что мол - моему кварцу капец - выручай ! Про кварц это просто пример, таких моментов много есть. Как и Создателей.
Это не зависит от HAL/SPL/CMSIS - это просто подход другого уровня.
Хотя если лампочкой моргать - то пофиг.
jcxz
Цитата(x893 @ Apr 12 2018, 17:31) *
Интересно, что произойдет, если кварц отвалится от вибрации (например), а устройство стоит хрен знает где ?

А если отвалится сам МК? Или ещё 100500 остальных элементов схемы? Как Вы такую проблему решаете?

Цитата(x893 @ Apr 12 2018, 17:41) *
Можно и так конечно, а можно использовать HSI и пискнуть создателю последним писком,

А если отвалится пискалка? Чем будете пищать? Да ещё так, чтобы услышали "хрен знает где"?
x893
поставлю 3 в ряд и отряд не заметит потери.
Хотя если ядерный удар, то ничего не спасет наверное.

Есть понятие - минимально необходимое оборудование.
mihlit
Ввел Вас в заблуждение:
PREDIV2 = 0x04 (деление на 5 ?)
PREDIV1 = 0x04 (деление на 5 ?)
PLL2MUL = 0x06 (умножение на 8)
PLLMUL = 0x07 (умножение на 9)
это все относится к STM32f105rbt6, а не к STMf407/
ViKo
У меня на плате есть и пищалка. Есть светодиод тестовый. Есть и другие устройства индикации и сигнализации и связи с миром, много разных.
Да, кстати... имею загрузчик, так вот в нем думаю наделать проверок-тестов на все, на что фантазии хватит. Все равно целый сектор флэш-памяти под него занят.
А показанная выше функция стоит в основной программе, с исправным резонатором.
mihlit
Уважаемые гуру! Про меня не забудьте!!!!!
Как написать SysInit Вы мне объяснили. Почему получается частота 23,04 MHz ?
jcxz
Цитата(mihlit @ Apr 12 2018, 17:50) *
Как написать SysInit Вы мне объяснили. Почему получается частота 23,04 MHz ?

Может какие-нить гуру тут и есть, но телепатов точно нет.
ViKo
Я же дал совет - сходите в Куб, проверьте свои установки.
x893
И посмотрите, что пишется в регистры. Потом оставьте, что нужно.
Вот и весь совет.
mihlit
Вы наверное меня не поняли.

int main(void)
{
SystemInit();
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
RCC_APB2Periph_GPIOE, ENABLE);

и т.д.
Я еще ничего не делаю в RCC.
После выполнения первой строки смотрю состояние регистров RCC и вижу (сообщение #7).
почему умножение на 5 в PLLах?

Очепятка не умножение - деление и не PLL а PREDIV1 и PREDIV2 СОРИ!!!!
x893
Так и посмотрите что в SystemInit делается - в чем проблема ?
И начинайте не с main() а c Reset_Handler
HardEgor
Цитата(mihlit @ Apr 12 2018, 22:22) *
Вы наверное меня не поняли.

Как вы получили число 23.04? Измерили? Просто посчитали?
У вас только регистры PLL и прескалеров.
Какой генератор? HSE? HSI? PLL включен? Частота на PLL заведена? Частота с PLL выведена?
mihlit
Спасибо за ответы. Еще один последний вопрос про бит PLLXTPRE регистра CFGR. Пытаюсь перевести описание в RM - как-то не очень получается. Можете объяснить троечнику по англ. языку?

Цитата(HardEgor @ Apr 12 2018, 15:58) *
Как вы получили число 23.04? Измерили? Просто посчитали?
У вас только регистры PLL и прескалеров.
Какой генератор? HSE? HSI? PLL включен? Частота на PLL заведена? Частота с PLL выведена?


Посчитал, исходя из данных полей PREDIV1, PREDIV2, PLL2MUL, PLLMUL в регистре CFGR2. Напротив PREDIV1SRC галочка, значит на PREDIV1 подается сигнал с PLL2MIL.
HardEgor
Цитата(mihlit @ Apr 12 2018, 23:14) *
Спасибо за ответы. Еще один последний вопрос про бит PLLXTPRE регистра CFGR. Пытаюсь перевести описание в RM - как-то не очень получается. Можете объяснить троечнику по англ. языку?

Смотрите на схему "Clock Tree" - там все биты указаны.
PLLXTPRE включает деление HSE на 2. А ну да, у вас же connectivity, у них изменение бита PLLXTPRE уменьшает или увеличивает PREDIV1 в 2 раза.
Но все ваши расчеты не имеют смысла без значений PREDIV1SCR, PLLSCR, SW - они выбирают какую частоту делить и умножать. может быть вы не понимаете что такое мультиплексор?
mihlit
С утра на свежую голову разобрался. В файле system_stm32f10x.c применяется константа HSE_VALUE = 0x17D7840, т.е. по умолчанию подразумевается кварц 25 MHz, а я при подсчете на бумажке взял 8MHz.
* HSE_VALUE is a constant defined in stm32f1xx.h file (default value
* 8 MHz or 25 MHz, depedning on the product used), user has to ensure
* that HSE_VALUE is same as the real frequency of the crystal used.
* Otherwise, this function may have wrong result.
*
* - The result of this function could be not correct when using fractional
* value for HSE crystal.
Я и себе, и всем Вам голову заморочил. У меня была отладочная плата с STM32F103RBT6. Во время первых опытов я благополучно спалил ее, подав +5 прямо на камень. Родной замены в наших магазинах не нашел, только 105RBT6. По ногам подошла, платку дальше стал использовать для экспериментов, забыл что и кварц поменять надо. И вот результат - два дня опухшей головы и Вам головы морочил.
Еще раз прошу прощения за свою невнимательность и забывчивость.
Всем удачи и успеха!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.