Изучение STM32

Кто любит RISC в жизни, заходим, не стесняемся.
Chettuser

Re: Изучение STM32

Сообщение Chettuser »

Нет, вот такие - [bred][/bred]
Злой кот заценит! :)))
Реклама
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

Re: Изучение STM32

Сообщение Andrew Martin »

За наводку на stm32snippets спасибо :)
Реклама
Chettuser

Re: Изучение STM32

Сообщение Chettuser »

Как в STM32F103 задействовать GPIO через DMA? В каком режиме - Mem2Mem или Periph<->Mem? В RM0008 ничего не нашёл как привязать DMA к GPIO.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Изучение STM32

Сообщение dosikus »

Periph<->Mem
Реклама
Эиком - электронные компоненты и радиодетали
Chettuser

Re: Изучение STM32

Сообщение Chettuser »

Чем отличаются Cristal-less USB от обычного в F070? Перевод с английского не пойму нифига, да и отличия что то никак не осознаются... :(
Изображение
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Изучение STM32

Сообщение dosikus »

Chettuser, без внешнего кварца, очевидно же. Стабильность внутреннего осциллятора на высоте...
Реклама
Chettuser

Re: Изучение STM32

Сообщение Chettuser »

Тьху, б..я! Кто ж знал что "Crystal" имелось ввиду кварц! Сенкс, сэр.
Chettuser

Re: Изучение STM32

Сообщение Chettuser »

Продублирую вопрос тут:
Застрял с настройкой 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 выход системной частоты
Спасибо.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Изучение STM32

Сообщение dosikus »

Код: Выделить всё

FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
Перед - конфигом множителя PLL. Системная тактовая уже больше 24МГц...

Ну и рекомендованная секвенция включения 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

Сообщение Chettuser »

Увы, нет. Заработал другой код, в котором я пока не разбирался.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Изучение STM32

Сообщение dosikus »

Что увы??? Это полностью рабочий код.
Скрины с дебагера показать?
Здесь может быть только одно - г. кварц, конденсаторы+косяки в разводке. Для это добавляем задержку при старте HSE. У меня компоненты отличные и заводится все на раз
Последний раз редактировалось dosikus Ср окт 05, 2016 19:12:55, всего редактировалось 1 раз.
Chettuser

Re: Изучение STM32

Сообщение Chettuser »

Не спорю. Пытаюсь разобраться сам почему так.
В любом случае спасибо за помощь.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Изучение STM32

Сообщение dosikus »

Да, и камень то какой? У меня F072C8 , у других есть небольшие отличия в источниках PLL.
Chettuser

Re: Изучение STM32

Сообщение Chettuser »

Да похожий, F030. Некогда сейчас, потом разберусь. Пойду спать. :)
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Изучение STM32

Сообщение dosikus »

F030 , именно в нем по другому. Завтра буду смотреть...
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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 */
  }
}
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Изучение STM32

Сообщение dosikus »

Мурик, хорошим примером будет в отладчике смотреть что и как и где виснет.

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



Изображение
Изображение
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Изучение STM32

Сообщение Мурик »

dosikus писал(а):Приведенная тобой функция имеет отличие только в таймауте ожидания HSE.
Если HSE не работает (кварц не запускается или его вовсе нет) программа не повиснет в цикле, в отличие от кода Chettuser и от вашего кстати тоже. Правда частота будет 8 МГц.
dosikus писал(а):И она не универсальная
Функция для F030 и совместимых с ним.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Изучение STM32

Сообщение dosikus »

Мурик, вот когда допишешь эти хотелки , тогда оно и сбудется . :)))
См последнее else.
Запомни, эти функции лишь для изучения и мы с Chettuser отлаживаем основы.
Вот когда они заработают, можно и обслугу писать но не так как в примере а с прерываниями на CSS.
Та же ситуация и с SPL и HAL, наивно полагать что там уже все законченно-совершенно ...
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Изучение STM32

Сообщение Мурик »

dosikus писал(а):См последнее else.
Я написал
Мурик писал(а):Правда частота будет 8 МГц.
Если нужно, не составляет труда дописать код, включающий PLL и умножающий частоту HSI до необходимой.
Ответить

Вернуться в «ARM»