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

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

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

Сообщение Satyr »

Периферия и ядро от другой шины питаются. Вот ей бы ты внимание уделил.
Полезный сигнал и 'шум' ты цифровать будешь не синфазно, а поочередно. Так что сработать это может (в предположении твоего происхождения шумов -)) ) только если верхняя граница спектра шума много меньше частоты дискретизации.

Вобщем, рекомендую заняться разводкой и питанием (и Vref внешний!), а не этими изысканиями
Реклама
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

За совету спасибо) . Я понимаю, что надо заняться и трассировкой нормально и дроссель хоть повесить (там нарушено все что можно сейчас :) .)
Satyr писал(а):только если верхняя граница спектра шума много меньше частоты дискретизации
Вот на это акцент и делаю.
Сейчас чисто научный интерес появился, так как ранее такого подхода не встречал. Не разберусь только с каналами. Как там у меня с алгоритмом, может подскажет кто?
Реклама
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

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

Сообщение Satyr »

Давно c STM32 не возился.
Но, насколько помню, там тупо делается 'карусель' - набираешь список каналов, запрягаешь DMA, а дальше он тупо подряд выкладывает в буфер значения по очередно с каналов в списке и так далее по кругу.
Помню только, что там в документации и примерах все было вполне доступно и доходчиво.
Да, и не надо сразу лезть к голым регистрам - используй библиотеки производителя. Выгоды от ковыряния с регистрами - пара сотней байт кода и ноль в производительности. Ибо только настройка.

Но пытаться чтото там алгоритмически компенсировать при убитой аналоговой части - это глупость.
По хорошему аналоговая часть питается от отдельного стабилизатора. Аналоговые Vcc, Vref, Vpll (не помню, есть он на STM32 ?) каждый отдельным LC фильтром вплотную к ногам.
И не игнорировать рекомендации на стабилизаторы - типы и номиналы кондеров. бОльше совсем не значит лучше.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Satyr писал(а):Но, насколько помню, там тупо делается 'карусель' - набираешь список каналов, запрягаешь DMA, а дальше он тупо подряд выкладывает в буфер значения по очередно с каналов в списке и так далее по кругу.
Регистр один, а каналов много. Да и никаких флагов с номером канала, данные от которого хранятся в регистре, я не нашел :dont_know:
Satyr писал(а): Да, и не надо сразу лезть к голым регистрам - используй библиотеки производителя.
Я ещё с АВР работаю с регистрами. Так у меня все на глазах :) .
Satyr писал(а): - это глупость.
Это не глупость - это интерес. Интересны результаты вообщем, а не к конкретному случаю.
Да и вообще, у меня проект предусматривает несколько каналов АЦП, а тут хрень такая - по-любому что-то решать нужно....
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

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

Сообщение Myp3ik »

isx писал(а):Регистр один, а каналов много.
И ячеек в массиве тоже много, что бы DMA сохранял каждый канал по определённому индексу в массиве.
Иван Сусанин - первый полупроводник :solder:
Реклама
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

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

Сообщение Satyr »

Как пример. Вызвал и забыл.

Далее в ADC3ConvertedValue[] чудным образом постоянно сами обновляются значения на 12 и 13 канале. Впринципе хоть все можно в список напихать.
И еще на DMA надо прерывание наточить, чтоб сообщало как об обновлении значений в массиве (как круг по памяти сделает)
И на некоторых семействах надо еще калибрацию ADC в ините запустить

__IO uint16_t ADC3ConvertedValue[2];

#define ADC3_DR_ADDRESS ((uint32_t)0x4001224C)

void BOARD_ADCInit()
{
DMA_InitTypeDef DMA_InitStructure = {
.DMA_Channel = DMA_Channel_2,
.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_ADDRESS,
.DMA_Memory0BaseAddr = (uint32_t)ADC3ConvertedValue,
.DMA_DIR = DMA_DIR_PeripheralToMemory,
.DMA_BufferSize = 2,
.DMA_PeripheralInc = DMA_PeripheralInc_Disable,
.DMA_MemoryInc = DMA_MemoryInc_Enable,
.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord,
.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord,
.DMA_Mode = DMA_Mode_Circular,
.DMA_Priority = DMA_Priority_High,
.DMA_FIFOMode = DMA_FIFOMode_Disable,
.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull,
.DMA_MemoryBurst = DMA_MemoryBurst_Single,
.DMA_PeripheralBurst = DMA_PeripheralBurst_Single
};

ADC_CommonInitTypeDef ADC_CommonInitStructure = {
.ADC_Mode = ADC_Mode_Independent,
.ADC_Prescaler = ADC_Prescaler_Div4,
.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled,
.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_10Cycles
};

ADC_InitTypeDef ADC_InitStructure = {
.ADC_Resolution = ADC_Resolution_12b,
.ADC_ScanConvMode = ENABLE,
.ADC_ContinuousConvMode = DISABLE,
.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None,
.ADC_DataAlign = ADC_DataAlign_Right,
.ADC_NbrOfConversion = 2
};

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);

