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

STM32H743II LwIP продолжение

Решил выделить сюда вопрос о наладке LwIP на STM32H7x

Проект сформирован в кубе с включенной FreeRTOS и LwIP. Интерфейс RMII. По рекомендации, включил MPI и добавил три страницы в исключения:

void MPU_Config(void)
{
  MPU_Region_InitTypeDef MPU_InitStruct = {0};

  /* Disables the MPU */
  HAL_MPU_Disable();

  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.BaseAddress = 0x30000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
  MPU_InitStruct.SubRegionDisable = 0x0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);

  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  MPU_InitStruct.BaseAddress = 0x30044000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);

  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Number = MPU_REGION_NUMBER2;
  MPU_InitStruct.BaseAddress = 0x30040000;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /* Enables the MPU */
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
  
}

Нормально не заработало, хотя пытается. На что обратил внимание.

1. Первый регион. С ним все понятно. Он использован для дескрипторов в Ethernetif.c

#pragma location=0x30000000
ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
#pragma location=0x30000200
ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */

2. Второй регион задекларирован в lwipopts.h "#define LWIP_RAM_HEAP_POINTER 0x30044000" и использован в mem.c 

ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);

Вообще, стиль этот мне очень не понравилось. Используют память по фиксированному адресу, но линкер об это не уведомлен. Оно конечно так работает, но меня несколько коробит. Потому сделал определение памяти для линкера, сделал массив, расположенный и теперь видно, что память фиксирована.

3. А вот с третьим регионом непонятно. На него нет ссылок нигде в коде проекта. Отладка показывает, что реальные приемные буфера смотрят в DTCMRAM в адреса 0х2400. Вроде как с комментариях к MAC контроллеру сказано, что на эти адреса и надо смотреть. Так зачем этот третий регион. Для контроля при старте заполнил его своими данными и при работе они не меняются, т.е. он не используется. 

Еще озадачило поведение ОЗУ второго и третьего регионов. После старта, на входе main из этих регионов читается белиберда. Данные становятся адекватными, например теми, что были до reset, после включения клока на TIM7, которые у меня определен как  Timebase. Как связан клок системного таймера с памятью не сообразил.

Пока статистика, которую я добавил в прерывание по сети, говорит о том, что иногда принимаются пакеты и один раз пакет отправляется. Что может быть еще не так?

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


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

17 часов назад, kostya-m сказал:

Решил выделить сюда вопрос о наладке LwIP на STM32H7x

А у Вас какой вообще вопрос? В смысле, что не работает корректно: 'MPU' или 'LwIP'? Если второе, то пока на время не используйте никакой MPU и кеширование данных/инструкций у себя в коде. И разбирайтесь далее с LwIP. У Вас "код" на чем основан? В смысле на CubeMX или как? Подозреваю, что на CubeMX, но все-таки (бывают и "оригиналы" тоже в жизни).

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


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

Я не нашел первоисточника, но для STM32H745 кубом дескрипторы задаются именно в SRAM3.

#elif defined ( __GNUC__ ) /* GNU Compiler */

ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".RxDescSection"))); /* Ethernet Rx DMA Descriptors */
ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDescSection")));   /* Ethernet Tx DMA Descriptors */
uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE] __attribute__((section(".RxArraySection"))); /* Ethernet Receive Buffers */

#endif
/* Specify the memory areas */
MEMORY
{
    FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 1024K
    DTCMRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
    /*ITCMRAM (xrw)      : ORIGIN = 0x00000000, LENGTH = 64K*/
    RAM_AXI (xrw)      : ORIGIN = 0x24000000, LENGTH = 512K
    /*RAM_D1 (xrw)      : ORIGIN = 0x30000000, LENGTH = 128K*/
    /*RAM_D2 (xrw)      : ORIGIN = 0x30020000, LENGTH = 128K*/
    RAM_D3 (xrw)      : ORIGIN = 0x30040000, LENGTH = 32K
    /*RAM_D4 (xrw)      : ORIGIN = 0x38000000, LENGTH = 64K*/
}

.lwip_sec (NOLOAD) : {
    . = ABSOLUTE(0x30040000);
    *(.RxDescSection) 
    
    . = ABSOLUTE(0x300400c0);
    *(.TxDescSection)
    
    . = ABSOLUTE(0x30040200);
    *(.RxArraySection) 
  } >RAM_D3

 

компилятор gcc

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


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

11 hours ago, AleksBak said:

В смысле, что не работает корректно: 'MPU' или 'LwIP'?

К MPU у меня претензий нет. Когда я включил код управления MPU, то LwIP начал хоть как-то ворочаться.

11 hours ago, AleksBak said:

Если второе, то пока на время не используйте никакой MPU и кеширование данных/инструкций у себя в коде.

Без MPU вообще не работало, это я писал в прошлой теме, после отладки SDRAM. Видимо не зря это требуется. Кеширование выключал, ничего не изменялось. 

 

11 hours ago, AleksBak said:

У Вас "код" на чем основан? В смысле на CubeMX или как? Подозреваю, что на CubeMX, но все-таки (бывают и "оригиналы" тоже в жизни).

В первых строках темы написал, что куб с FreeRTOS и LwIP. Отличие только в том, что в оригинале физика LAN8742, а у меня LAN8720. Но анализ и даташитов и кода показал, что между ними разницы нет. Т.е. все новые регистры не используются кодом. А в остальном они идентичны. 

9 hours ago, vguard said:

ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".RxDescSection"))); /* Ethernet Rx DMA Descriptors */ ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDescSection"))); /* Ethernet Tx DMA Descriptors */ uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE] __attribute__((section(".RxArraySection"))); /* Ethernet Receive Buffers */

