Jump to content

    

xmailer

Участник
  • Content Count

    18
  • Joined

  • Last visited

Community Reputation

0 Обычный

About xmailer

  • Rank
    Участник

Recent Profile Visitors

450 profile views
  1. Нельзя. Прерывание ставится на получение указанного кол-во байт. Вы как-то выхватили фразу из контекста. Там же дальше человек пишет подробнее что он имел ввиду под этой фразой.
  2. Парни, я вас понял, буду пробовать со старой версией кода, сгенеренного кубом дальше двигаться. У меня там fatfs не завелся, а в новом завелся, буду пробовать инжектить его в старый проект
  3. да, это обо мне, тут скорее не умение разобраться, а удобство использование готового обвеса библиотеки, библиотека же как бы от производителя, кто лучше то напишет. Работа очень косвенно связана с микроконтроллерами, поэтому разбираться донизу не получается. jcxz, скажите кратко с чего у Вас начинается новый проект? Вы с нуля пишете руками? или у вас свой набор
  4. Все оказалось по другому: иначально код был сгенерен в Cube MX версии xxx для keil, вся работало на ура, по мере обновления куба с какой-то версии стала проявляться нестабильность работы проекта, заметили не сразу, поэтому пытались искать причингы в своем коде. Отсюда вопрос - какие инструменты используете в работе: HAL, периф? вообще куб кто-нить использует?
  5. Спасибо за ответы! Интересные мнения, есть о чем подумать, попробую позже формализовать проблему. Согласен что диагностировтаь по такой постановке не получиться.
  6. Добрый день! поясните пож-та вопрос: что можно делать в прерываниях? как понять что вот эти дейстия еще допустимы, а это уже не стоит делать в прерывании. Всегда считал, что в прерывании работаем только с переменными-флагами, затем ловим эти флаги в основном цикле и призводим необходимые действия. Ситуация с рабочим примером: 1. принимаем с частотой 10-20Гц данные с uart, складываем в переменные 2. данные из переменных пункта 1 меняют характеристики входящего видеосигнала, т.к. работа ведется с видео, то время - важный фактор И получается такая картина: Если обрабатывать поступаемые в uart данные в RxCallback сразу, то реация на видео сразу происходит. Если в RxCallback выставлять флаг и обрабатывать данные в основном цикле, включается какой-то тормоз. Работа с видео ведется также в прерываниях, только от таймеров. Спасибо!
  7. Вы имели ввиду один spi с висящими на разных cs устройствами - да, согласен. Но в проекте spi работают несколько иначе, они тактируются таймерами по своим правилам, несколько своеобразное решение, но это нужно. полностью согласен, просто хотел остаться на уровне библиотеки fatfs. ОК, пошел в raw level
  8. Добрый день! Может кто столкивался и решение на поверхности, подскажие или направьте пож-та. Необходимо писать и читать файлы на micro sd. Сразу оговорюсь - через spi все ништяк работает, кушает все карты на ура, но spi использовать нельзя, их под другие задачи в обрез. Через sdio - нет, долго плясал с форматами файловых систем, размерами блоков - не работает, FR_NO_FILESYSTEM на этапе immediately монтирования. Пробовал применить f_mkfs к карте - не работает, карта однозначно не форматируется. Может у кого есть модуль заводский с aliexpress посмотрите может я что упускаю, по питанию или по подтяжкам, которые у меня программные на gpio (кроме clk). Ранее работал в старой версии cubemx и fatfs иногда удавалось подобрать карту, на которую что-то писалось, но все равно очень все было не стабильно. В настоящее время обновился и смотрю та же борода. ПО: cubemx 5.2.0, FW_F4 1.24.1, fatfs r0.12c, keil 5.23.0.0 Не хотелось бы на месяц уходить в дебри дебага, буду благодарен любой информации. Спасибо.
  9. Такой контроль будет делаться. Это как раз моя ситуация, malloc будет делаться один раз при старте, потом созданные массивы просто используются, без ресайза и free достаточно сложной подход, наверное долго отлаживали
  10. Поясню алгоритм работы, почему возник данный вопрос: 1. пользователь в win приложении ведет список, состоящий из нескольких полей (достаточно разный по объему данных); 2. пользователь в приложении имеет возможность скинуть данные списка в файл на sd, данные пишу в бинарный файл; 3. sd карта вставляется в устройство на stm32, потом reset или power on, при запуске читается данные этого списка, что определяет алгоритмику работы. Рассматривались попытки организовать все по usb, через virtual port com, запись данных списка в eeprom, но было решено что с sd будет проще и мобильнее (устройство с собой не потаскаешь, с ноутбуком тоже не всегда удобно). Мне кажется ситуация достаточно типичная для работы устройства на stm32. Кто как поступает в таких случаях? Данный подход требует ребилда hex-а и его прошивка в камень. Мы сейчас так делаем, задумали как временное решение, поэтому сейчас пытаемся уйти от этого решения. Именно от сомнений использования malloc возник вопрос. общий массив какого размера? по максималке, но может быть и 100байт, а может 100Кбт. Этим рулит пользователь. И можно попасть в ситуацию что выделенный массив мал по размеру или просто живет, отъедает память. это можно использовать на относительно статичных данных.
  11. Люди с опытом в С в keil, подскажите, есть файл на sd (размер может быть различным), нужно его читать в самом старте и куда-то писать, потом эти данные активно используются. Если бы разговор был о каком нить C#,Delphi,VB,... я бы однозначно читал бы в динамический массив, но вот в случае C на stm32 камне возникли сомнения. Имеет ли право следующий код считаться рабочим, код работает, проверял в отладчике. Но вот как отследить - хватит ли свободной памяти под массив, если допустить, что файлов может быть несколько, то это может быть проблемой. Или может есть другие варианты, без массивные. Можно конечно постоянно держать открытым файл и читать из него данные, но файл на sd, и если sd слетит по разным причинам, то все - приехали. Поэтому sd хотел задействовать на начальном этапе - при старте, потом можно вообще sd отмонтировать, и уже работать со считанными данными. Спасибо! uint8_t *adata; adata = (uint8_t *) malloc(РазмерМассива*sizeof(uint8_t)); adata[0] = 9; adata[1] = 8; adata[2] = 7; adata[3] = 6; ... // for(i=0;i<10;i++){ uint8_t x = adata[i]; }
  12. подскажите пож-та типовой подход к ситуации: необходимо из своего windows приложения организовать прошивку "голого" камня hex файлом (т.е. это не discovery, nucleo) по usb. Сейчас это делаю через ftdi с соблюдением уровней на соответствующих пинах и Flash Loader Demo от stm32. Из вариантов видны следующие: способ 1: - организовать перемычку для прошивки для соблюдения уровней - запуск STMFlashLoader.exe с параметрами прошивки способ 2: - использовать в своем проекте исходники Flash Loader Demo Возможно есть другой алгоритм? Спасибо.
  13. Парни, вижу что вы на форуме с опытом, просветите по созвучной с SPI темой (чтобы не плодить тем) - DMA в Periph и HAL, а именно не нашел в HAL аналога атрибуту DMA_InitStructure.DMA_Memory0BaseAddr, т.е. собственно DMA_Memory0BaseAddr задает ссылку на memory переменную и после разрешения DMA и SPI осуществляется передача (в примере ниже цикличная) данных из переменной в SPI->DR. В HAL такой конкретной линковки с переменной нет, я правильно понимаю, что функцию линковки можно считать HAL_SPI_Transmit_DMA(&hspiX, (uint8_t *)&buffer, sizeof(buffer))? Или дайте наводку на аналог DMA_PeripheralBaseAddr в HAL. Спасибо. в Periph: DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.с = (uint_t)&buffer; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; ... пуск передачи DMA_Cmd(DMA2_StreamX,ENABLE); SPI_Cmd(SPIX, ENABLE); в HAL: ... hdma_spiX_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_spiX_tx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_spiX_tx.Init.MemInc = DMA_MINC_ENABLE; hdma_spiX_tx.Init.Mode = DMA_CIRCULAR; ... HAL_DMA_Init(&hdma_spi1_tx); // линк __HAL_LINKDMA(hspi,hdmatx,hdma_spiX_tx); ... пуск передачи __HAL_DMA_ENABLE(&hdma_spiX_tx); __HAL_SPI_ENABLE(&hspiX);
  14. Спасибо! Понял, принял, согласен. Скажите, HAL_SPI_Transmit после успешной передачи должен очищает SPI->DR? у меня сейчас передаваемое значение зависает в SPI. На другом форуме ребята говорили, что на некоторых камнях HAL_SPI_Transmit работает не корректно, рекомендовали пользоваться HAL_SPI_TransmitReceive. Что нужно чтобы передать по SPI значение один раз?
  15. Подскажите пож-та, пытаюсь тактировать SPI по своему алгоритму: 1. настроил на таймере Output Compare на 1 секунду и режимом Toggle on match, на выходе получаю секундный меандр 2. соединил выход таймера с пином тактирования SPI, по идее теперь SPI должен сдвигать свой регистр с частотой в 1 секунду 3. пытаюсь передать 1 бит 01010100 в SPI и жду на выходе мигание светодиодом 3 раза с задержкой 1 секунда ----- проблема ------- 1. диод мигает не с секундной задержкой, о несколько дольше. 2. передача повторяется циклично, т.е. передачей одного байта дело не заканчивается, он снова и снова передается, или просто зависает на MISO Иллюстрация настроек и работы