DMA_Init(DMA2_Stream0, &DMA_InitStructure);
DMA_Cmd(DMA2_Stream0, ENABLE);

/* Configure ADC3 Channel7 pin as analog input ******************************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOC, &GPIO_InitStructure);

/* ADC Common Init **********************************************************/
ADC_CommonInit(&ADC_CommonInitStructure);

/* ADC3 Init ****************************************************************/
ADC_Init(ADC3, &ADC_InitStructure);

/* ADC3 regular channel7 configuration *************************************/
ADC_RegularChannelConfig(ADC3, ADC_Channel_12, 1, ADC_SampleTime_56Cycles);
ADC_RegularChannelConfig(ADC3, ADC_Channel_13, 2, ADC_SampleTime_56Cycles);

ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE); // ???

/* Enable ADC3 DMA */
ADC_DMACmd(ADC3, ENABLE);

/* Enable ADC3 */
ADC_Cmd(ADC3, ENABLE);

ADC_SoftwareStartConv(ADC3);
}
Реклама
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

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

Сообщение Satyr »

isx писал(а): Я ещё с АВР работаю с регистрами. Так у меня все на глазах :) .
Совершенно неблагодарная трата времени.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Добрый день, скажите кто как использует DWT.
Хочу сделать профилирование процессов главного цикла по скорости работы, но ни чего путнего не выходит.
Пока остановился на таком:

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

DEBUG_TACT(ProcessesDisplay(ID_LCD),Debug[0]);  //426
DEBUG_TACT(ProcessesLed(),Debug[1]);            //396

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

#define DEBUG_TACT(func,data)                           \
  do {						        \
      data.CURENT=DWT_CYCCNT;                           \
      func ;                                            \
      data.CURENT=DWT_CYCCNT-data.CURENT-4;             \
      if(data.min>data.CURENT){                         \
        data.min=data.CURENT;                           \
      }                                                 \
      if(data.max<data.CURENT){                         \
        data.max=data.CURENT;                           \
      }                                                 \
  } while(0)
Временно это устраивало,но когда хочу смотреть несколько процессов или всего главного цикла, то не айс.
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

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

Сообщение baghear »

Вот здесь можно посмотреть
https://hubstub.ru/programming/82-vremy ... stm32.html
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Myp3ik писал(а):И ячеек в массиве тоже много, что бы DMA сохранял каждый канал по определённому индексу в массиве.
Тоесть, в DMA есть специально выделенный буфер, который хранит инфу о каждом конкретном канале?
Satyr писал(а):Как пример. Вызвал и забыл.
За код спасибо. С DMA не работал никогда, но видимо, пришла пора :) .
Satyr писал(а):Совершенно неблагодарная трата времени.
Может при использовании SPI, USB, UART и прочего это и оправдано (хотя не знаю, не использовал), но при настройке таймеров, АЦП и прочей простой периферии это излишне (сугубо мое мнение :) ).
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

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

Сообщение Satyr »

isx писал(а): Тоесть, в DMA есть специально выделенный буфер, который хранит инфу о каждом конкретном канале?
Нееет! Если на пальцах:
DMA вещь совершенно тупая - ей сказано по сигналу DRQ от ADC брать с такой то позиции в памяти (дата регистр ADC) и класть попрядку в кольцевой буфер. Все, больше ничего не может и не знает. Кто и какие данные ему предлагает взять (ну, кроме известной линии DRQ от источника) понятия не имеет.
'Массив' есть в ADC - представляет их себя так же закольцованное (и длина кольца у него и ДМА одинаковая) очередь - в ней инструкции с какого канала какой разрядности и за какое время семплинга брать значение и класть в дата регистр. Точнее там не кольцо, а список + директива после окончания списка - "повторить".
Т.к. кольца совпадают - то и в буфере в ОПЕРАТИВКЕ по расположению данных полностью повторяет список ADC.

Ну это если нам надо кольцевой режим для чего то инструментального. Так то он может и в линейный буфер класть.
isx писал(а):
Satyr писал(а):Как пример. Вызвал и забыл.
За код спасибо. С DMA не работал никогда, но видимо, пришла пора :) .
Вот этим меня '8-битчики' (это не спектр интересов, а скорее тип человека -)) ) всегда удивляют - готовы кучу время потратить на изобретение велосипеда над голыми регистрами. Код, который выполняется один раз при ините и абсолютно никакого влияния на производительность не оказывает. Вместо того, чтоб взять готовый инит из SDK проихводителя (хотя багов там у всех обычно куча, регистры и мануал почитать прийдется - не соскучитесь -)) ). Но реальными и удобными средствами организации процесса и повышения производтельности - DMA, прерывания, правильное размещение по зонам памяти, выравнивания, учет особенностей шин - этим начисто пренебрегают.
isx писал(а):
Satyr писал(а):Совершенно неблагодарная трата времени.
Может при использовании SPI, USB, UART и прочего это и оправдано (хотя не знаю, не использовал), но при настройке таймеров, АЦП и прочей простой периферии это излишне (сугубо мое мнение :) ).
Никакой разницы. Периферия не пахнет -))

