Злой кот заценит!
Изучение STM32
- Реклама
- Andrew Martin
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
Re: Изучение STM32
За наводку на stm32snippets спасибо 
-
Chettuser
Re: Изучение STM32
Как в STM32F103 задействовать GPIO через DMA? В каком режиме - Mem2Mem или Periph<->Mem? В RM0008 ничего не нашёл как привязать DMA к GPIO.
Re: Изучение STM32
Periph<->Mem
-
Chettuser
Re: Изучение STM32
Чем отличаются Cristal-less USB от обычного в F070? Перевод с английского не пойму нифига, да и отличия что то никак не осознаются...


- Реклама
Re: Изучение STM32
Chettuser, без внешнего кварца, очевидно же. Стабильность внутреннего осциллятора на высоте...
-
Chettuser
Re: Изучение STM32
Тьху, б..я! Кто ж знал что "Crystal" имелось ввиду кварц! Сенкс, сэр.
-
Chettuser
Re: Изучение STM32
Продублирую вопрос тут:
Застрял с настройкой HSE+PLL. Чего я натворил? Вроде всё по RM с регистров переписывал.
Спасибо.
Застрял с настройкой HSE+PLL. Чего я натворил? Вроде всё по RM с регистров переписывал.
Спойлер
Код: Выделить всё
RCC->CR |= RCC_CR_HSEON; // Включить HSE
while((RCC->CR & RCC_CR_HSERDY) == 0) {} // Ждём включения HSE
RCC->CFGR2 |= RCC_CFGR2_PREDIV1_DIV1; // Предделитель PLL отключён
RCC->CFGR |= RCC_CFGR_PLLSRC_HSE_PREDIV; // Используем HSE для PLL
RCC->CFGR |= RCC_CFGR_HPRE_DIV1; // SYSCLK без деления
RCC->CFGR |= RCC_CFGR_PPRE_DIV1; // HCLK без деления
// RCC->CFGR |= (uint32_t) (RCC_CFGR_SW_HSE);
// while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSE) {}
RCC->CR &= (uint32_t)(~RCC_CR_PLLON); // Отключаем PLL
while((RCC->CR & RCC_CR_PLLRDY) != 0) {} // Ждём пока PLL отключится
RCC->CFGR = RCC->CFGR & (~RCC_CFGR_PLLMUL) | (RCC_CFGR_PLLMUL6); // Устанавливаем множитель
RCC->CR |= (uint32_t) (RCC_CR_PLLON); // Включаем PLL
while((RCC->CR & RCC_CR_PLLRDY) == 0) {} // Ждём установления PLL
RCC->CFGR |= (uint32_t) (RCC_CFGR_SW_PLL); // Выбираем PLL как источник
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) {} // Ждём пока PLL включится
RCC->CR |= RCC_CFGR_MCO_SYSCLK; // Включаем на PA8 выход системной частотыRe: Изучение STM32
Код: Выделить всё
FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;Ну и рекомендованная секвенция включения PLL
Код: Выделить всё
if ((RCC->CFGR & RCC_CFGR_SWS) == RCC_CFGR_SWS_PLL) /* (1) */
{
RCC->CFGR &= (uint32_t) (~RCC_CFGR_SW); /* (2) */
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI) /* (3) */
{
/* For robust implementation, add here time-out management */
}
}
RCC->CR &= (uint32_t)(~RCC_CR_PLLON); /* (4) */
while((RCC->CR & RCC_CR_PLLRDY) != 0) /* (5) */
{
/* For robust implementation, add here time-out management */
}
RCC->CR |= RCC_CR_HSEON; // Включить HSE
while((RCC->CR & RCC_CR_HSERDY) == 0) {} // Ждём включения HSE
//RCC->CFGR2 |= RCC_CFGR2_PREDIV1_DIV1; // Предделитель PLL отключён
RCC->CFGR |= RCC_CFGR_PLLSRC_HSE_PREDIV; // Используем HSE для PLL
FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
RCC->CFGR = (RCC->CFGR & (~RCC_CFGR_PLLMUL)) | (RCC_CFGR_PLLMUL6); /* (6) */
RCC->CR |= RCC_CR_PLLON; /* (7) */
while((RCC->CR & RCC_CR_PLLRDY) == 0) /* (8) */
{
/* For robust implementation, add here time-out management */
}
RCC->CFGR |= (uint32_t) (RCC_CFGR_SW_PLL); /* (9) */
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) /* (10) */
{
/* For robust implementation, add here time-out management */
}
}-
Chettuser
Re: Изучение STM32
Увы, нет. Заработал другой код, в котором я пока не разбирался.
Re: Изучение STM32
Что увы??? Это полностью рабочий код.
Скрины с дебагера показать?
Здесь может быть только одно - г. кварц, конденсаторы+косяки в разводке. Для это добавляем задержку при старте HSE. У меня компоненты отличные и заводится все на раз
Скрины с дебагера показать?
Здесь может быть только одно - г. кварц, конденсаторы+косяки в разводке. Для это добавляем задержку при старте HSE. У меня компоненты отличные и заводится все на раз
Последний раз редактировалось dosikus Ср окт 05, 2016 19:12:55, всего редактировалось 1 раз.
-
Chettuser
Re: Изучение STM32
Не спорю. Пытаюсь разобраться сам почему так.
В любом случае спасибо за помощь.
В любом случае спасибо за помощь.
Re: Изучение STM32
Да, и камень то какой? У меня F072C8 , у других есть небольшие отличия в источниках PLL.
-
Chettuser
Re: Изучение STM32
Да похожий, F030. Некогда сейчас, потом разберусь. Пойду спать. 
Re: Изучение STM32
F030 , именно в нем по другому. Завтра буду смотреть...
Re: Изучение STM32
Хорошим примером будет функция SetSysClock. Она точно работает.
Код: Выделить всё
static void SetSysClock(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
/* Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
if ((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01)
{
/* Enable Prefetch Buffer and set Flash Latency */
FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
/* HCLK = SYSCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* PCLK = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;
/* PLL configuration = HSE * 6 = 48 MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);
/* Enable PLL */
RCC->CR |= RCC_CR_PLLON;
/* Wait till PLL is ready */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/* Wait till PLL is used as system clock source */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
{
}
}
else
{ /* If HSE fails to start-up, the application will have wrong clock
configuration. User can add here some code to deal with this error */
}
}Re: Изучение STM32
Мурик, хорошим примером будет в отладчике смотреть что и как и где виснет.
Приведенная тобой функция имеет отличие только в таймауте ожидания HSE.
И она не универсальная, в линейке F0 есть отличия в системе тактирования и существенные.
Кстати - возьми даташит и RM и проштудируй сей вопрос - найди Clock tree и води пальцем от HSE до System clock...


