|
Начинаю осваивать ARM, Собрался простой проект на STM32F4-DISCO, но он не работает как надо |
|
|
|
Nov 16 2016, 16:18
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-08-08
Из: Томск
Пользователь №: 39 559

|
Все привет! Изучаю программирование ARM-контроллеров, в частности STM32. Решил пойти следующим путем: STM32F4-DISCOVERY + ARM-NONE-EABI-GCC + собственный Makefile Выбор пал на GNU дабы использовать не коммерческие САПРы Собственный Makefile позволяет контроллировать этапы сборки. Собрал простой проект: инициализация системы (HAL_init и тактирование), ну и помыргать светодиодами. Проект собирается без ошибок, загорается светодиод, но такое впечатление, что когда доходит до цикла моргания светодиодами - виснет. И я заступорился - куда копать... Привожу проект полностью Подозрения падают на инициализацию тактирования, а также не неверный старт-ап или скрипт сборки... Может, местные Гуру подскажут что-нить дельное?) Так же отдельно приведу код main.c чтобы не качать полностью архив из-за одного файла: CODE #include "stm32f4xx.h" #include "stm32f4xx_hal.h"
static void GPIO_init(void); static void SystemClock_Config(void); static void Error_Handler(void);
int main(void) { //////////////////////////////////////////////////////////////////////////// //Libraries initialization - Инициализация библиотек HAL_Init(); //GPIO initialization - Инициализация портов ввода/вывода GPIO_init(); //Clock initialiaztion - Инициализация системы тактирования SystemClock_Config(); long cnt = 0; while(1) { if (cnt == 100) {cnt = 0;} else {cnt = cnt + 1;} if (cnt <= 50) HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET); else HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET); /* HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET); HAL_Delay(1000); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET); HAL_Delay(1000); */ } }
static void GPIO_init(void) { /////////////////////////////////////////////////////////////////////////// GPIO_InitTypeDef GPIO_InitStruct; /* Enable the GPIO_LED Clock */ __GPIOD_CLK_ENABLE(); /* Configure the GPIO_LED pin */ GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15|GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET); //HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET); //HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET); }
static void SystemClock_Config(void) { RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitTypeDef RCC_OscInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); //////////////////////////////////////////////////////////////////////////// //Set External High-speed oscillator type - Установка типа генератора - у нас имеется внешний кварц 8МГц RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; //SysClk = 8(HSE) / PLLM / RCC_PLLP_DIV2 * PLLN = 168 MHz RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } //////////////////////////////////////////////////////////////////////////// RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV4; if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); }
static void Error_Handler(void) { /* Turn LED5 on */ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET); while(1) { } }
void _exit(int i) { while (1); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET); }
Сообщение отредактировал IgorKossak - Nov 16 2016, 19:35
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
|
|
|
|
|
 |
Ответов
|
Nov 19 2016, 06:57
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-08-08
Из: Томск
Пользователь №: 39 559

|
Цитата(esaulenka @ Nov 16 2016, 19:44)  Предлагаю 1) разобраться, какой же светодиод загорается 2) временно закомментировать инициализацию клоков (оно и так работать будет, только небыстро) 3) временно закомментировать инициализацию HAL'а (а лучше его вообще не использовать. Если там что-то не заработает, на раскопки уйдёт куда больше времени, чем на написание своего велосипеда с нужным для конкретной задачи диаметром колёс). 4) прикрутить отладчик (гуглить "openocd gdb stm32") 2) и 3) Закомментировал сначала //SystemClock_Config(); - эффекта не дало... Закомментировал следом //HAL_Init(); - нужный светодиод (PD15) начал мигать... Вернул в код SystemClock_Config(); - снова все сломалось Согласно логике можно сделать вывод, что инициализация библиотек и схемы тактирования в моем проекте производится неверно... Придется либо разбираться в библиотеках HAL от STM, что геморрой, но и как Вы предложили - геморрой еще тот. Я больше на данном этапе своего ARM-развития, вероятно, предпочту первый вариант... 4) Насколько я знаю прикрутить openocd это тоже довольно сложно (работаю в виндовс), ну что ж буду копать дальше и информировать о сдвигах в положительную сторону. Спасибо! Цитата(Genadi Zawidowski @ Nov 16 2016, 20:29)  Демошка, без HAL. Судя по тому, что уровень моего знания STM довольно низок, писать код не используя HAL довольно сложно - потребуется много времени на штудирование документации а использование HAL от производителя как раз и направлено на, так называемый, быстрый старт... Я по основной специализации - FPGA-шник и сам сторонник, чтобы писать код самостоятельно с нуля, не используя схематик и ip-блоки, чтобы знать досконально что творится в камне, поэтому целиком и полностью понимаю Вас...
Сообщение отредактировал dde29 - Nov 19 2016, 06:58
|
|
|
|
|
Nov 19 2016, 08:02
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (dde29 @ Nov 19 2016, 09:57)  4) Насколько я знаю, прикрутить openocd - это тоже довольно сложно (работаю в виндовс) Вы знаете неправильно. Вот тут есть готовые сборки. Эта ссылка есть на официальном сайте openocd в разделе "где взять openocd". QUOTE (dde29 @ Nov 19 2016, 09:57)  а использование HAL от производителя как раз и направлено на, так называемый, быстрый старт... А его изучать не нужно будет? Ну вот HAL_init() у вас уже быстро стартанул
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 19 2016, 08:25
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 12-08-08
Из: Томск
Пользователь №: 39 559