Хотя с USB... сколько не делал на каких чипах и производителей - не помню, чтоб там без феерических фокусов обходилось -)))))
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

Satyr писал(а):Вот этим меня '8-битчики' (это не спектр интересов, а скорее тип человека -)) ) всегда удивляют - готовы кучу время потратить на изобретение велосипеда над голыми регистрами. Код, который выполняется один раз при ините и абсолютно никакого влияния на производительность не оказывает. Вместо того, чтоб взять готовый инит из SDK проихводителя (хотя багов там у всех обычно куча, регистры и мануал почитать прийдется - не соскучитесь -)) ). Но реальными и удобными средствами организации процесса и повышения производтельности - DMA, прерывания, правильное размещение по зонам памяти, выравнивания, учет особенностей шин - этим начисто пренебрегают.
О, да! Я тоже люблю эту древнюю и красивую легенду. Жил да был SDK у ST под названием "Standard Peripherial Library". И были там и баги и готовые иниты. И пользовались им программеры продвинутые, да посмеивались над 8-битничками неразумными. Только, вдруг, БАЦ!, и забила ST на SPL большой-пребольшой болт эмбеддерский и сказала, что теперь вместо SPL убогой будет HAL навороченный, а те дурни, что для SPL свой код писали, пусть теперь код под новый SDK переписывают или в управдомы переквалифицируются. А чтобы никто не слабился, мы через годик-другой новый SDK выкатим, там вы у нас и попляшете.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

baghear,Благодарю за ответ, но мой вопрос был в том, как это всё использовать не загромождая код.
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

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

Сообщение Satyr »

a5021 писал(а): О, да! Я тоже люблю эту древнюю и красивую легенду. Жил да был SDK у ST под названием "Standard Peripherial Library".
Ну поменяли, и что ? Старую под угрозой расстрела использовать запретили ?
Все это регистро-копание до первого десятка освоенных контроллеров -)))
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

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

Сообщение hybroid »

ИМХО, HAL как-то логичнее выглядит. Ну и абстрактнее.
Ещё есть пользователи libopencm3. Надо пользоваться готовым, а не кодить ради кода :))
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

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

Сообщение Satyr »

этот "регистровый" код при смене или обновлении платформы можно практически выбрасывать и садиться изобретать велосипед с нуля.
у кого жизнь началась с ATMEGA8 и ей же закончится, возможно, подход целесообразный.
в остальных случаях это нецелесообразно и не дальновидно

p.s. года 2 как атмел взялся на ум и начал чтото конкурентоспособное выпускать. смотрите ихние Cortex M4/M7/A5. Ушел на них с AT32UC3A3xx, LPC247x/LPC178x, STM32F2xx, i.MX233 :)
Аватара пользователя
ks0
Прорезались зубы
Сообщения: 233
Зарегистрирован: Чт фев 28, 2013 14:16:10

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

Сообщение ks0 »

hybroid писал(а): libopencm3
Это че за зверь такой? Не, я погуглил. А вот как часто используется и какие тараканы имеются?
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

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

Сообщение hybroid »

Учитывая законсервированность контенгента, то используется реже всех. Но кто использует - доволен, это ты скорее всего видел, когда гуглил :)
Развивается, поддержка нового добавляется. Удобно, что это ни разу STM32 only. Т.е. встал и свалил на другой камень.. Если он поддерживается :)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

Satyr писал(а):этот "регистровый" код при смене или обновлении платформы можно практически выбрасывать и садиться изобретать велосипед с нуля.
у кого жизнь началась с ATMEGA8 и ей же закончится, возможно, подход целесообразный.
в остальных случаях это нецелесообразно и не дальновидно
Единственный смысл всех этих SDK заключается в том, чтобы писать код с их помощью могли малограмотные индусы за чашку риса. Любой, кто в теме чуть глубже, скорее всего уже владеет и библиотечным и регистровым подходом (или разберется с ними в разумные сроки) и предпочитает тот, каким лично ему пользоваться удобнее. Кому-то нужно быстрее запуститься и он выберает SDK, кто-то любит поосновательнее и ему хочется покопаться в регистрах. Ничто не мешает практиковать любой из подходов в зависимости от требований проекта. Какую-то надуманную тему вы подняли, да еще делить всех принялись на белых сахибов и грязных туземцев. Не серьезно.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25237
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Сообщение КРАМ »

hybroid писал(а):Т.е. встал и свалил на другой камень..
А смысл?
Смысл свалить на другой камень есть только тогда, когда этот другой представляет из себя нечто ДЕЙСТВИТЕЛЬНО другое.
А сваливать на тот же хер, только в профиль - нет никакого смысла.
У меня в разных проектах разные платформы лишь потому, что эти проекты реализуются на них посредством особенностей платформ.
И заменить 24-ый ПИК на СТМ32 или наоборот не получится.
Каждому овощу - своя грядка.
Полагаю, что создавать переносимый на разные платформы проект, жертвуя функционалом (включая экономический функционал, конечно), - полная глупость.
Затраты на портирование практически равны затратам на новый проект.
Ответить

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