STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Мудрый кот
Сообщения: 1753
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

Сообщение Novice user »

Уважаемые коты,как переделать настройку АЦП в режим интерлив?
В DUAL MODE переделал без проблем-
СпойлерADC_CommonInitStructure.ADC_Mode = ADC_Mode_RegSimul;
ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1; // Доступ DMA к общему регистру, при 12-бит оцифровке
ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_Circular;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0x0;
ADC_CommonInit(ADC1, &ADC_CommonInitStructure);
Реклама
Мудрый кот
Сообщения: 1753
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

Сообщение Novice user »

[uquote="Novice user",url="/forum/viewtopic.php?p=3732298#p3732298"]Уважаемые коты,как переделать настройку АЦП в режим интерлив?
В DUAL MODE переделал без проблем-
СпойлерADC_CommonInitStructure.ADC_Mode = ADC_Mode_RegSimul;
ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1; // Доступ DMA к общему регистру, при 12-бит оцифровке
ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_Circular;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0x0;
ADC_CommonInit(ADC1, &ADC_CommonInitStructure);
[/uquote]
Решено,всем спасибо!
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

В кои-то веки решил воспользоваться кубом, чтобы по-быстрому набросать макет обмена данными по параллельному восьмибитному интерфейсу. По-быстрому, впрочем, не получилось, т.к. сразу же налетел на грабли, заботливо подложенные стм-овскими индусами. Итак, по порядку. Беру голубую пилюлю (stm32f103cb), раскидываю ноги в кубе следующим образом:
СпойлерИзображение
PA0-PA7 -- все в режиме выхода, состояние у всех высокое (лог. 1). Компилирую код, запускаю в отладку и обнаруживаю, что после выполнения MX_GPIO_Init() все пины продолжают пребывать в состоянии логического нуля. Попытки вразумить куб, перегенерить код и прочее ни к чему не приводят. Лезу в код. С виду все в порядке:

Код: Выделить всё

static void MX_GPIO_Init(void) {
  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC);
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOD);
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);

  LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_3 
                          |LL_GPIO_PIN_4|LL_GPIO_PIN_5|LL_GPIO_PIN_6|LL_GPIO_PIN_7);

  GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_3 
                          |LL_GPIO_PIN_4|LL_GPIO_PIN_5|LL_GPIO_PIN_6|LL_GPIO_PIN_7;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
Выполнение строки

Код: Выделить всё

  LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_3
                          |LL_GPIO_PIN_4|LL_GPIO_PIN_5|LL_GPIO_PIN_6|LL_GPIO_PIN_7);
переводит нужные мне пины в высокое состояние, но длится это не долго, т.к. вызов LL_GPIO_Init(GPIOA, &GPIO_InitStruct); шестью строками ниже возвращает все в исходную. Лезу смотреть, что же там в этом волшебном ините и обнаруживаю совершенно ишемический код и настоящую сокровищницу индусской программистской мысли:
Спойлер

