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

Tanker

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

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Участник
    Участник
  1. посмотрел буду разбираться. Есть ещё работающие только в Chrome решения. А если для отправки запроса на данные, отправлять с помощью PUT в железку файл а в файле уже бинарные данные (которые легко декодировать). А железка готовит ответ, потом я у неё делаю GET файла с ответом, и железка отвечает тоже файлом с бинарным содержимым, который уже распарсивает на контролы JS ? (к сообщетсву)прошу понять, технологий много, не хотелось бы долго топтаться на месте пробую то одну то другую.
  2. если не затруднит, приведите пожалуйста, короткий пример, как отправить сформированный в массиве пакет (не обязательно текстовый) на заданный IP-адрес в заданный IP-порт
  3. Здравствуйте, Большие Дядьки! Прогаю я железки с Ethernet-ами. Сейчас я общаюсь с ними по TCP/IP, на порт 512 шлю пакеты с запросами в формате протокола MODBUS TCP/IP, получаю ответы, всё чётко обменивается, на нашем спец-софте вижу значения парметров в железках в виде осциллограмм и могу их менять. Железки на LPC2378 в качестве стека uIP. Но хочется по-взрослому! открываю Браузер, вбиваю IP железки, и на странице в Браузере смотрю параметры/редактирую их. Мне решение задачи видится так: 1) Из Железки по НТТР (порт 80) загружает страницу в Браузер (содержимое html страницы железку не интересует, она просто отрабатывает GET по HTTP) 2) После загрузки страницы в Браузер: 2.1) js со страницы шлёт железке понятные ей запросы по TCP/IP на заданный порт (пакеты MODBUS TCP/IP на которые железка уже умеет отвечать) 2.2) железки отвечает (опять в виде понятного ей формата MODBUS TCP/IP) 2.3) js на странице расшифровывает полученные пакеты их и раскладывает значения по контролам на странице 3) если из контрола я меняю какой либо параметр, то опять таки js отправляет MODBUS TCP/IP пакет в мою железку и в следующий цыкл обмена, значение в контроле обновляется Я посмотрел пример HTTP из комплекта uIP, там подход другой и очень затратный, надо при ответе на GET выдавать страницу порциями и смотреть некие ключевые слова, при встрече которых, надо подставлять на их место значения параметров (которые хотим отразить на странице). Т.е. гоняется туда-сюда море текстовой информации, и требуется постоянный парсинг текста при ответе. В общем, посвятите как пишутся серьёзные веб-интерфейсы для железок. У меня дома роутер Зухель, вот у него это сделано красиво... вот как они это делают? в плане программинга.
  4. STM32 UART<>DMA

    Здравствуйте! С приёмом получился вот такой код (считаем, что ножки и NVIC уже настроены): #define SetDIR2ToRX GPIO_WriteBit(GPIOA, GPIO_Pin_1, (BitAction)(0)); #define SetDIR2ToTX GPIO_WriteBit(GPIOA, GPIO_Pin_1, (BitAction)(1)); #define U2RXBUFFSIZE 256 //размер буфера приёмника void RxDMA1Ch6 (void) {//настройка DMA на чтение данных из UART DMA_InitTypeDef DMA_InitStructure; DMA_Cmd(DMA1_Channel6, DISABLE);//отключаю DMA для получения доступа к регистрам DMA1->IFCR |= DMA_IFCR_CTCIF6 | DMA_IFCR_CGIF6 | DMA_IFCR_CHTIF6 | DMA_IFCR_CTEIF6;//очищу все флаги прерываний DMA_DeInit(DMA1_Channel6);//на всякимй случай DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &(USART2->DR);//источник - регистр данных UART DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) &uart2data.Buffer[0];//приёмник - мой буфер (размер 256 байт) DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//направление из переферии в память (буфер) DMA_InitStructure.DMA_BufferSize = U2RXBUFFSIZE;//256 байт размер принимающего буфера DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//адрес переферии не инкрементируется DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//адрес (ссылка на буфер) инкрементируется DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//размер данных переферии БАЙТ DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//размер данных буфера БАЙТ DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//по заполнению буфера DMA останавливается DMA_InitStructure.DMA_Priority = DMA_Priority_Low; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel6, &DMA_InitStructure); DMA_Cmd(DMA1_Channel6, ENABLE);//включаю DMA... и он начинает складывать поступающие данные в заданный буфер } void uart2rs485_init (void){//настройка UART SetDIR2ToRX;//драйвер RS485 на приём USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 115200;// USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, &USART_InitStructure); USART2->CR3 |= USART_CR3_DMAR;//USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE); USART2->CR1 |= USART_CR1_RE;//разрешить приёмник USART2->CR1 |= USART_CR1_IDLEIE;//разр. прерывания по приёму "паузе" между посылаемыми байтами USART2->BRR = 104;// 12.0000.000МГц / 115200bps = 104h скорость связи USART2->CR1 |= USART_CR1_UE;//разрешить UART2 RxDMA1Ch6();//настройка DMA на чтение данных из UART } void USART2_IRQHandler(void) { volatile u32 IIR = USART2->SR; RAM_DATA.Iload++;//RAM_DATA.Iload счётчик кол-ва вхождений в IRQ (для отладки) if (IIR & USART_SR_IDLE) // Между байтами при приёме обнаружена пауза в 1 IDLE байт { USART2->DR; // Снимаем флаг прерывания по IDLE (иначе будет входить в эту ветку бесконечно) RAM_DATA.Iz++;//RAM_DATA.Iz счётчик кол-ва вхождений в ветку IDLE(для отладки) DMA_Cmd(DMA1_Channel6, DISABLE);//выкл. DMA для получения доступа к его регистрам RAM_DATA.Uload = U2RXBUFFSIZE - DMA1_Channel6->CNDTR;//кол-во принятых байт в RAM_DATA.Uload RxDMA1Ch6();//снова настройка DMA на чтение данных из UART } } Действительно приятно отвлекаться только на одно прерывание когда всё уже сложено в буфер, когда с приёмом /передачей по DMA закончу, обязательно попробую "поговорить" с контроллером на скорости 2МБит/сек, похоже он не сильно напряжётся. Есть один не существенный косяк, после ресета, когда я отправляю контроллеру от ПК первую дозу данных, буфер не заполняется (по счётчикам я вижу что есть вхождение в прерывание по IDLE, но в буфере переданные данные не появляются и кол-во принятых данных в "U2RXBUFFSIZE - DMA1_Channel6->CNDTR" = НУЛЮ ) за то всё последующие посылки появляются в буфере. Есть предположения почему так происходит? хотелось бы разобраться
  5. STM32 UART<>DMA

    можно подробнее про флаг IDLE усарта (сейчас приёмом ч/з DMA занимаюсь) Теоретически: 1) настраиваю прерывание от UART по IDLE 2) настраиваю DMA на приём от RX (и соотв. сообщаю UART что приём идет через DMA). В настройках указываю буфер куда валить данные и его размер (можно зациклить DMA_Mode_Circular чтобы не переполнялся) 3) начали приходить данные (например 4 байта я отправил с ПК на контроллер) 4) когда все 4 байта придут, срабатывает прерывание IDLE (действительно срабатывает) и в буфере указанном DMA будут лежать эти 4 байта так? а кол-во принятых байт лежит в DMAx_Channely->CNDTR ?
  6. STM32 UART<>DMA

    Здравствуйте! IAR ARM 6.30.7 STM32F100 Делаю слейв Modbus RTU c RS485 интерфейсом. Всё было бы "ОК", но по 2-м UARTAM одновременно нужно работать, а при этом моя реализация на прерываниях, начинает то на один то другой UART данные не до давать при интенсивном обмене с мастерами (ещё все АЦП задействованы на макс. скорости с прерываниями DMA по заверш. передачи оцифровки, но их отключение не помогает). Решил сделать на связке UART-DMA. Просмотрел на эту тему все топики здесь, погуглил, мануалы почитал... сделал - но очень зыбко работает моя реализация протокола, какой-то мелочи я не просекаю. Для начала я хочу реализовать приём по-байтный, а отправку через DMA. Начинается всё с приёма запроса от мастера, uart и драйвер настроен на приём: 1) принял байтик -> положил в буфер -> перезагрузил таймер (отсчёт frame end длительность 1,5-3 байт завершения пакета) и так каждый байтик, до срабатывания таймера (срабатывает когда пауза в 1,5-3 байта (как настрою)) 2) таймер отсчитал framе end, сработало его прерывание -> останавливаю таймер-> блокирую приёмник UARTа (чтобы не реагировал на входящие) 3) разбор входящего сообщения (можно вынести из прерывания во внешний цикл и сигнализировать от пришедшем пакете через какие-нибудь битики) включает в себя проверку адреса слейва и контрольной суммы (потом делается более детальный разбор, но для начала самое-то) 4) реакция на входящее сообщение: 4.1) чужое или "по-дороге битое" -> перевод uart в режим ожидания входящих байт (исходное состояние) 4.2) достойное ответа -> формирование ответа в буфере 5) когда буфер заполнен ответом, запускаю таймер на отсчёт времени переключения драйвера из режима "приём" в режим "передача" (например для ADM2587E 2,5мкСек) 6) сработало прерывание таймера (драйвер переключился в "передача")->останавливаю таймер->настраиваю DMA на передачу подготовленного буфера и запускаю передачу DMA1_Channel7->CCR |= DMA_CCR7_EN; (всё, данные должны автоматом вылетать с ножки TX, до опустошения буфера) 7) по опустошению буфера срабатывает прерывание DMA_ISR_TCIFx (если разрешено)(или таймера USART_CR1_TCIE .. в этом есть вопрос ??) данные (как-бы) переданы и можно переключаться на приём 8) запускаю таймер на отсчёт времени переключения драйвера из режима "передача" в режим "приём" 9) сработало прерывание таймера (драйвер переключился в "приём")-> перевод uart в режим ожидания входящих байт (исходное состояние) Трабл: Сейчас получается, до п.7 всё норм.,запускаю DMA... бывает что весь буфер приходит (длина ответа в среднем 64 байта), а зачастую 1 байт (левый!!!) и срабатывает DMA или UART "Transmission Complete" (я с ними экспериментировал) Ещё из наблюдений: 1) Если я разрешаю DMA_ISR_TCIFx (но при этом USART_CR1_TCIE запрещён) и запускаю DMA, то мне приходится к DMA1_Channelх->CNDTR дополнительно "+2" делать, но имею при этом лишний байт "0" он либо затирает последний значащий байт пакета данных (если CNDTR = кол-ву передаваемых байт), либо просто лишний (если CNDTR = кол-ву передаваемых байт + 2) 2) Если я разрешаю USART_CR1_TCIE (но DMA_ISR_TCIFx при этом запрещён или разрешён но просто чистит флаги) и запускаю DMA, то с DMA1_Channelх->CNDTR всё "ок" равно кол-ву передаваемых байт. В общем надеюсь с вашей помощь найти решение своего трабла и увековечить тему "STM32 DMA UART" в FAQ опубликовав полученный рабочий код с каментами
  7. ORG в ассемблере IAR 6.20 ARM

    Здравствуйте! скачал на попробовать IAR 6.20, и решил им перекомпилить проект писанный в 4.42 (проект на ARM7, в тоже время есть проекты на Cortex которые пишутся на GCC, есть желание перейти по всем проектам на IAR) столкнулся с проблемами переноса на этапе стартапа, а именно в нашем стартапе, вектора определены так: __program_start org 0x00 LDR PC, =Reset_Handler ...................... org 0x10 LDR PC, =DAbt_Handler org 0x18 LDR PC, VICADDRESS;вероятно тут какая-то фишка, ибо в екзамплах обычно [PC, #-0x0120] А в асме 6.20 ORG отсутсвует, чем его заменить? не хотелось бы править то что написано мудрыми предками вот ещё: почему компилится но не линкуется?: LDR PC, VICADDRESS Error[Lp002]: relocation failed: value out of range or illegal: 0xfffffee0 Kind : R_ARM_LDR_PC_G0[0x4] Location: 0x00000018 "__vector" + 0x18 Module: D:\Project\Projects\GALS\DXGLS\FW\LPC\iar620\fs008\Release\Obj\LPC2300.o Section: 10 (.intvec) Offset: 0x18 Target : 0xffffff00 Absolute symbol VICADDRESS Error while running Linker
  8. Здравствуйте! (IAR) пробовал размещать буфер (для хранения копии сектора) в памяти отведённой для USB и EMAC (так как не использую эти интерфейсы) при выполнении команды IAP=51;//IAP Copy RAM to Flash возвращает ошибку 4 (SRC_ADDR_NOT_MAPPED Source address is not mapped in the memory map. Count value is taken in to consideration where applicable) При размещении буфера в "обычной" памяти, всё копируется, ошибка пропала. Выходит что USB и EMAC память не маппед. ладно, буду 4к буфер в обычной рамке организовывать.
  9. Здравствуйте! хочу запустить ADC1 (у меня четыре канала) синхронно с T1_CC4. немогу запустить, екзамплы и мануалы не помогают пониманию помогите. Мне нужно так: приходит евент от СС4, запускается АЦП, ацепует 100 выборок из 4-х каналов и перекладывает по ДМА в массив. после чего АЦП останавливается (мне нужен какой-то сигнал о том что данные готовы) и ждёт следующего CC4 евента.
  10. да, на выходе дроссель и кондёры (но не так много как это нужно для мостового тиристорного выпрямителя с пульсациями 300Гц, всё таки оперируем 10кГц-ами). И есть достаточная мощность чтобы сделать ровную палку из "сетевых горбов". Сейчас дело в алгоритме. Надеюсь(проверю) что сейчас я получаю ток в начале периода ШИМ. Понятное дело, одна выборка за период - мало. может попасть и на "выброс" при включении транзистора, может на ровный участок тока, соответственно и ПИ-регулятор с такими данными работаем не совсем корректно. Хочу за период сделать 100 выборок (АЦП позволяет) свалить ч/з ДМА в массив. прогнать эти значения через фильтр. и один раз ч/з ПИ-регулятор (подсунув ему отфильтрованный за период ток). Пока учу синхронизацию АЦП ДМА Таймеров в STM32
  11. Здравствуйте! сделали выпрямитель 50А 40В. Силовая часть: 3-х фазный выпрямитель, первичка ферритового транса включена в транзисторный мост (коммутируем 10кГц, регулируя скважность), во вторичке - диодный выпрямитель и там же шунт-датчик тока Нагрузка бутет динамичная-часто меняться от 0 до ... ограничиваем максимумом 50А. На чтостоте ШИМ 10кГц и возможностью измерять ток 1000.000 в секунду рассчитывал получить минимальные по времени переходные процессы и минимальные пульсации выпрямленного тока. Управлялка сделана на STM32. Сейчас я просто генерю симметричные импульсы, регулирую ток "в ручную" с помощь скважности. Генератор сделан на 3-х каналах Timer1 (кто юзает STM32 тот знает). Прикрутил ПИ регулятор. Ток мерю АЦП с шунта непрерывно, пока не синхронно с ШИМ, завожу на ПИ регулятор, среднее значение тока соответствует заданному, а вот в выходной форме тока явно видны 300Гц (при питании от 3-х фаз) и 100Гц (при питании от 1 фазы). Если увеличиваю коэффициент усиления ПИ-регулятора, пульсации уменьшаются, но и тогда регулятор реагирует на каждый выброс тока... шум стоит не красивый. В общем вопрос как правильно на большой частоте стабилизировать ток? (могу синхронизировать АЦП с ШИМ)
  12. Понятное дело, что есть ядро CORTEX-M3 и перефирия которой окружил это ядро то же STM. В реализации продвинутого таймера от STM, дед-тайм 8 бит всего, для многих применений более чем достаточно, согласен. Пока решить задачу симметричности импульсов комплиментарной пары только настройкой модуля таймера мне не удалось, если я, например увеличиваю период канала таймера (в моём случае CH1) то P-импульс удлиняется, а N-укорачивается, т.е. они симметричны только при скважности 50%. Я реализовал этот алгоритм на прерываниях таймера, но кроме этого прерывания есть и другие, что на высоких частотах управления транзисторами очень сказывается (например, я собираюсь транзистор включить, а тут по SPI байт пришёл) Поэтому хочу организовать полный автомат, типа записал значение в регистр (напр. ССR1), и вся последовательность автоматически сформировалась. Вот думаю если нет прямых путей, посадить P и N ШИМЫ на разные таймеры, рассчитывать для них значения на каждом периоде, и по отсчёту периода таймеров, через DMA новые значения каналам присваивать...
  13. Поставленную задачу мы решили в начале на Cyclone II. Следующий Ваш наводящий вопрос будет "Кто такие эти Cyclone II? "
  14. ШИМ для "моста" на STM32F103

    Здравствуйте! Задача раскачивать трансформатор, транзисторным мостом. Мне нужно генерировать сигналы управления диагоналями транзисторов (одну диагональ назовём P (положительная), другую N-отрицательная) Для этого хотел использовать комплиментарную пару TIM1, думал Dead Time есть и ладно. Чтобы трансформатор не насыщался, длительность P и N импульсов должна быть одинакова (импульсы должны быть симметричны), а при регулировании должно изменятся ширина импульсов (и соответсвенно мертвое время между ними). Период импульсов фиксированный (в нашем случае ~20кГц) В общем, есть ли волшебные настройки ШИМ у STM32, чтобы получить автоматически симметричные импульсы в комплиментарной паре и с дед-таймом? Используя прерывания и пересчитывая CCR1-значения для P и N-импульсов, я достиг желаемого, но при наличии такого продвинутого ШИМ модуля чувствую что подход не правильный. Как эту задачу решить красиво используя продвинутые возможности CORTEX-M3 и STM32 в частности?
  15. Благодарю за подсказку написал так /* Block transfer buffer (located in USB RAM) */ __no_init DWORD DmaBuff[N_BUF][128] @ "USB_DMA_RAM"; // Block transfer FIFO __no_init DWORD LinkList[N_BUF][4] @ "USB_DMA_RAM"; // DMA link list и заработало... но не сразу, там ещё есть интересные функции блочной записи/чтения данных написанные на AS (Store_Block и Load_Block) На Store_Block прога вешалась, не стал в асме разбираться (скорее всего портак допустил при портировании из GCC в IAR) заменил на memcpy, после чего пошли сектора читаться. Теперь (как любитель лёгкой жизни) жду от добрых людей портированные на IAR функции Store_Block и Load_Block
×
×
  • Создать...