|
Цитата(Сергей Борщ @ Nov 19 2016, 11:02)  А его изучать не нужно будет? Ну вот HAL_init() у вас уже быстро стартанул  Этот "быстрый" HAL_init() стартанул так, что ничего не работает)))) так что в нем еще поразбираться надо... Цитата(Genadi Zawidowski @ Nov 19 2016, 11:20)  С FPGA altera как раз предпочёл схематик - с простыми элементами понятно, их без разницы - сгенерил автомат или сам написал А + Б. А используя тяжелые блоки вроде CIC и FIR уже привязали накрепко... В случае FPGA, мне кажется, использование средств колирования уровня повыше (схематик) не столь катастрофически гробит производительность процессора, как в случае программ. По специфике моей профессии - нету готовых блоков IP для Альтеры, поэтому привык писать с нуля конфигурации - в этом случае и SignalTap-ом пользоваться удобнее - заранее знаешь к чем прицепиться - но это уже оффтоп)
|
|
|
|
Сообщений в этой теме
dde29 Начинаю осваивать ARM Nov 16 2016, 16:18    Сергей Борщ QUOTE (dde29 @ Nov 19 2016, 11:25) Этот ... Nov 19 2016, 08:38  Genadi Zawidowski Цитата(dde29 @ Nov 19 2016, 09:57) чтобы ... Nov 19 2016, 08:20 Genadi Zawidowski Демошка, без HAL. Nov 16 2016, 17:29 x893 А пройти по шагам отладчиком и посмотреть все 10-2... Nov 19 2016, 09:18 dde29 Вобщем, я понял почему при использовании инициализ... Nov 19 2016, 14:43 AHTOXA Цитата(dde29 @ Nov 19 2016, 19:43) (не та... Nov 19 2016, 14:51  dde29 Цитата(AHTOXA @ Nov 19 2016, 17:51) Да, ш... Nov 19 2016, 15:19   Genadi Zawidowski Цитата(dde29 @ Nov 19 2016, 18:19) Для че... Nov 19 2016, 17:09 Сергей Борщ И бонусом контроллер тратит время на совершенно не... Nov 19 2016, 16:42 dde29 Цитата(Сергей Борщ @ Nov 19 2016, 19:42) ... Nov 19 2016, 17:01 x893 Для изучения можно и mbed использовать.
Когда пони... Nov 19 2016, 19:50 dde29 Благодарю всем за дельные совет! Обязательно у... Nov 20 2016, 05:24 esaulenka Ещё раз посоветую настроить отладчик. Жизнь станет... Nov 21 2016, 09:43 dde29 Цитата(esaulenka @ Nov 21 2016, 13:43) Ещ... Nov 22 2016, 15:32 Genadi Zawidowski Цитатапосоветую настроить отладчик. Жизнь станет г... Nov 22 2016, 16:03 dde29 Цитата(Genadi Zawidowski @ Nov 22 2016, 20... Nov 22 2016, 16:13 esaulenka Цитата(dde29 @ Nov 22 2016, 18:32) Задам,... Nov 23 2016, 08:01
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|