Код: Выделить всё

ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStruct)
{
  uint32_t pinmask;
  uint32_t pinpos;
  uint32_t currentpin;

  /* Check the parameters */
  assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
  assert_param(IS_LL_GPIO_PIN(GPIO_InitStruct->Pin));

  /* ------------------------- Configure the port pins ---------------- */
  /* Initialize  pinpos on first pin set */

  pinmask = ((GPIO_InitStruct->Pin) << GPIO_PIN_MASK_POS) >> GPIO_PIN_NB;
  pinpos = POSITION_VAL(pinmask);

  /* Configure the port pins */
  while ((pinmask  >> pinpos) != 0u)
  {
    /* skip if bit is not set */
    if ((pinmask & (1u << pinpos)) != 0u)
    {
      /* Get current io position */
      if (pinpos < GPIO_PIN_MASK_POS)
      {
        currentpin = (0x00000101uL << pinpos);
      }
      else
      {
        currentpin = ((0x00010001u << (pinpos - GPIO_PIN_MASK_POS)) | 0x04000000u);
      }

      /* Check Pin Mode and Pin Pull parameters */
      assert_param(IS_LL_GPIO_MODE(GPIO_InitStruct->Mode));
      assert_param(IS_LL_GPIO_PULL(GPIO_InitStruct->Pull));

      /* Pin Mode configuration */
      LL_GPIO_SetPinMode(GPIOx, currentpin, GPIO_InitStruct->Mode);

      /* Pull-up Pull-down resistor configuration*/
      LL_GPIO_SetPinPull(GPIOx, currentpin, GPIO_InitStruct->Pull);

      if ((GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT) || (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE))
      {
        /* Check speed and Output mode parameters */
        assert_param(IS_LL_GPIO_SPEED(GPIO_InitStruct->Speed));
        assert_param(IS_LL_GPIO_OUTPUT_TYPE(GPIO_InitStruct->OutputType));

        /* Speed mode configuration */
        LL_GPIO_SetPinSpeed(GPIOx, currentpin, GPIO_InitStruct->Speed);

        /* Output mode configuration*/
        LL_GPIO_SetPinOutputType(GPIOx, currentpin, GPIO_InitStruct->OutputType);
      }
    }
    pinpos++;
  }
  return (SUCCESS);
}
Из вышеприведенного следует, что индусы пребывают в абсолютной уверенности, что подтягивать пины (вверх или вниз) надлежит вне зависимости от того, как сконфигурирован пин: как вход или выход. Это подтверждает вызов

Код: Выделить всё

      /* Pull-up Pull-down resistor configuration*/
      LL_GPIO_SetPinPull(GPIOx, currentpin, GPIO_InitStruct->Pull);
абсолютно для всех инициализируемых пинов. Это не было бы проблемой для F0 или F3-F4 где пуллап/пулдаун задается состоянием отдельного регистра, но на F1 направление подтяжки (вверх/вниз) указывается в регистре ODR. Это если пин в режиме входа. Если пин в режиме выхода, то через этот же самый ODR управляют состоянием выхода. И вот эти белозубые улыбчивые дебилы со всей этой своей первобытной решительностью начинают "подтягивать" выход. Через ODR. К земле. Ну молодцы, фигли.
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

а зачем вызывать SetOutputPin (да и что угодно еще gpio-шное) перед GPIO_Init?
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Вот и a5021 недоумевает, зачем кодогенератор так делает.
Контактная информация:
Реклама
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн янв 21, 2019 17:38:29

Сообщение DrobyshevAlex »

Здравствуйте! Подскажите, есть дисплей
Изображение
Хочу заказать МК STM32F407VGT6 но в ДШ примечание
For the LQFP100 and WLCSP90 packages, only FSMC Bank1 or Bank2 are available. Bank1 can only support a multiplexed NOR/PSRAM memory using the NE1 Chip
Select. Bank2 can only support a 16- or 8-bit NAND Flash memory using the NCE2 Chip Select. The interrupt line cannot be used since Port G is not available in this
package.
Будет ли мой дисплей работать с данным МК по FSMC?
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="DrobyshevAlex",url="/forum/viewtopic.php?p=3736840#p3736840"]Будет ли мой дисплей работать с данным МК по FSMC?[/uquote]
Будет. Для 8-ми битной шины FSMC даже у некоторых F4 в lqfp-64 выведен.
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн янв 21, 2019 17:38:29

Сообщение DrobyshevAlex »

Спасибо! А если я хочу подключить AD9280 к своему МК, там тоже параллельный интерфейс как я понял, его можно подключить по FSMC? И если да, то STM32F407VGT6 не подойдет? Я не понял что такое Bank1 и 2 но думаю это типа на других мк, у которых более 100 ног можно подключать 2 разных устройства по FSMC?
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

DrobyshevAlex если не понимаете лучше вообще не заниматься этим, это для специалистов.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн янв 21, 2019 17:38:29

Сообщение DrobyshevAlex »

ок босс

Добавлено after 2 minutes 8 seconds:
я думал что люди юзали и им просто ответить на этот вопрос) типа да, для двух независимых fsmc нужно версия в корпусе 144 ноги)
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

ты должен сам в этом разобраться, а если не хочешь разбираться и тратить время завязывай.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн янв 21, 2019 17:38:29

