Jump to content

    
Digi

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

Recommended Posts

Пытаюсь перетащить код с 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();  войти в функцию по шагам и потом продолжить выполнение, то тоже всё работает. Какие есть способы поиска этого глюка ?

Share this post


Link to post
Share on other sites
4 часа назад, Digi сказал:

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

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

Цитата

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

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

Цитата

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

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

Share this post


Link to post
Share on other sites
GPIO_InitTypeDef  GPIO_InitStructure = {0};

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

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

Share this post


Link to post
Share on other sites
11 hours ago, Arlleex said:

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

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

11 hours ago, Arlleex said:

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

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

Share this post


Link to post
Share on other sites
40 минут назад, Digi сказал:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
19 hours ago, Digi said:

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

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

Share this post


Link to post
Share on other sites
35 minutes ago, haker_fox said:

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

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

Share this post


Link to post
Share on other sites
38 minutes ago, x893 said:

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

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
1 час назад, Xenia сказал:

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

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

Share this post


Link to post
Share on other sites
7 minutes ago, Arlleex said:

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

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

 

8 minutes ago, Arlleex said:

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

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

#define configCHECK_FOR_STACK_OVERFLOW	2

 

Share this post


Link to post
Share on other sites
55 минут назад, Arlleex сказал:

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.