Приведенная тобой функция имеет отличие только в таймауте ожидания HSE.
И она не универсальная, в линейке F0 есть отличия в системе тактирования и существенные.
Кстати - возьми даташит и RM и проштудируй сей вопрос - найди Clock tree и води пальцем от HSE до System clock...


Re: Изучение STM32
Если HSE не работает (кварц не запускается или его вовсе нет) программа не повиснет в цикле, в отличие от кода Chettuser и от вашего кстати тоже. Правда частота будет 8 МГц.dosikus писал(а):Приведенная тобой функция имеет отличие только в таймауте ожидания HSE.
Функция для F030 и совместимых с ним.dosikus писал(а):И она не универсальная
Re: Изучение STM32
Мурик, вот когда допишешь эти хотелки , тогда оно и сбудется .
См последнее else.
Запомни, эти функции лишь для изучения и мы с Chettuser отлаживаем основы.
Вот когда они заработают, можно и обслугу писать но не так как в примере а с прерываниями на CSS.
Та же ситуация и с SPL и HAL, наивно полагать что там уже все законченно-совершенно ...
См последнее else.
Запомни, эти функции лишь для изучения и мы с Chettuser отлаживаем основы.
Вот когда они заработают, можно и обслугу писать но не так как в примере а с прерываниями на CSS.
Та же ситуация и с SPL и HAL, наивно полагать что там уже все законченно-совершенно ...
Re: Изучение STM32
Я написалdosikus писал(а):См последнее else.
Если нужно, не составляет труда дописать код, включающий PLL и умножающий частоту HSI до необходимой.Мурик писал(а):Правда частота будет 8 МГц.


