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

ReRayne

Участник
  • Постов

    25
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о ReRayne

  • Звание
    Участник
    Участник
  • День рождения 10.01.1992

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. FatFS + STM32F217

    Собственно. Имеем STM32F217ZG с microSD 4Gb, работающую через 6-ой канал DMA2 на частоте в районе 9Mhz. Имеем FreeRTOS+LwIp+FatFS. Прошивка при старте начинает писать данные на SD. С TIM5 снимается время выполнения операций в FatFS. Получаем на выходе какую-то очень странную картину: read/write/close ~ 20ms chdir/open/opendir ~ 500ms Почему так долго идет работа с директориями? Можно ли как-то ускорить?
  2. Keil + JLink Pro SWD + STM32F217ZG

    Устройство с FreeRTOS на борту. Происходит вывод отладочной информации через JLink Pro. Проблема заключается в следующем: строчки при выводе бьются, т.е. выводятся не полностью. Уже написала функцию, которая из очереди выгребает символы и отправляет ITM - не помогло. Кто-нибудь сталкивался с такой проблемой? Функция fputchar: PUTCHAR_PROTOTYPE { /* Place your implementation of fputc here */ ITM_SendChar(ch); return (ch); }
  3. проблемы с lwIp

    Аха-ха-ха-ха))) Черт, а я думала только на STM32 такая проблема, грешила на драйвер DMA изернета, что его Suspend mode не вытаскивают. Пинги и на малые пакеты со временем умрут. Лично у меня просто перестает подниматься прерывание от Ethernet.... Предлагаю автору в привате переговорить и провести совместно серию тестов на наших контроллерах. Кстати PHY уровень Ethernet какой?)
  4. Кто-нибудь встречал как правильно обрабатывать прерывания от ETH_DMA_FLAG_RBU?
  5. STM32F217 & LwIP 1.3.2

    scifi, спасибо!) =F8=, мне такое не подходит, увы, а в доке не могу найти как правильно переинициализировать буфер DMA =( Вообще в low_level_input есть следующий код для переполнения: /* When Rx Buffer unavailable flag is set: clear it and resume reception */ if ((ETH->DMASR & ETH_DMASR_RBUS) != (u32)RESET) { /* Clear RBUS ETHERNET DMA flag */ ETH->DMASR = ETH_DMASR_RBUS; /* Resume DMA reception */ ETH->DMARPDR = 0; }
  6. STM32F217 & LwIP 1.3.2

    А ни у кого не пробегал стабильный драйвер для LwIP? Или самой писать?) Откуда в msg->msg.inp.p берется указатель на 0х23 ума не приложу. scifi, беру свои слова назад, действительно косым оказался драйвер для LwIP под STM. =F8=, плата стоять может очень долго. У меня последний раз под флудом пакетами 1024 байта она выстояла 19Гб, потом перестала отвечать. Я попробовала пропинговать ее пакетами по 32 байта. Плата отвечала еще некоторое время, а потом тоже перестала. При этом Hard Fault не произошел и ресив остановился по иной причине. По поводу RxBuff, я так понимаю, надо добавить обработку переполнения?
  7. STM32F217 & LwIP 1.3.2

    unkier, Lexy_one, да, глюки в самом драйвере к порту LwIP. На форуме STM мне подсказали решение проблемы с пингами: void ethernetif_input(void * pvParameters) { struct pbuf *p; for( ;; ) { if(xSemaphoreTake(s_xSemaphore, emacBLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE) { GET_NEXT_FRAGMENT: p = low_level_input( s_pxNetIf ); if (p != NULL) { if (ERR_OK != s_pxNetIf->input( p, s_pxNetIf)) { pbuf_free(p); p=NULL; } else { xSemaphoreTake(s_xSemaphore, 0); goto GET_NEXT_FRAGMENT; } } } } } Но я тут же отловила еще один косяк в static void tcpip_thread(void *arg) в этом куске кода: #if LWIP_ARP if (msg->msg.inp.netif->flags & NETIF_FLAG_ETHARP) { ethernet_input(msg->msg.inp.p, msg->msg.inp.netif); } Адрес параметра почему-то msg->msg.inp.p = 0x23 => CPU hardfault. После 2Гб пингов.
  8. STM32F217 & LwIP 1.3.2

    Имеем плату starterkit STM32F217. Ethernet PHY: KSZ8721BL. С сайта STM взят вот этот пример с реализацией LwIp 1.3.2. Запускаем, начинаем пинговать плату. Все окей, она радостно нам отвечает с пингами <=1мс. Потом в один прекрасный момент, рандомно, пинги начинают съезжать 400-2000мс. В конце концов через несколько часов пинга плата перестает отвечать вообще. При этом весьма забавен тот факт, если с другой машины начинать флудить пингом, то пинги станвятся нормальными 1-40мс. Отключаешь флуд, снова съезжают пинги. Собственно, меняли только настройки драйвера. Изменения отмечены жирным. stm32f2x7_eth_bsp.c #define CHECKSUM_BY_HARDWARE 1 /*...................*/ void ETH_BSP_Config(void) { /* Configure the GPIO ports for ethernet pins */ ETH_GPIO_Config(); /* Config NVIC for Ethernet */ ETH_NVIC_Config(); /* Configure the Ethernet MAC/DMA */ ETH_MACDMA_Config(); /* if (EthInitStatus == 0) { LCD_SetTextColor(Red); LCD_DisplayStringLine(Line5, (uint8_t*)" Ethernet Init "); LCD_DisplayStringLine(Line6, (uint8_t*)" failed "); while(1); }*/ /* Configure the PHY to generate an interrupt on change of link status */ // Eth_Link_PHYITConfig(DP83848_PHY_ADDRESS); /* Configure the EXTI for Ethernet link status. */ // Eth_Link_EXTIConfig(); } void ETH_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOs clocks */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOI | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOH | RCC_AHB1Periph_GPIOF, ENABLE); /* Enable SYSCFG clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* Configure MCO (PA8) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOA, &GPIO_InitStructure); /* MII/RMII Media interface selection --------------------------------------*/ #ifdef MII_MODE /* Mode MII with STM322xG-EVAL */ #ifdef PHY_CLOCK_MCO /* Output HSE clock (25MHz) on MCO pin (PA8) to clock the PHY */ RCC_MCO1Config(RCC_MCO1Source_HSE, RCC_MCO1Div_1); #endif /* PHY_CLOCK_MCO */ SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_MII); #elif defined RMII_MODE /* Mode RMII with STM322xG-EVAL *///! /* Output PLL clock divided by 2 (50MHz) on MCO pin (PA8) to clock the PHY */ RCC_MCO1Config(RCC_MCO1Source_PLLCLK, RCC_MCO1Div_2); SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII); SYSCFG_CompensationCellCmd(ENABLE); #endif /* Configure PA1, PA2 and PA7 */ GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH); GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH); GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH); /* Configure PC1, PC4 and PC5 */ GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH); GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH); GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH); /* Configure PG14 and PG13 */ GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOG, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOG, GPIO_PinSource13, GPIO_AF_ETH); GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_ETH); /* Configure PB11 */ GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_ETH); } system_stm32f2xx.c uint32_t SystemCoreClock = 100000000;
  9. Камень STM32F217 OS: FreeRTOS 7.0.1 LwIp: 1.3.4 Socket Проблема в следующем: крутится прием данных по HTTP. Получив данные в статический буфер, LwIp закрывает сокет командой close. В произвольный момент времени, внезапно, LwIP начинает принимать пакеты крайне не равномерно. Кто-нибудь встречался?
  10. wedmeed, начинает с файла стартапа и переходит в main. Похоже, у меня действительно SWD плохо работал в отладчике. Acvarif, огромное спасибо, помогло! (у меня на 4.22f другой глюк, слетает прошивка с программатора). dezna, спасибо, буду знать на будущее. Правда, не мой случай, кабели короткие и с питанием все ок. Очередной неведомой косяк моих кривых ручонок. Toolchain: MDK-ARM Standard Version: 4.21 Middleware: RL-ARM Real-Time Library Version V4.13 Toolchain Path: BIN40\ C Compiler: Armcc.Exe V4.1.0.713 Assembler: Armasm.Exe V4.1.0.713 Linker/Locator: ArmLink.Exe V4.1.0.713 Librarian: ArmAr.Exe V4.1.0.713 Hex Converter: FromElf.Exe V4.1.0.713 CPU DLL: SARMCM3.DLL V4.21 Dialog DLL: DARMSTM.DLL V1.62 Target DLL: Segger\JL2CM3.dll V2.5 Dialog DLL: TARMSTM.DLL V1.60 В файле stm32_eval_sdio_sd.h разкоменчен дефайн: #define SD_DMA_MODE ((uint32_t)0x00000000) Есть файл diskio.c, в котором описываются функции работы с SD для файловой системы: #include "stm32_eval_sdio_sd.h" /**************************/ /*-----------------------------------------------------------------------*/ /* Read Sector(s) */ DRESULT disk_read ( BYTE drv, /* Physical drive nmuber (0..) */ BYTE *buff, /* Data buffer to store read data */ DWORD sector, /* Sector address (LBA) */ BYTE count /* Number of sectors to read (1..255) */ ) { switch (drv) { case SDIO_DRIVE: { Status = SD_OK; #if defined SD_DMA_MODE /* DMA Transfer */ /* Read Multiple Blocks */ Status = SD_ReadMultiBlocks((uint8_t*)(buff),(sector)*SECTOR_SIZE,SECTOR_SIZE,count); /* Check if the Transfer is finished */ Status = SD_WaitReadOperation(); /* Wait until end of DMA transfer */ while(SD_GetStatus() != SD_TRANSFER_OK); #else /* Polling Transfer */ for (int secNum = 0; (secNum < count) && (Status == SD_OK); secNum++) { Status = SD_ReadBlock((buff+SECTOR_SIZE*secNum), (sector+secNum)*SECTOR_SIZE, SECTOR_SIZE); while(SD_GetStatus() != SD_TRANSFER_OK); } #endif if (Status == SD_OK) return RES_OK; else return RES_ERROR; } } return RES_PARERR; } Внезапно оказывается, что компилятор мне включает код не в блоке #if defined SD_DMA_MODE, а блок #else.
  11. Если честно, он и с DMA(у меня F217) не шибко быстро работает. Посмотрела как работает WriteBlock в пуллинге. В начале функции есть структура SDIO_CmdInitStructure, которая содержит в себе адрес записываемого блока. SD_Error SD_WriteBlock(uint8_t *writebuff, uint32_t WriteAddr, uint16_t BlockSize) { /*****************************************************************/ SDIO_CmdInitStructure.SDIO_Argument = WriteAddr; SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK; SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; SDIO_SendCommand(&SDIO_CmdInitStructure); /*****************************************************************/ /* Тут запись по uint32_t */ /*****************************************************************/ } Других вариантов, кроме как цикл, я не вижу, ибо структуру нужно регулярно переиницализировать, команды CmdResp1Error(SD_CMD_SET_BLOCK_COUNT) и errorstatus = CmdResp1Error(SD_CMD_WRITE_MULT_BLOCK), используемые в DMA, вряд ли сработают. SD_Error SD_WriteBlockMultiPooling(uint8_t *writebuff, uint32_t uint16_t BlockSize, uint32_t NumberOfBlocks) { uint32_t i; /*****************************************************************/ for (i = 0; i < NumberOfBlocks; i++) { SDIO_CmdInitStructure.SDIO_Argument = WriteAddr + i; SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK; SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; SDIO_SendCommand(&SDIO_CmdInitStructure); /*****************************************************************/ /* Тут запись по uint32_t */ } /*****************************************************************/ } Собственно, получается тоже самое, что я написала в первом посте, с разницей лишь в том, что тут не тратится время на повторный вызов WriteBlock.
  12. В примере файловой системы FATFS для STM32 чтение и запись пуллингом выглядят следующим образом: /* read sectors */ for (int secNum = 0; (secNum < count) && (Status == SD_OK); secNum++) { Status = SD_ReadBlock((buff+SECTOR_SIZE*secNum), (sector+secNum)*SECTOR_SIZE, SECTOR_SIZE); while(SD_GetStatus() != SD_TRANSFER_OK); } /* write sectors */ for (int secNum = 0; (secNum < count) && (Status == SD_OK); secNum++) { Status = SD_WriteBlock((uint8_t *) buff+SECTOR_SIZE*secNum, (sector+secNum)*SECTOR_SIZE, SECTOR_SIZE); while(SD_GetStatus() != SD_TRANSFER_OK); } Данные куски кода с библиотеке как раз заменяют MultiBlock при использовании DMA.
  13. Возникла проблема: Отладочная плата STARTERKIT SK-STM32F217. Программатор JetLink8/Ultra, драйвер 4.40d. Среда разработки: Keil 4.23. На плате крутился FreeRTOS 7.1, и очень долгое время все было прекрасно. Плата стартует бутлоадером по адресу 0x8000000, и перекидывает нас на адрес 0x8040000, откуда начинает выполнялся основная прошивка. Но в какой-то момент при открытии сначала слетели все настройки программатора. Ну а потом вообще начался цирк с конями: 1) прошивка с программатором стартует через раз; 2) начало появляться странное окошко, которого раньше не было (J-Link reprogramming flash), которое постоянно перезаписывает чистит сектора флеша на чипе; 3) в файле стартапа успешно инициализирует железо, но при этом в main не переходит, а выкидывается на адрес 0xFFFFFFFE; 4) временами все-таки вышвыривает меня в main и начинает дебажить, но в произвольный момент времени при пошаговой трассировке может просто намертво повиснуть в Trace:Running(перед этим обязательно появляется J-Link reprogramming flash). 5) во время все той же пошаговой трассироки может внезапно возникнуть инструкция в дизасемблере MOVS 0xFFFFFFFE и мы улетаем черт знает куда; 6) при попытке остановить улетевший в никуда процессор вываливает "Can't stop Cortex-M3"; Перерыла весь интернет, нигде ничего подобного не встречал, помогите =(((
  14. Написан PUTCHAR_PROTOTYPE, который по ITM посылает отладку в окно Debug (printf) Viewer в Keil. Можно ли как-то сделать, чтобы этот дебаг сразу логировался в файл?
  15. STM32F217&FATFS

    inventor, на самом деле у меня большие подозрения на сам FATFS. Чтение падает с FR_NO_PATH. При том это лечится периодическим вызовом f_mount(DISK_LOGIC_NUMBER, NULL)(unmount т.е.). Работы с железом в этой функции нет. А вы попробуйте сделать бесконечный цикл на чтение файла из файла, мне очень интересно, отвалится ли она у вас так же как у меня или нет :)
×
×
  • Создать...