Свежий куб создает несколько иной текст. Если для дескрипторов текст аналогичен, то RxBuff вообще не существует. Сделана память и создан только указатель на ее начало, но не объявлен массив. Указатель действительно смотрит на 0x30044000. А вот регион с адреса 0x30040000 вообще никак не используется. Зачем же его надо было включать в MPU, как советовали в форуме ST? Вообще, я собрал проект как его сгенерил куб и с МPU и без него и оба варианта не запустились. Что меня подивило, обычно у ST более или менее рабочий код получался. Пусть и не оптимальный.

Да, компилятор у меня iar

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


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

7 часов назад, kostya-m сказал:

Без MPU вообще не работало

Послушайте: знание основ - это самое главное тут. Изучайте максимально много, что тут и зачем. Я когда спрашивал глупые вещи, то все равно продолжал изучать и потом уже сам находил ответы и понимал, что глупость спрашивал. MPU тут нужен как бы чтобы наделить какими-то свойствами определенный участок кода. Например запретить в нем кеширование данных или инструкций, запретить в нем выполнение кода и т.д. и т.п. Скорее всего у Вас работает кеширование, так как процессор на самом деле крутой все-таки и данные берутся из кеша, а не из памяти. Поэтому - пока отключите это кеширование. На время. И забудьте покамест про MPU.

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

7 часов назад, kostya-m сказал:

куб с FreeRTOS и LwIP.

Отлично. Реально. Так и продолжайте.

 

7 часов назад, kostya-m сказал:

Отличие только в том, что в оригинале физика LAN8742, а у меня LAN8720. Но анализ и даташитов и кода показал, что между ними разницы нет. Т.е. все новые регистры не используются кодом. А в остальном они идентичны. 

Ничего страшного, что такое отличие. Вообще-то - ДА - у них практически нет отличий именно в регистрах и т.п. (насколько помню). Отличаются наличием аппаратной "смены (swap) каналов RX/TX" или как оно там называется точно и еще есть аппаратные улучшения. Надо почитать/изучить как-нибудь мне также. Советую взять готовый пример работы с этим PHY-шником с Инета. например от "WaveShare' Таких примеров полно вообще-то т.к. этой очень распространенный драйвер.

Еще, дополнительно, почитаю снова Ваши посты и может еще что-то умное напишу. Покамест, повторюсь, не понял, что за проблема у Вас.

7 часов назад, kostya-m сказал:

Кеширование выключал, ничего не изменялось. 

Я очень извиняюсь - увидел вот это сообщение тоже. Это уже интереснее. Значит отключение (а точно оно было?) не помогло - так получается.

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


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

3 hours ago, AleksBak said:

Я очень извиняюсь - увидел вот это сообщение тоже. Это уже интереснее. Значит отключение (а точно оно было?) не помогло - так получается.

Прежде чем писать сюда, я много времени потратил что бы попытаться разобраться. Включая трассировку сигналов многоканальным осциллоскопом.  Были и мысли, что просто не подходит фаза клока на чтении, что видно и о чем упоминается и в даташите на физику (халтурщики фазу перевернули) Потому пробовал или затянуть клок или сигналы (поведение изменяется). По сути, я считаю, что проблема не в LwIP, а в драйвере от куба. А еще точнее в том, что при генерации кода они где-то недописали какую-то настройку. Мне бы подошел какой-нибудь заведомо работающий код решения на этом проце с FrееRTOS и LwIP без остального, я бы сам проанализировал и нашел отличия. А может быть нашел ошибку в трассировке платы (что то же не исключаю).

DCash я в проекте включаю только после отладки. На F745 его так и не удалось включить, найдены были ошибки его работы с SRAM.

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


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

8 минут назад, kostya-m сказал:

Мне бы подошел какой-нибудь заведомо работающий код решения на этом проце с FrееRTOS и LwIP без остального, я бы сам проанализировал и нашел отличия. А может быть нашел ошибку в трассировке платы (что то же не исключаю).

Т.е. Вы покамест даже не уверены, что работает данный драйвер (LAN8720)? Ну тогда пока что посмотрите тут (и далее там). Понимаю, что там не IAR который Вы используете, но ничего такого сложного переделать нету вроде. Вообще, этот PHY-драйвер очень распространенный и примеров работы с ним МОРЕ. Вы писали в первом посту тут про использование MPU - и я Вам ответил он пока что нафиг не нужен тут. Начинайте с малого - без FreeRTOS и пр. (ссылку привел). Чтобы убедится, что вообще работает этот LAN8720. Если и сейчас что-то не получится - сообщите.

 

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


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

57 minutes ago, kostya-m said:

Мне бы подошел какой-нибудь заведомо работающий код решения на этом проце с FrееRTOS и LwIP без остального, я бы сам проанализировал и нашел отличия. А может быть нашел ошибку в трассировке платы (что то же не исключаю).

Добрый день! Я же Вам в другой ветке предложил этот самый простой путь. Ну хорошо, вот так будет понятнее:

STM32Cube\Repository\STM32Cube_FW_H7_V1.10.0\Projects\STM32H743I-EVAL\Applications\LwIP\LwIP_HTTP_Server_Socket_RTOS\EWARM\

Всё, что нужно сделать, это исправить назначение пинов в соответствии с Вашей схемой. Проект рабочий.

Если не можете скачать архив для Куба, то вот ссылка

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


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

Спасибо. Изучу. А приходится еще старые проекты поддерживать. А ведь до того, штук пять плат с LwIP завелись без вопросов. Упорный Н743 попался :)

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


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

Спасибо, заработало. Применил по рекомендации производственников новую китайскую RJ-45 розетку с трансформаторами. А у нее в даташите не указано где + и - (P и N) контакты. Оказалось перепутал. Сделал кабель с инверсией и заработало.

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


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

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

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

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

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

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

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

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

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

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