STM32F4 Есть вопросы.

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Имеется STM32F4DISCOVERY. Пытаюсь запустить простейший код на F4 с помощью gcc + Eclipse. IDE настроил, дебаггер тоже, вроде всё нормально компилится и запускается. Код простейший, по миганию светодиодами. Проблема в том, что я не понял, как настроить тактирование или что-то в этом роде.

Дебаггер сначала показывает выполнение кода в startup_stm32f4xx.s (вроде так и должно быть), затем вызывает функцию SetSysClock, где зацикливается на этом месте:

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

static void SetSysClock(void)
{
/******************************************************************************/
/*            PLL (clocked by HSE) used as System clock source                */
/******************************************************************************/
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* 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)); // <<<<<<<<<<<<<<<<<<<<<<
То есть, как я понял, флаг RCC_CR_HSERDY не поднимается. И всё, до main() так и не доходит.

В чём может быть проблема? В проекте всё по дефолту, ничего не менял.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Сообщение md5sum »

Ну так, как это аппаратный флаг :
Set by hardware to indicate that the HSE oscillator is stable.
то думаю что что-то с кварцем...

Можно закомментить эту строчку. МК запустится от внутреннего генератора.
— Не говорите мне что делать и я не скажу куда Вам идти...
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Угу, уже нарыл. Похоже не заводится генератор. Кстати, а почему он может не завестись?

Так еще фишка в том, что анализируется константа HSE_STARTUP_TIMEOUT, которая по дефолту равна 0x00500, т.е. как я понял, код должен подождать некоторое время, пока заведётся генератор, если он не завёлся - стартануть как есть. Но стоял полчаса, так ничего и не произошло :)
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Блин, ничего не понимаю...
Когда закомментировал условие, стало происходить странное:

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

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01; <<<< Эта строка выполняется
  }
  else
  {
    HSEStatus = (uint32_t)0x00;  <<<<< Эту проскакиваем
  }
По идее должно быть HSEStatus == 1. Но следом:

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

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */
    RCC->APB1ENR |= RCC_APB1ENR_PWREN;
    PWR->CR |= PWR_CR_VOS;
   
    Далее идёт настройка PLL
Но условие не выполняется, весь код настройки пропускается, и попадаем в бесконечный цикл в startup_stm32f4xx.s

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

 * @brief  This is the code that gets called when the processor receives an 
 *         unexpected interrupt.  This simply enters an infinite loop, preserving
 *         the system state for examination by a debugger.
*/
    .section  .text.Default_Handler,"ax",%progbits
Default_Handler:
Infinite_Loop:
  b  Infinite_Loop
  .size  Default_Handler, .-Default_Handler


Вообще ничего не понимаю :(
Есть у кого-нибудь рабочий пример включения светодиода под F4? Со всеми инклудами?
Реклама
Эиком - электронные компоненты и радиодетали
Держит паяльник хвостом
Аватара пользователя
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Сообщение SubDia »

Если бы это не была заводская плата, я бы порекомендовал обратить внимание на кварц и его обвязку. Из какого проекта этот system_stm32f4xx.c?
Кстати, можно сгенерить system с помощью STM32F4xx_Clock_Config (это чтоб не тратить время на настройку врукопашную), воткнуть в проект и глянуть.
ЗЫ. Рука дернулась, не успел прочитать последнее добавленное сообщение, как нажал кнопку.
ЗЗЫ. Могу написать быстренько "мигалку". Могу под FreeRTOS :)))
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Из какого проекта этот system_stm32f4xx.c?
Взял с сайта ST, в стандартной библиотеке был:
CMSIS/Device/ST/STM32F4xx/Source/Templates
Могу написать быстренько "мигалку". Могу под FreeRTOS
Не, уж лучше на голом асме :)))

Вообще, для пустого проекта (ну, с библиотекой периферии) что нужно?

--------------

Я уж жалею, что не прикупил до кучи ни одного дешевенького F100. Плата макетная под него есть, ST-LINK есть, и под него куча примеров. А тут с нуля на F4...
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Сообщение SubDia »