Сообщение DrobyshevAlex »

я всего лишь спросил можно ли подключить два устройства по FSMC и что бы без потери производительности, то есть что бы одно устройство не простаивало пока идет опрос второго. речь о камнях STM32F407 в 100 ногом корпусе и в 144. будет ли разница и позволяют ли они вообще это сделать.

спросил потому что хочу заказать камень и пока он будет идти сделать платку и разбираться уже с прошивкой, я уже заказал два, потратил 600р, они пришли, а оказалось что в них нет fsmc и я не прочел про это потому что прочел только шапку дш в которой написано что есть но где то ниже написано что не для всех камней, а дальше я не читал так как камней еще не было, к приходу я бы все забыл уже без практики

прошу прощения что задал вопрос и потревожил... просто мне например не сложно ответить если я знаю ответ и позволяет время написать)
Электрический кот
Аватара пользователя
Сообщения: 1029
Зарегистрирован: Сб мар 09, 2013 11:29:22
Откуда: 40RUS, Жуков

Сообщение 240265 »

А зачем для ацп FSMC . Читайте просто из портов , скорость та-же. FSMC хорош тем что он сам формирует служебные сигналы аппаратно. А с портом работать самому нужно.
IVL ex UA6PJ
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн янв 21, 2019 17:38:29

Сообщение DrobyshevAlex »

[uquote="240265",url="/forum/viewtopic.php?p=3737220#p3737220"]А зачем для ацп FSMC . Читайте просто из портов , скорость та-же. FSMC хорош тем что он сам формирует служебные сигналы аппаратно. А с портом работать самому нужно.[/uquote]
Я думал будет быстрей. Все равно же дергать ногами.
Я планировал для максимальной скорости брать данные и класть в массив с помощью DMA.
То есть записать кусок на максимальной скорости а потом уже пролистывать кнопочками...
В то же время выводить на экран промежуточные снимки массива, последние 256 байт.
На экран тоже слать ДМА + FSMC.
Если я буду опрос делать в основном цикле, то нужно будет тратить процессорное время на формирование массива для отрисовки на экран, и в то же время читать данные с порта.
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

Сообщение Sergi »

Я бы отдал один полупорт под АЦП + ПДП. Второй полный или полупорт под дисплей. Для дисплея все равно нужно передавать управляющие команды и особо ПДП не разгонится хоть GPIO хоть FSMC.Ну это если например буфер на строку не делать.
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн янв 21, 2019 17:38:29

Сообщение DrobyshevAlex »

Тут пытаюсь нагуглить можно ли вообще АЦП считать с FSMC, пока не нашел. На мой взгляд должно быть можно, но я с ним не работал.
Запустил куб, 100 ногий мк может работать только с 1 каналом как и написано в дш. А вот 144 побогаче )

Но пока не разобрался как настроить АЦП на чтение по FSMC.
Камня нет, опыты поставить не получится ) Пытался найти статью, не нашел.

Знаю лишь что для запуска ADC нужно слать импульс, я так понимаю тут таймер выручит, что бы ногой дергал.
А вот как считать, не понятно пока какой режим выбрать.

Другой момент что я видимо не сразу понял про совет работать с портом в сообщении выше. Видимо имелось ввиду просто порт писать в память. Это вараинт видимо подойдет.

Еще нашел что люди АЦП опрашивают через интерфейс камеры...

Добавлено after 2 hours 27 minutes 12 seconds:
Вообщем заказал STM32F407VGT6 так как SRAM смысла нет подключать, мало очень этого рама и скорость у него медленней АЦП в разы.

А чтение АЦП попытаюсь через интерфейс камеры прикрутить, а если не выйдет ( а в интернете я так и не нашел кто написал что да я подключил работает!) то просто ДМА чтение ног в массив. Буду выделять пару КБ под хранение, думаю хватит поиграться ))

Добавлено after 2 hours 35 seconds:
ну вот, опять заказал вначале а потом посмотрел на свой дисплей, и понял, что все эти дисплеи заточен под ардуино уно, хоть там и есть интерфейс, но что бы работал сенсор, нужно использовать порты 0 и 1. А так же пару управляющих портов. Выходит что нужно будет FSMC отключать постоянно что бы делать опрос сенсора, еще и АЦП встроенный подводить к параллельно, что бы измерять показания сенсора...

