Я использую STM32H735ZGTx_LQFP144. Настроил Ethernet по этой ссылке https://controllerstech.com/stm32-ethernet-1-connection/
Если я не использую какой-либо глобальный файл ни в одном из исходных файлов, у меня нет проблем, Ethernet работает нормально.
Всякий раз, когда я объявляю и использую глобальные переменные или статические переменные, я сталкиваюсь с некоторой проблемой, и Ethernet останавливается.
Я получаю разные ошибки в зависимости от размера глобальных переменных, как показано ниже.
char buff[5] = "123"; //initialized
Error : Hard Fault error
char buff[100]; // uninitialized
Error: ssertion "pc>custom_free_function != NULL" failed at line 767 in../Middlewares/Third_Party/LwIP/sr/core/pbuf.c
char buff[200]: //uninitialized
Error:
Assertion "pbuf_free: p->ref > 0" failed at line 753 in../Middlewares/Third_Party/LwIP/src/core/pbuf.c
Error: Assertion "mem_trim: legal memory" failed at line 721 in ../Middlewares/Third_Party/LwIP/src/core/mem.c
Изменение размера переменной меняет ошибки. Я новичок в STM, пожалуйста, помогите мне с этой проблемой.
Я проверил адреса глобальных переменных, все они хранятся в RAM_D1.
В серьезной ошибке я заметил, что это вызывает ошибку, когда она находится в функции pbuf_free().
Я обнаружил, что некоторые модели серии STM32H7x имеют проблемы с Ethernet. Хотя мы настроили адрес в CubeMX в ethernetif.c, но нам нужно разместить буфер RX_POOL в определенной оперативной памяти.
/* USER CODE BEGIN 2 */
#if defined ( __GNUC__ ) /* GNU Compiler */
__attribute__((section(".Rx_PoolSection"))) extern u8_tmemp_memory_RX_POOL_base[];
#endif
/* USER CODE END 2 */
Измените компоновщик (*.ld), чтобы дескрипторы и буферы ETH находились в D2 SRAM. Также рекомендуется разместить всю оперативную память на RAM_D1. В проекте, сгенерированном STM32CubeMX, должен быть изменен скрипт компоновки с суффиксом "_FLASH", который используется по умолчанию.
(например: STM32H750XBHx_FLASH.ld). Линкерскрипт с суффиксом "_RAM" является шаблоном для выполнения кода из внутренней оперативной памяти.
} >RAM_D1
/* Modification start */
.lwip_sec (NOLOAD) :
{
. = ABSOLUTE(0x30040000);
*(.RxDecripSection)
. = ABSOLUTE(0x30040060);
*(.TxDecripSection)
/* Rx_Pool section must be added in linker */
. = ABSOLUTE(0x30040200);
*(.Rx_PoolSection)
} >RAM_D2
После этих доработок моя проблема была решена. Rx_Pool хранит pbuf, но из-за неправильного выравнивания некоторые указатели pbuf записывались поверх.
Примечание. Если вы храните Rx_Pool в каком-либо другом ОЗУ или другом адресе, выравнивание должно быть правильным, иначе он снова перезапишется.
Звуки, связанные со сценарием сопоставления памяти/компоновщика или, возможно, с чем-то в CRT, работают неправильно. Глядя, где все переменные оказываются в созданном компоновщиком «файле карты» (обычно это текстовый файл с расширением .map), можно получить некоторые подсказки.