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

Log_in

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

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Участник
    Участник

Контакты

  • Сайт
    Array
  • ICQ
    Array
  1. два IP на одном устройстве

    Всем доброго дня. Есть задача слать одинаковые UDP-пакеты с разными IP адресами источника на через разные выходы свича. Использую STM32f107. В качестве свича пяти портовый micrel ksz8895. Если со свичем более менее понятно(использую механизм жесткого коммутирования соответствующих портов, хотя наверняка есть более элегантное решение), то с заменой ничего умнее ручной замены содержимого посылки не приходит. Используемый сейчас механизм отправки для одного IP: upcb = udp_new(); upcb->local_port = LOCAL_AIS_PORT; upcb->remote_port = REMOTE_AIS_PORT; //assign destination IP address IP4_ADDR( &DestIPaddr, GW_AIS_ADDR0, GW_AIS_ADDR1, GW_AIS_ADDR2, GW_AIS_ADDR3 ); //configure destination IP address and port udp_connect(upcb, &DestIPaddr, REMOTE_AIS_PORT ); // allocate pbuf from pool p = pbuf_alloc(PBUF_TRANSPORT,strlen((char*)data), PBUF_POOL); // copy data to pbuf pbuf_take(p, (char*)data, strlen((char*)data)); // send udp data udp_send(upcb, p); udp_disconnect(upcb); pbuf_free(p); Кто нибудь может предложить конкретный способ, пример, или хотя бы механизм, с помощь которого этого можно добиться?
  2. Назначение проекта: подключить все библиотеки с целью предварительно проверки на работоспособность(с компилируются ли для начала) и зажечь на плате HPS -ые светодиоды подав на них логический ноль. И использованием ARMCC выходила проблема, что при выборе Gnu Make Builder, эклипс выдавал ошибку с сакральным обозначением Error 1, а точнее :make: *** [hello.o] Error 1. Кстати, эта же ошибка выдается при попытки скомпилировать Ваш первый по счету проект. Возможно это от того, что не удалось поставить указанные плагины. При выборе любого из шести( полное название модуля при его установке высвечивается как "GNU ARM C/C++ Cross Development Tools " пишу для проверки, правильности скаченного файла, что бы не было разговора о разных вещах) выдается сообщение: Cannot complete the install because one or more required items could not be found. Software being installed: GNU ARM C/C++ Cross Compiler Support 1.9.2.201404240550 (ilg.gnuarmeclipse.managedbuild.cross.feature.group 1.9.2.201404240550) или в место GNU ARM C/C++ Cross Compiler Support название любого другого модуля из 6. Во время компиляции второго проекта в консоль выводится следующее **** Rebuild of configuration Default for project main_all_lib__ **** **** Internal Builder is used for build **** arm-none-eabi-gcc -IC:\altera\13.1\embedded\ip\altera\hps\altera_hps\hwlib\include -O2 -g -Wall -c -fmessage-length=0 -o hello.o ..\hello.c arm-none-eabi-gcc -o main_all_lib__.axf hello.o Build error occurred, build is stopped Time consumed: 1660 ms. В общем и тут засада, afx файл не создается. Либо из-за отсутствия плагинов, либо руки не из плеч)
  3. Вот здесь описана похожая ситуация и озвученный мной способ решения http://stackoverflow.com/questions/2065302...x13-doesnt-work, осталось понять способ организации обработчика. На счет makefile, действительно, когда пользовался ARMCC он создавался, правда другие проблемы вылезали, а этот не создает. .afx -файл генерирует, а make - нет. Это что, мне его в ручную создавать? И как тогда? Блин, эта борода с альтерой, имеет умопомрачительные размеры и крайне надуманную структуру, а еще говорят что у STM раздутая библиотека! И с отдельной веткой идея хорошая, вот только самим создать новую или подождать когда модератор перенесет сообщения в отдельную. Залил на ifolder проект, может кто сможет мозги ему вправить) http://rusfolder.com/40850112
  4. А кто-нибудь писал под ARM Cyclone-а? Сейчас пробую разобраться в их библиотеках, но тону в их десятках тысяч строк кода! Да и сам этот код не всегда компилируется, особенно ассемблерные вставки. static void alt_int_fixup_irq_stack(uint32_t stack_irq) { // 1. Save the current SP // 2. Switch to the IRQ context // 3. Point SP to the stack IRQ block provided // 4. Switch back to SYS context // 5. Restore the saved "current" SP // Mode_USR 0x10 // Mode_FIQ 0x11 // Mode_IRQ 0x12 // Mode_SVC 0x13 // Mode_MON 0x16 // Mode_ABT 0x17 // Mode_UNDEF 0x1B // Mode_SYS 0x1F // I_Bit 0x80 @ when I bit is set, IRQ is disabled // F_Bit 0x40 @ when F bit is set, FIQ is disabled // NS_BIT 0x1 @ when NS bit is set, core in non-secure // r4 being used for stack_sys. // Consider adding "lr" to the list of mangled registers. This way GCC will push/pop {lr} for us. __asm( "push {lr}\n" "mov r4, sp\n" // "msr CPSR_c, #(0x12 | 0x80 | 0x40)\n" //msr - пересылка из РОН в РСН (стр.82 "mov sp, %0\n" // "msr CPSR_c, #(0x1F | 0x80 | 0x40)\n" //без комментариев этих двух пересылок код не компилируется "mov sp, r4\n" "pop {lr}\n" : : "r" (stack_irq) : "sp", "r4" ); } Ошибка выскакивает следующая: Description Resource Path Location Type Thumb encoding does not support an immediate here -- `msr CPSR_c,#(0x1F|0x80|0x40)' main_all_lib ;line 55, external location: :\Users\User\AppData\Local\Temp\ccQyZQWf.s C/C++ Problem Находил упоминание, эту процедуру можно выполнить через обработчик событий svc, но как его правильно организовать пока тоже не знаю. Может кто сталкивался с чем-то подобным? Среда:DS-5, выбран компиляторDS-5 GCC
  5. Всем доброго дня. Разбираюсь с Cyclone V SoC Development Kit, а точнее с ARM-овской составляющей.Через дебаг DS-5 запустил проект с HelloWorld. И тут возникает масса вопросов: 1. можно ли прошивать через Run, а не дебаг, 2. как подключаются библиотеки. Нужные файлы нашел в altera\13.1\embedded\ip\altera\hps\altera_hps\hwlib. Отправили их в папу DS-5/include, командой #include .h файлы подключаются, но функции из одноименных .с файлов - ни в какаю, даже если их подключить в ручную. При этом компилятор начинает придираться к ";", брейкам в циклам и прочим вещам. Я начал грешить на компилятор и пытаться настроить его, но лучше опять не стало. До этого знаком был с АRM через Stm и Keil,(+немного кокоса), а тут такая борода! Подскажите советом, или быть может развернутым примером. Осознаю свое незнание в этом вопросе и готов учиться.
  6. Оо! Спасибо большое! То что нужно. А что-нибудь касательно МАС -ов можете сказать? Сейчас разбираюсь с Tail Tagging Mode, и возникает вопрос как прикрепить эти 5 байт( TAIL TAG(1) и FCS(4)), если хвост фрейма для UDP это непосредственно передаваемые данные? Неужели их нужно в самый хвост записать, а свич сам разберется? FCS судя по "Компьютерные сети. Первый шаг" вообще может быть любым, лишь бы получатель знал, как его идентифицировать. Я правильно понимаю?
  7. Всем привет. Возникла такая задача. Необходимо из пяти-портового свича микрель 8895 отправлять и принимать из разных портов UDP на мультикастовые адреса, при том, что в каждом случае должен быть свой IP отправителя и MAC. Выбирать порты для отправки пока получилось используя VLAN, немного похоже на костыль, но с MAC таблицей(статической и динамической) на свиче еще не разобрался. С заменой IP тоже получилось, хоть и кривовато через netif_set_ipaddr, а вот с MAC-адресом через Set_MAC_Address, этот финт не проходит. Вообще вся эта подмена параметров во время работы мне не сильно нравится. Может кто может посоветовать что-то более разумное?
  8. Прошу прощения, что сразу сам сразу не написал причину проблемы, переключившись сразу на другую. Нога PWRND была в воздухе. Плата не моя, поэтому что-то исправлять не решился, но проверил на KSZ8895RQ. Данные записывались и считывались из регистров доступа MIIM. Но тут возникла другая проблема. На выходе SMRXC нет 50 МГц, при поступлении на Х1 25 МГц (мод клок включен LED2-2 - PU (default), выбран режим PHY Mode MII or RMII - Pin# (91, 86, 87) соответственно выставлены в 1 0 1 - резисторами в 1 кОм подтянуты к земли или питанию). Клоков как не было, так и нет.
  9. А почему у Вас CAN1 и CAN2 настроены на разные скорости?
  10. Всем привет. Появился интерес, подкрепленный нуждой, подробно разобраться с KSZ8873RLL. Посмотрел в даташите где находятся какие регистры и попробовал прочитать через библиотечную функцию STM ETH_ReadPHYRegister. Результат был в виде 0xFFFF по любым адресам. Почитал описание этого интерфейса в даташите к контроллеру (STM32F107VC).Тут выяснилось различие в названиях интерфейсов: то, что у STM называется SMI, у микрела - MIIM, а то что у микрела SMI - что-то похожее, но с небольшими особенностями (это актуально конкретно к этому свичу). Само подключение свича правильное, т.к. через него получилось передавать Ehternet фреймы. Настройка проводилась через ETH_Init и тогда была подобрана магическая комбинация настроек, при которых он заработал (основное: ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable ; как я полагаю это счастливое стечение обстоятельств, что библиотечная прошивка для другого свича смогла тут подошла). Может кто занимался подобным вопросом и имеет божественное знание :-) по этой ситуации. Вот основная часть функции чтения tmpreg = ETH->MACMIIAR; /* Keep only the CSR Clock Range CR[2:0] bits value */ tmpreg &= ~MACMIIAR_CR_MASK;//сохраняем биты отвечающие за скорость соединения /* Prepare the MII address register value */ tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */ //заносим адрес PHY и выделяем маской tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */ //заносим адрес нужного регистра и выделяем маской tmpreg &= ~ETH_MACMIIAR_MW; /* Set the read mode */ //сбрасываем бит, что означает режим чтения tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */ // устанавливаем бит, сигнализирующий проц к началу чтения /* Write the result value into the MII Address register */ ETH->MACMIIAR = tmpreg; /* Check for the Busy flag */ do { timeout++; tmpreg = ETH->MACMIIAR; } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO)); /* Return ERROR in case of timeout */ if(timeout == PHY_READ_TO) { return (uint16_t)ETH_ERROR; } /* Return data register value */ return (uint16_t)(ETH->MACMIIDR);
  11. stm32 LwIp

    Вот пример от терраэлектроники как они реализуют прием и отправку по Ethernet. Можно попытаться сделать разграничение по двум типам приема: в ручную и стеком. http://forum.promelec.ru/index.php/topic,1828.15.html _______.rar
  12. CAN stm32f207

    Проблема решена. Как вы и говорили, дело было в отсутствии ответа. Когда искал причину наткнулся на хорошую литературу по этому поводу( полная статья на английском и сокращенная на русском http://www.micromax.ru/articles/article.sh...te/Can_kvazer_1, http://www.kvaser.com/en/about-can/the-can...ol/15.html(есть картинки сигналов осциллографа). А не было ответа по банальнейшей причине! На плате терраэлектроники нет распиновки для СAN выхода. В начале перепробовал обе комбинации, но плата не работала тогда еще по другой причине, поэтому оставил как было. А сейчас это и стало камнем преткновения.)) Зато досконально разобрался и тактированием и настройкой скорости CAN.) Прилагаю работающий код. Да, и так программа (http://can.marathon.ru/.) работает только с родным устройством. #include "stm32f2xx.h" void GPIO_Init_TE(void); void CAN1_Config(void); void RCC_Configuration(void); int flag_RCC; CanTxMsg TxMessage; CanRxMsg RxMessage; int main() { long int foi=0; short int n_CAN_Tx=20; flag_RCC=0; RCC_Configuration(); CAN1_Config(); GPIO_Init_TE(); if(flag_RCC==1) { GPIO_SetBits(GPIOB, GPIO_Pin_9); } //GPIOB->BSRRL = GPIO_Pin_9; /* Transmit Structure preparation */ TxMessage.StdId = 0x00; TxMessage.ExtId = 0x01; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 8; TxMessage.Data[0] = 0xFF; TxMessage.Data[1] = 0; TxMessage.Data[2] = 2; TxMessage.Data[3] = 3; TxMessage.Data[4] = 4; TxMessage.Data[5] = 5; TxMessage.Data[6] = 6; TxMessage.Data[7] = 12; //CAN_Transmit(CAN1, &TxMessage); while(1) { for(foi=0; foi<10000000;foi++); if(n_CAN_Tx !=0) { CAN_Transmit(CAN1, &TxMessage); n_CAN_Tx--; } } } void GPIO_Init_TE(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd((RCC_AHB1Periph_GPIOB) , ENABLE); //лампочка GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); } void CAN1_Config(void) { CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); /* Connect PD1 to CAN1_Tx pin */ GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_CAN1); /* Connect PD0 to CAN1_Rx pin */ GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_CAN1); /* Configure CAN RX and TX pins */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOD, &GPIO_InitStructure); RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); /* CAN configuration */ /* Enable CAN clock */ //RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 |RCC_APB1Periph_CAN2, ENABLE); /* CAN register init */ CAN_DeInit(CAN1); /* CAN cell init */ CAN_InitStructure.CAN_TTCM = DISABLE; //Включение или отключение времени срабатывает режим связи CAN_InitStructure.CAN_ABOM = DISABLE; //Включить или отключить автоматическое управление bus-off CAN_InitStructure.CAN_AWUM = DISABLE; //Включить или выключить режим автоматического пробуждению CAN_InitStructure.CAN_NART = DISABLE; //Включить или выключить режим без автоматического повтора передачи. CAN_InitStructure.CAN_RFLM = DISABLE; //Включение или отключение Locked режим приема FIFO. CAN_InitStructure.CAN_TXFP = DISABLE; //Включить или выключить приоритет передачи FIFO CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //Определяет режим работы CAN CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; // CAN Baudrate = 125 (CAN clocked at 30 MHz) //BaudRate=1/[ t_pclk(BRP +1)(1+TS1+1+TS2+1) ] CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq; //----это (4=TS1+1) CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq; //----это (5=TS2+1) CAN_InitStructure.CAN_Prescaler = 24; //----это (24=BRP+1) CAN_Init(CAN1, &CAN_InitStructure); /* CAN filter init */ CAN_FilterInitStructure.CAN_FilterNumber = 0; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); } void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; RCC_ClocksTypeDef RCC_ClockFreq; // Сбрасываем клокинг в "0" RCC_DeInit(); // Включаем внешний кварц RCC_HSEConfig(RCC_HSE_ON); // Ждём пока устанавливается внешний ВЧ тактовый сигнал HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus != ERROR) { // Внешний тактовый сигнал появился, стабильный // разрешаем использование буфера команд FLASH_PrefetchBufferCmd(ENABLE); //------------------------------------------------------------------- // итак //Внешний кварц 25МГц //Тактовая частота ядра: 120МГц //------------------------------------------------------------------- /* Flash 2 wait state двойная задержка*/ FLASH_SetLatency(FLASH_Latency_2); RCC_HCLKConfig(RCC_SYSCLK_Div1); /* HCLK = SYSCLK AHB clock = SYSCLK=120*/ RCC_PCLK1Config(RCC_HCLK_Div4); //APB1 clock = HCLK/4 120/4=30 для CAN //RCC_PLLSource_HSE=25 - источник для PLL, PLLM=25, PLLN=240, PLLP=2, PLLQ=5 // HSE/PLLM=VCO, VCO*PLLN/PLLP=PLLCLK, VCO*PLLN/PLLQ=PLL48CK см. 48 стр мануала RCC_PLLConfig(RCC_PLLSource_HSE,25, 240, 2, 5); //Разрешаем PLL RCC_PLLCmd(ENABLE); // Ждём пока устаканится PLL while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY ) == RESET) {} // PLL - устаканился // Выбираем PLL как источник тактирования системы RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Ждём пока PLL не станет клокингом системы while (RCC_GetSYSCLKSource() != 0x08) {} } RCC_GetClocksFreq(&RCC_ClockFreq); }
  13. CAN stm32f207

    Но ведь параметр CAN_InitStructure.CAN_NART установлен в DISABLE. Или это что-то другое?
  14. CAN stm32f207

    Доброго времени суток. Разбираюсь с CAN на плате терраэлектроникс с кристаллом stm32F207. Наблюдается такая ситуация. На выходе CAN посылки идут не с интервалам, а как будто кучей. Даже если единожды запустить команду CAN_Transmit(CAN1, &TxMessage), то на выходе сигнал есть постоянно. Если использовать режим Loopback, то посылка выходит одна. Но даже в этом случае он никак не распознается устройством, ловящим все посылки CAN на заданной скорости. Само устройство точно работает http://can.marathon.ru/. Я уже грешу на настройку скорости, тактовой системы. Может кто знает, в чем причина? #include "stm32f2xx.h" void GPIO_Init_TE(void); void USART_Init_TE(void); void CAN1_Config(void); void RCC_Configuration(void); CanTxMsg TxMessage; CanRxMsg RxMessage; int main() { long int foi=0; RCC_Configuration(); CAN1_Config(); GPIO_Init_TE(); /* Transmit Structure preparation */ TxMessage.StdId = 0x321; TxMessage.ExtId = 0x01; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 1; TxMessage.Data[0] = 0; TxMessage.Data[1] = 1; TxMessage.Data[2] = 2; TxMessage.Data[3] = 3; TxMessage.Data[4] = 4; TxMessage.Data[5] = 5; TxMessage.Data[6] = 6; TxMessage.Data[7] = 7; while(1) { for(foi=0; foi<100000000;foi++); CAN_Transmit(CAN1, &TxMessage); } } void GPIO_Init_TE(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd((RCC_AHB1Periph_GPIOB) , ENABLE); //лампочка GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); } void CAN1_Config(void) { CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); /* Connect PD1 to CAN1_Tx pin */ GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_CAN1); /* Connect PD0 to CAN1_Rx pin */ GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_CAN1); /* Configure CAN RX and TX pins */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOD, &GPIO_InitStructure); RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); /* CAN configuration */ /* Enable CAN clock */ //RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 |RCC_APB1Periph_CAN2, ENABLE); /* CAN register init */ CAN_DeInit(CAN1); /* CAN cell init */ CAN_InitStructure.CAN_TTCM = DISABLE; //Включение или отключение времени срабатывает режим связи CAN_InitStructure.CAN_ABOM = DISABLE; //Включить или отключить автоматическое управление bus-off CAN_InitStructure.CAN_AWUM = DISABLE; //Включить или выключить режим автоматического пробуждению CAN_InitStructure.CAN_NART = DISABLE; //Включить или выключить режим без автоматического повтора передачи. CAN_InitStructure.CAN_RFLM = DISABLE; //Включение или отключение Locked режим приема FIFO. CAN_InitStructure.CAN_TXFP = DISABLE; //Включить или выключить приоритет передачи FIFO CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //Определяет режим работы CAN CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; // CAN Baudrate = 1MBps (CAN clocked at 30 MHz) //BaudRate=1/[ t_pclk(BRP +1)(1+bs1+1+bs2+1) ] CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq; //3----это TS1 CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq; //4----это TS2 CAN_InitStructure.CAN_Prescaler = 23; //2----это BRP CAN_Init(CAN1, &CAN_InitStructure); /* CAN filter init */ CAN_FilterInitStructure.CAN_FilterNumber = 0; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); } void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus; RCC_ClocksTypeDef RCC_ClockFreq; // Сбрасываем клокинг в "0" RCC_DeInit(); // Включаем внешний кварц RCC_HSEConfig(RCC_HSE_ON); // Ждём пока устанавливается внешний ВЧ тактовый сигнал HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus != ERROR) { // Внешний тактовый сигнал появился, стабильный // разрешаем использование буфера команд FLASH_PrefetchBufferCmd(ENABLE); //------------------------------------------------------------------- // итак //Внешний кварц 25МГц //Тактовая частота ядра: 120МГц //------------------------------------------------------------------- /* Flash 2 wait state двойная задержка*/ FLASH_SetLatency(FLASH_Latency_2); RCC_HCLKConfig(RCC_SYSCLK_Div1); /* HCLK = SYSCLK AHB clock = SYSCLK=120*/ RCC_PCLK1Config(RCC_HCLK_Div4); //APB1 clock = HCLK/4 120/4=30 для CAN //RCC_PLLSource_HSE=25 - источник для PLL, PLLM=25, PLLN=240, PLLP=2, PLLQ=5 // HSE/PLLM=VCO, VCO*PLLN/PLLP=PLLCLK, VCO*PLLN/PLLQ=PLL48CK см. 48 стр мануала RCC_PLLConfig(RCC_PLLSource_HSE,25, 240, 2, 5); //Разрешаем PLL RCC_PLLCmd(ENABLE); // Ждём пока устаканится PLL while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY ) == RESET) {} // PLL - устаканился // Выбираем PLL как источник тактирования системы RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Ждём пока PLL не станет клокингом системы while (RCC_GetSYSCLKSource() != 0x08) {} } RCC_GetClocksFreq(&RCC_ClockFreq); }
  15. LwIP стек в STM32F217

    Использовал функцию LwIP_Periodic_Handle, вызывающую tcp_tmr, которая в свою очередь tcp_fasttmr и tcp_slowtmr с заданной периодичностью. Но ситуация не особо изменилась. В ходе просмотра выполнения функций было обнаружено, что переменная tcp_active_pcbs, используемая в tcp_fasttmr, всегда принимает значение равное нулю. В связи с этим функция сразу вываливается из цикла без каких либо действий. Вроде эта структура означает все доступные соединения. Есть какие-нибудь соображения? Неужели соединение некорректно установлено? Интересно, что не мне удалось бы найти функции, где бы происходило присвоение каких либо значений. И не могли бы Вы также пояснить, где в конкретно происходила бы обработка ARP ответов при штатной работе стека? Использовал функцию LwIP_Pkt_Handle(), вызывающую ethernetif_input, сразу после udp_send(upcb, p) и стек смог принять и корректно обработать ARP ответ, добавив МАС адрес в таблицу, после чего UDP дошла до ПК, но хотелось бы более элегантное и разумное решение для приема. Да и с tcp_active_pcbs неясность осталась.
×
×
  • Создать...