Единственное что приходит на ум, то в рабочем режиме, пока рисует график, отключать сенсор... Вот по этому и задаю вопросы на форуме, если кто то сталкивался, может подсказать, что нафиг тебе фсмц которе придется вырубать кучу раз в секунду...
Мучитель микросхем
Сообщения: 413
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

Сообщение Sergi »

Что вы хотите? Захват с внешнего АЦП можно делать с помощью ПДП за 7-4 тактов (зависит от процессора f103-f407) из GPIO или FSMC, или если есть интерфейс камеры - за 2-2.5 такта(зависит от ширины данных). Опрос резистивного сенсора требует 2х входов АЦП и 2х логических выходов. Для этого используется внутренний АЦП контроллера.На какие ноги подключать - дело разработчика. Дисплей с сенсором обычно не пересекаются.
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн янв 21, 2019 17:38:29

Сообщение DrobyshevAlex »

Захват АЦП так и планирую делать, интерфейсом камеры, если смогу разобраться как, ни разу не юзал. Если нет то ДМА.

Про сенсор я написал, он на тех же ногах что и линии управления экраном: LCD_CS (touch data X), LCD_RS (touch data Y+), LCD_D0 (touch data Y-), LCD_D1 (touch data X+).
https://github.com/blahlt/notes/wiki/IL ... -parallel)
Что бы юзать FSMC мне нужны определенные ноги мк, они не пересекаются с каналами АЦП МК. По этому видимо нужно параллелить. Но, для опроса АЦП прийдется выключать FSMC и включать АЦП, а по окончании опроса выключать АЦП и включать FSMC... Отсюда, подозреваю, будет графика рывками...
По этому я и написал, что скорей всего от сенсора придется отказаться во время показа графика с АЦП.

А вся беда в том, что кто то решил сделать все экраны исключительно для ардуино... я вчера перелистал али, нашел без платки вообще дисплеи, нужно будет разхем для шлейфа и самому разводить, или по SPI. других вараинтов нет, 99.9 % для ардуино уно, как будто нет людей которые юзают стм и сами паяют платки...
На этой платке куча пинов свободных, не нашел версии где сенсор отдельно и не SPI интерфейс.

Добавлено after 4 minutes 15 seconds:
На ардуино вообще все помешались... я вчера два часа потратил, нашел кучу версий запуска экрана на стм, все они юзали либы GFX + Arduino
Что такого в этом ардуино, что без него не могут дисплей люди запустить?
Буду на днях пытаться запустить сам, без либ...

Может кто знает где есть либа без ардуино? Что б я ее просто кинул в папку и юзал? для ILI9341 (2.4'' LCD Shield 8 bit parallel)

Добавлено after 12 minutes 13 seconds:
По поводу нтерфейса камеры пока самый главный вопрос, можно ли его настроить не на такую скорость работы.
АЦП мой 32 М выборок/с, AD9280. А вот ОУ на 10мГц. Сейчас вот ищу, заказать АЦП AD8066, но все отзывы что читал, пишут что подделка... что по факту 20мГц работает.
То есть если не найду AD8066 и AD9283 настоящие, то скорость камеры пишут порядка 50 мгц, я буду получать одни и те же данные 2-3 раза, то етсь это лишние 2-3 байта будут тратится из памяти в некуда...
Ну и менять скорость выборок, как? Мне нужно будет задать.

В интерфейсе камеры я беглым просмотром заметил настройку завата каждого кадра, каждого второго и каждого 4го.
То есть это и все что можно будет сделать по скорости. Меньше не поставить. Хотелось хотя бы до 1 МГц опускать скорость.

ДМА вообще видимо на одной скорости будет класть данные в память.

Можно конечно посмотреть в сторону настройки тактирования, я так понимаю на ходу стм можно менять скорость тактирования, но нужно изучить этот вопрос.

