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

van_de_luxe

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

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

  • Посещение

Репутация

0 Обычный

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

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

Информация

  • Город
    Array

Посетители профиля

1 008 просмотров профиля
  1. Пишу разный софт для windows (cmake+mingw64), linux, часто возникает желание поковырять на предмет утечек и профилирования, но все никак не решусь. Знаю что для linux есть valgrind, тут хоть как-то понятно направление А вот для винды даже не знаю в какую сторону копать. Есть профилировщик в MSVS, но это вынуждает использовать их компилятор, чего я не хочу. Есть ли для связки Windosw+mingw+cmake решения, работающие из коробки? Или хотя бы с адекватным порогом вхождения.
  2. Привет Начал заниматься MN5375V1 - nanoPAN 5375 - nanoLOC PWR Module У кого-нибудь есть описание протокола, примеры исходников? Очень тяжело и не понятно где искать документацию. На сайте производителя какие-то коровы на картинках и ничего полезного..
  3. перезаписывать нужно. M0AR помнит предыдущее значение, но мне не нужно принимать данные туда же, тем более в кольцевом режиме. Мне нужно их в память складировать если M0AR был 0x20000000 и перекачали 3 байта, он и останется 0x200000000, а не увеличится до 0x20000003. Изменяется скорее всего значения какого-то внутреннего регистра. Это я проверял NDTR уменьшается с каждым перекачанным байтом и его однозначно нужно заново выставлять С CR согласен итого минус одна операция Я правильно понял, что таймер вы предлагаете так использовать: Заранее сформировать значение CR завести DRDY на ногу счетчика таймера и активировать событие таймера для соотв. ему DMA. DMA таймера при этом настроить на режим память-память (вот тут сомнения будет ли он тогда запросы от таймера видеть) Получится так Заранее настраиваем DMA, кроме включения активируем таймер таймер срабатывает, пинает свой поток DMA, который делает запись в регистр CR и включает DMA SPI ждем прерывания RX transfer complete
  4. stm32f407, SCLK 168M //поток RX if(DMA_RX_STREAM->CR & DMA_SxCR_EN){ DMA_RX_STREAM->CR &= ~DMA_SxCR_EN; while(DMA_RX_STREAM->CR & DMA_SxCR_EN){}; } DMA->DMA_RX_IFCR = DMA_RX_CL_ALL; //очистка всех перываний DMA_RX_STREAM->M0AR = (uint32_t)pCurrBuffRx; DMA_RX_STREAM->NDTR = 3; DMA_RX_STREAM->CR |= DMA_SxCR_EN; //вкл потока //поток TX if(DMA_TX_STREAM->CR & DMA_SxCR_EN){ DMA_TX_STREAM->CR &= ~DMA_SxCR_EN; while(DMA_TX_STREAM->CR & DMA_SxCR_EN){}; } DMA->DMA_TX_IFCR = DMA_TX_CL_ALL; //очистка всех перываний DMA_TX_STREAM->M0AR = (uint32_t)&Mem4Tx; DMA_TX_STREAM->NDTR = 3; CS_ACTIVE(); DMA_TX_STREAM->CR |= DMA_SxCR_EN; //вкл потока __ADS_1672_RREF_DMA_TX_STREAM->CR |= DMA_SxCR_EN; //вкл потока и этот код повторяется 2 раза, т.к. у меня 2 АЦП работают синхронно если бы они шли постоянно, проблем бы не было. Между порциями данный есть пауза, в ней и вся проблема, ее нужно обрабатывать В любом режиме DMA может работать непрерывно, генерируя запросы к периферии и ожидая от нее готовности данных. В режиме SPI мастера после настройки и запуска SPI после каждого байта DMA пинает SPI, чтобы тот сгенерировал клок для очередного байта. И пинать будет до тех пор, пока NTDR>0, непрерывно. Прочитать нужно 3 байта По поводу прерываний - я так и делаю. EXTI->старт SPI-DMA->прерывание по окончанию транзакции DMA->и к началу. Времени на это не хватает, написал выше В режиме мастера SPI молотит свой клок без остановки! на какой размер DMA настроили, столько он и зафигачит непрерывным потоком. Если совсем быть точным, то я настраиваю для SPI и TX и RX. в TX подсовываю 3 пустых байта, как раз для того, чтобы SPI сгенерил клок (ножку TX вообще не настраиваю). А данные снимаю в прерывании rx_transfer_complete. После окончания приема и до следующего EXTI SPI должен молчать А вот с таймером мысль интересная, нужно посмотреть его возможности.. но сомневаюсь, что таймер способен запустить чужой DMA. То, что можно через DMA в таймер данные для генерации PWM подсовывать - это да Еще есть мысль использовать таймер в качестве сигнала CLK. Тогда можно будет настроить DMA и SPI на 100500 байт и запуском/остановкой таймера, то бишь клока регулировать процесс приема данных
  5. А как его нужно настраивать? поделитесь секретом Если его настроить скажем сразу на 30 байт, он их все сразу и перекачает, непрерывно, а данные-то в АЦП по DR готовы. А приостанавливать и запускать работу DMA/SPI после каждых 3 байт это не сильно быстрее (и гемор там с SPI есть, что его за 1 байт до окончания нужно тормозить, чтобы корректно остановился), чем его настроить заново. Там и настройки то - адреса и размер указать, интерфейс запустить.
  6. между двумя стробами DataReady 1600 нс переход в обработчик прерывания занимает около 200 нс еще около 200 нс на настройку DMA на чистую передачу данных на 20 МГц тратится 24*(1/20М)=1200 нс Одна неверная операция и начинаем терять данные В реальности, работая по прерываниям+DMA я пропускаю 1 отсчет из двух, т.к. настройка DMA и отладочный ногодрыг съедают еще пару сотен нс В этих ПЛИС есть встроенная память для прошивки или в них вообще прошивка как таковая это конфигурирование внутренней структуры, которая сохраняется без питания?
  7. Почему же не сработает? скорость передачи будет минимум в 8 раз больше, а это освободит время на другие задачи. Да и обработка там не сложная (напряжение посчитать и с порогами сравнить), ее я в ПЛИС хочу сделать. В МК есть проблема с временем реакции на внешнее прерывание, ПЛИС должна справиться быстрее. Проблема не с объемом данных, а с задержками начала обмена
  8. Приветствую Решаю задачку получения данных с АЦП ADS1672 с частотой 625ksps. Контроллер с такой частотой данных уже не справляется (или справляется, но на пределе, что все время занимает работа с АЦП). Хочу перенести часть нагрузки на внешнюю ПЛИС, а именно чтение данных(3 байта в доп. коде) по SPI (на скорости 20, а в перспективе 30 Мбит/с), конвертирование данных в напряжение (float), подергать ножками в случае превышения порогов по напряжению, передать данные на микроконтроллер по к.н. параллельному интерфейсу Когда-то щупал FPGA, даже на verilog светодиодами поморгал, но сейчас в голове ничего не осталось. Подскажите какую ПЛИС можно выбрать для этих задач, сколько она примерно будет стоить, на чем лучше разрабатывать ПО (видел графические генераторы кода, verilog, vhdl.. , среды разработки), какой дешевый программатор к ним прикупить, и подскажите хороший источник примеров/исходников
  9. Нашел ошибку, вот правильный код, если кому понадобится void UnlockSequence() { PMCON2 = 0x55; PMCON2 = 0xAA; WR = 1; NOP(); NOP(); } void WriteRowFlash(uint16_t adr){ uint8_t StatusGIE = GIE; GIE = 0; CFGS = 0; PMADR = adr; FREE = 0; LWLO = 1; WREN = 1; PMDAT = 0xaaaa; LWLO = 0; UnlockSequence(); WREN = 0; GIE = StatusGIE; }
  10. Контроллер PIC16LF1709 Компилятор XC8 Необходимо в контроллере хранить калибровочные поправки в возможностью изменения. Чтение и стирание памяти сделать получилось, делал как описано в даташите uint16_t ReadWordFlash(uint16_t adr){ PMADR = adr; CFGS = 0; RD = 1; NOP(); NOP(); return PMDAT; } void EraseRowFlash(uint16_t adr){ uint8_t StatusGIE = GIE; GIE = 0; PMADR = adr; CFGS = 0; FREE = 1; WREN = 1; //unlock sequense PMCON2 = 0x55; PMCON2 = 0xAA; //start erase WR = 1; //wait NOP(); NOP(); //wait ~2ms operation WREN = 0; GIE = StatusGIE; } А вот с записью проблемы. Делал по тому же даташиту, но в результате в памяти никаких изменений. (код сократил до записи в память 1 слова) void WriteRowFlash(uint16_t adr){ uint8_t StatusGIE = GIE; GIE = 0; CFGS = 0; PMADR = adr; FREE = 0; LWLO = 1; WREN = 1; PMDAT = 0xaaaa; LWLO = 0; //unlock sequense PMCON2 = 0x55; PMCON2 = 0xAA; //wait NOP(); NOP(); WREN = 0; GIE = StatusGIE; } Подскажите, что делаю не правильно
  11. ___Sergey___, выложи плиз конечный вариант. Я сейчас только начинаю с ПЛИС работать и тоже нужно spi slave реализовать
  12. Startup.S для stm32

    Компилю на Eclipse проект для платы STM32L-Discovery (взятый и адаптированный из TrueStudio) все бы ничего, да только выдает ошибку: ite/bin/../lib/gcc/arm-none-eabi/4.5.2/../../../../arm-none-eabi/lib/thumb2\libc.a(lib_a-init.o): In function `__libc_init_array': init.c:(.text+0x38): undefined reference to `_init' collect2: ld returned 1 exit status cs-make: *** [STM32L_Test_debug2.elf] Error 1[Libraries/CMSIS/CM3/DeviceSupport/ST/STM32L1xx/startup/TrueSTUDIO/startup_stm32l1xx_md.o] Error 1 у меня был еще 1 проект для другой платы, я сравнил sturtup файлы этих проектов и в том, который работает не было строчки ... /* Call static constructors */ bl __libc_init_array ... т.е. файл выглядел так ... LoopFillZerobss: ldr r3, = _ebss cmp r2, r3 bcc FillZerobss /* Call the clock system intitialization function.*/ bl SystemInit /* Call the application's entry point.*/ bl main bx lr .size Reset_Handler, .-Reset_Handler ... я убрал эту строчку и все отлично скомпилировалось, но программа работает не так как нужно В общем, вопрос такой что это за конструктор и что он делает в startup файле? может мне нужно его как то задействовать?
  13. Нужно чтото вроде cmx618 http://www.cmlmicro.com/products/twoway/cmx608_618.htm Проблема в том, что их заказать или трудно или очень долго. Хотелось бы еще варианты подыскать, которые чаще используют и легче добыть
  14. Задачка: кодирование-передача-раскодирование речи скорость передачи не более 8кБит/с Как я понимаю, нужен кодек с частотой семплирования от 8кГц
×
×
  • Создать...