Перейти к содержанию
    

Переезд с STM32F1xx на STM32F4xx Проблемы...

Пытаюсь перетащить код с STM32F1 на F4 и тут у меня возникают проблемы с работоспособностью кода. Понимаю, что где то косяк у меня, но найти не получатся. Дело в том что при отладке по шагам всё работает правильно, а при запуске - происходят не ожидаемые события. 

Как пример функция инициализации портов. Если ходить по шагам, то всё работает. А если запустить, то переписывала те биты, которые не должна была бы. 

void UART_ConfigGPIO(GPIO_TypeDef* GPIO, uint16_t InpPin, uint16_t OutPin)
{
GPIO_InitTypeDef  GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin   = InpPin;         
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  GPIO_Init(GPIO, &GPIO_InitStructure);
...

Т.е.   GPIO_InitStructure содержала ещё GPIO_Speed, GPIO_OType,  GPIO_PuPd, которые я должен был проинициализировать. Но почему то при ходьбе по шагам в них были нули, а при запуске - значение, которое выходило за допустимые.

Собственно вопрос. Сейчас, в зависимости от размещения кода, прога сваливается в WWDG_IRQHandler (). Причем если вставить до запуска RTOS какие нибудь не значащие функции (например задержку, или зажечь свтодиодик), то удается заставить её работать без сбоев. Если поставить брекпоинт на vTaskStartScheduler();  войти в функцию по шагам и потом продолжить выполнение, то тоже всё работает. Какие есть способы поиска этого глюка ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, Digi сказал:

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

А чего Вы хотели от локальной переменной с автоматическим классом памяти?

Цитата

Какие есть способы поиска этого глюка?

Искать состояние гонок а также избавляться от надежды увидеть что-то (вразумительное) там, где по определению может быть все что угодно.

Цитата

...прога сваливается в WWDG_IRQHandler().

У Вас WWDG используется? Иначе получается, что таблицу векторов тоже не перетащили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

GPIO_InitTypeDef  GPIO_InitStructure = {0};

Заставить себя понимать, как работает процессор.

Понятно, что на белом дыму, пока он не выйдет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, Arlleex said:

А чего Вы хотели от локальной переменной с автоматическим классом памяти?

Ожидал одинакового поведения при шаговой отладке и работе проца ))

11 hours ago, Arlleex said:

У Вас WWDG используется? Иначе получается, что таблицу векторов тоже не перетащили.

В том то и дело, что не используется. Более вероятно, что что-то его взводит....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

40 минут назад, Digi сказал:

Ожидал одинакового поведения при шаговой отладке и работе проца ))

Оно и так одинаковое: содержимое неинициализированных автоматических переменных - случайное и в том и в другом случае.  :unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

image.png.05166ca1047cf353e27b06e03e14884c.png

Попадает он в исключение вот так. image.png.c17806e84e1dfb76e2515401c112a1f3.png

Как он там оказывается, не пойму, где смотреть...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В PC попал каким-то чудом адрес модуля GPIO (0x40003800)... Я про таблицу векторов не просто так написал. Может у вас там активируется вектор, которого в новом контроллере нет, и попадает он на вектор обработчика WWDG. Но начать надо, все-таки, с чистки мест от кода, который полагается на какие-то значения, которые в локальных автоматических переменных априори могут получить любое содержимое. Либо проект целиком сюда выложить, авось там не так все страшно. Но если страшно, то нет, конечно, не выкладывайте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 hours ago, Digi said:

Какие есть способы поиска этого глюка ?

Судя по всему вами написанному вам следует тщательно изучать документацию на оба микроконтроллера, чтобы их отличия стали видны. И углубить свои знания по Си (для понимания того, что локальная переменная, созданная в функции, содержит мусор).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

35 minutes ago, haker_fox said:

для понимания того, что локальная переменная, созданная в функции, содержит мусор

Это не к С относится, а к компилятору и runtime.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

38 minutes ago, x893 said:

Это не к С относится, а к компилятору и runtime.

Да вы что? А луна-то круглая) То, чем инициализируются переменные, описано в соответствующих книгах. Иначе бы программировать на этом языке было бы невозможно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 часа назад, Digi сказал:

Т.е.   GPIO_InitStructure содержала ещё GPIO_Speed, GPIO_OType,  GPIO_PuPd, которые я должен был проинициализировать.

Основное отличие программирования F4 от F1 через CubeMX cостоит в том, что в структуре GPIO_InitTypeDef появилось новое поле "Alternate", через которое теперь в явном виде задаются функции пинов порта, отличные от ногодрыга. Например:

GPIO_InitStruct.Alternate = GPIO_AF2_TIM4;

При переходе от F1 на F4 необходимо эти поля проинициализировать для каждого конкретного случая и занулить, если переопределение стандартной функции не используется.

Однако проще всего создать для F4 новый проект, задав в нем системные клоки и описав в нем функции портов. А в уже сгенерированный код добавить всё то. что было у вас прежде написано под F1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Xenia сказал:

Основное отличие программирования F4 от F1 через CubeMX...

А почему Вы решили, что ТС пользуется кубом?:wink: Я тоже люблю телепатию, так что предложу свой более конкретный вариант. Так как довести CPU до состояния, указанному в отладочном окне, не так уж и просто лишь при помощи не заполненных полей GPIO_InitTypeDef, то (глядя на адрес GPIO в PC) мне почему-то кажется, что у него банально во FreeRTOS не хватает стеков задачам, а может стек вовсе не выровнен на 8.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, Arlleex said:

А почему Вы решили, что ТС пользуется кубом?

Учитывая общее обленение населения, такое предположение не лишино смысла)))))) Я тоже потелепатирую чуток)

 

8 minutes ago, Arlleex said:

FreeRTOS не хватает стеков задачам

Если автор её использует, то ему можно включить ловушку в файле FreeRTOSConfig.h

#define configCHECK_FOR_STACK_OVERFLOW	2

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

55 минут назад, Arlleex сказал:

А почему Вы решили, что ТС пользуется кубом?:wink: Я тоже люблю телепатию, так что предложу свой более конкретный вариант. Так как довести CPU до состояния, указанному в отладочном окне, не так уж и просто лишь при помощи не заполненных полей GPIO_InitTypeDef, то (глядя на адрес GPIO в PC) мне почему-то кажется, что у него банально во FreeRTOS не хватает стеков задачам, а может стек вовсе не выровнен на 8.

Потому, что сама структура GPIO_InitTypeDef, пример инициализации которой приведен в топовом сообщении, определена в пакете CubeMX, здесь: \Drivers\STM32F4xx_HAL_Driver\Inc\

А если бы она была определена в CMSIS, то вопрос о том, что использует топикстартер, оставался бы открытым.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...