Добавлено after 8 minutes 46 seconds:
Вот отсортировал по заказам и смотрю отзывы
Спойлерпервый продавец, почти все пятерки, но
Дополненные отзывы
печально но данные микросхемы не являются ад8066, при КУ ОУ =6 меандр на выходе полноценный синус и скорей всего эти операционники имеют 1-5МГц максимум при единичном усилении, мср6022 и то лучше справляются и в два раза дешевле хорошо что есть куда их применить кроме изделия в который планировались
другой продавец, тоже почти все 5ки
Судя по всему, это не какой-нибудь lm358, параметры довольно неплохие, хотя нельзя утверждать, насколько они близки к оригиналу. В диапазоне частоты 1- 8 МГц амплитуда усиливаемого сигнала при коэффициенте усиления 1-3 практически постоянна, дальше начинается завал
А судя по тому, что там три подряд идут магазина, которы берут в одном месте или это один и тот же чел, то думаю купить там оригинал нет возможности :)

чип и дип тарится там же, заказал транзисторы по 700р, пришли с напаянными ножками и почерневшие, как с того же китая которые заказывал по 70 рублей!
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="DrobyshevAlex",url="/forum/viewtopic.php?p=3737502#p3737502"]Про сенсор я написал, он на тех же ногах что и линии управления экраном[/uquote]
Тач при желании можно отпаять и пустить отдельно, я так на одном дисплее делал, правда там разъем был другой.
Может кто знает где есть либа без ардуино? Что б я ее просто кинул в папку и юзал?
Критикуешь ардуино, но по сути хочешь ничего не делать, как на ардуино :)
По поводу нтерфейса камеры пока самый главный вопрос, можно ли его настроить не на такую скорость работы.
DCMI_PIXCLK берется с мк, соответственно скорость может быть любой.
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн янв 21, 2019 17:38:29

Сообщение DrobyshevAlex »

[uquote="Reflector",url="/forum/viewtopic.php?p=3737576#p3737576"]Тач при желании можно отпаять и пустить отдельно, я так на одном дисплее делал, правда там разъем был другой.[/uquote]

Вот как раз зашел написать что решил перерезать дорожки тача) оторвал дисплей посмотрел, можно отрезать тача дорожки и 4 провода тонки вывести...

[uquote="Reflector",url="/forum/viewtopic.php?p=3737576#p3737576"]Критикуешь ардуино, но по сути хочешь ничего не делать, как на ардуино :)[/uquote]

По поводу не хочу, я все либы для дисплеев пока сам писал, то есть для 1602 и для 1.8 дюйма по SPI. я изначально на нем хотел делать осцил.
Я и опять напишу для 2.4. Либа нужна мне была тупо запустить экран на макетке со 103 камнем, проводками хотел соединить и запустить пока, хотя бы увидеть работает ли дисплей))


[uquote="Reflector",url="/forum/viewtopic.php?p=3737576#p3737576"]DCMI_PIXCLK берется с мк, соответственно скорость может быть любой.[/uquote]

Если скорость захвата любая, то это просто супер :)

ЗЫ а как вы цитируете по отдельности каждое сообщение? я могу только весь пост процитировать)) а потом руками расставить цитаты)

Добавлено after 3 minutes 57 seconds:
Изучаю эту схему https://radiokot.ru/forum/viewtopic.php?f=59&t=144434
Очень понравилось решение использовать ADC + SRAM с счетчиками. Но вот беда, нет таких на али, есть, но там 10 штук стоят 700р плюс отправка 500.
Смотрел в сторону 74HC163D но там скорость медленная очень. 6МГц вроде бы.

Ковыряние куба и ДШ пока говорит о том что даже в 144 корпусе я дисп и память на одни ноги вешать буду, видимо он по очереди будет работать с тем и тем. В целом думаю не страшно, в реал тайм все равно вывести не выйдет большую скорость а полистать нормально.

Добавлено after 1 hour 39 minutes 30 seconds:
Подскажите, если не трудно, на STM32F407VGT6 есть FSMC, в кубе написано SRAM/LCD 1/PSRAM/... но в развернутом виде MemoryType только LCD NOR Flash и PSRAM.
То есть SRAM не подключить?
Ответить

Вернуться в «ARM»