Там, конечно, указана частота HSE 25 MHz, но мой текущий проект (с HSE на 8 МГц) запустился и с этим system_stm32f4xx.c филиком.
ploop писал(а):Вообще, для пустого проекта (ну, с библиотекой периферии) что нужно?
В смысле что должно быть включено в проект?
Startup_...s, system_...c, stm32f4xx.h (этот хидер уже в мэйне должен быть подключен). Ну а из периферии - все исходники, что планируется использовать.
Только я что вспомнил - я-то в IAR работаю.
ploop писал(а):Я уж жалею, что не прикупил до кучи ни одного дешевенького F100.
А у меня как раз ненужные плесенью покрываются..
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Может кто подскажет, как вообще не трогать эти все PLL и настройки тактирования, а запустить как-нибудь по дефолту? Чтобы хоть в свой main() попасть, а дальше уж потихоньку разбираться буду.
Друг Кота
Аватара пользователя
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Сообщение Satyr »

Ну, забей пока на HSE, Пуская на HSI -))
Можно с PLL, можно без, но медленно -))

Если на медленно пофиг - просто закоменть эту функцию на корню, оно изначально на HSI напрямую и стартует. Сколько МГЦ - не помню.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

То есть закомментить её вызов в стартапе? Попробую...
Друг Кота
Аватара пользователя
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Сообщение Satyr »

Собсно если не пользуешь критичные к стабильности и точности частоты интерфейсы, вобще можно на HSI жить ни в чем себе не отказывая - PLL там с HSI и HSE, насколько помню, заводится без ограничений.
Друг Кота
Аватара пользователя
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Сообщение Satyr »

ploop писал(а):То есть закомментить её вызов в стартапе? Попробую...
Да.
Вот только точно не помю - стартует с HSI или, так сказать, LSI - вроде там два RC генератора.
Друг Кота
Аватара пользователя
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Сообщение Satyr »

Вощем, несколько помню, если ничего не будешь трогать, то оно у тебя со старту будет на 16Мгц непосредственно с HSI молотить.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Вощем, несколько помню, если ничего не будешь трогать, то оно у тебя со старту будет на 16Мгц непосредственно с HSI молотить.
Я изначально ничего не трогал, всё по дефолту - и не работает вообще. В этом и проблема.
Собсно если не пользуешь критичные к стабильности и точности частоты интерфейсы, вобще можно на HSI жить ни в чем себе не отказывая
Мне пока как бы просто запустить. Знаю, что всю периферию там тактировать отдельно придётся, так что к этому вопросу серьёзно подойти.
А то плата почти неделю лежит, а мне даже светодиодами помигать не удалось...
Друг Кота
Аватара пользователя
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Сообщение Satyr »

ploop писал(а):
Вощем, несколько помню, если ничего не будешь трогать, то оно у тебя со старту будет на 16Мгц непосредственно с HSI молотить.
Я изначально ничего не трогал, всё по дефолту - и не работает вообще. В этом и проблема.
Не трогать барахло кристалла, а не исходники имеется ввиду :)))
Друг Кота
Аватара пользователя
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Сообщение Satyr »

Ну выкинь пока этот сетклок и все
Друг Кота
Аватара пользователя
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Сообщение Satyr »

Хотя я ST32F1 и ST32F2 (а по RRC и 4й не отличается) пробовал и HSI, и HSI c PLL, и HSE с PLL - проблем не было.
Ну, только что я никаких примеров не собирал, я ж платы только сам рисовал. Нет демоплаты и примеров - нет проблемы :)))
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Офигеть! Причина в том, что дебаг не может пройти любой цикл! Например такой:

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

  for (i=0; i<5; i++)
  {
	  //
  }
Зацикливается намертво. Буду рыть дальше чтобы понять из-за чего...
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Фигня какая-то...

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

  i=2;
  do
  {
	  i++;
  } while (i<6);

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

08000478:   mov.w r3, #2
0800047c:   str r3, [r7, #12]
23        	  i++;
0800047e:   ldr r3, [r7, #12]
08000480:   add.w r3, r3, #1
08000484:   str r3, [r7, #12]
24          } while (i<6);
08000486:   ldr r3, [r7, #12]
08000488:   cmp r3, #5
0800048a:   ble.n 0x800047e <main+18>
Код прыгает в этом цикле, и никогда из него не выходит. Постоянно возвращается на адрес 0800047e. В дебаггере видно, что регистр r3 постоянно обнуляется при переходе, хотя специально инициализировал его двойкой, чтобы заметно было. Просто мистика...
Что означают команды ldr/str?
----
Load/Store Register. Аналоги LDS/STS AVR'овских.
в чём тогда дело? :dont_know:
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Сообщение md5sum »

Лови пример:
discovery.zip
(162.75 КБ) 495 скачиваний
моргает светодиодом на D15.
Если заработает (у меня работает), то будем искать отличия с твоим исходником :))
— Не говорите мне что делать и я не скажу куда Вам идти...
Ответить

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