STM32 новичку в ARM что к чему
Re: STM32 новичку в ARM что к чему
Периферия и ядро от другой шины питаются. Вот ей бы ты внимание уделил.
Полезный сигнал и 'шум' ты цифровать будешь не синфазно, а поочередно. Так что сработать это может (в предположении твоего происхождения шумов -)) ) только если верхняя граница спектра шума много меньше частоты дискретизации.
Вобщем, рекомендую заняться разводкой и питанием (и Vref внешний!), а не этими изысканиями
Полезный сигнал и 'шум' ты цифровать будешь не синфазно, а поочередно. Так что сработать это может (в предположении твоего происхождения шумов -)) ) только если верхняя граница спектра шума много меньше частоты дискретизации.
Вобщем, рекомендую заняться разводкой и питанием (и Vref внешний!), а не этими изысканиями
- Реклама
Re: STM32 новичку в ARM что к чему
За совету спасибо) . Я понимаю, что надо заняться и трассировкой нормально и дроссель хоть повесить (там нарушено все что можно сейчас
.)
Сейчас чисто научный интерес появился, так как ранее такого подхода не встречал. Не разберусь только с каналами. Как там у меня с алгоритмом, может подскажет кто?
Вот на это акцент и делаю.Satyr писал(а):только если верхняя граница спектра шума много меньше частоты дискретизации
Сейчас чисто научный интерес появился, так как ранее такого подхода не встречал. Не разберусь только с каналами. Как там у меня с алгоритмом, может подскажет кто?
Re: STM32 новичку в ARM что к чему
Давно c STM32 не возился.
Но, насколько помню, там тупо делается 'карусель' - набираешь список каналов, запрягаешь DMA, а дальше он тупо подряд выкладывает в буфер значения по очередно с каналов в списке и так далее по кругу.
Помню только, что там в документации и примерах все было вполне доступно и доходчиво.
Да, и не надо сразу лезть к голым регистрам - используй библиотеки производителя. Выгоды от ковыряния с регистрами - пара сотней байт кода и ноль в производительности. Ибо только настройка.
Но пытаться чтото там алгоритмически компенсировать при убитой аналоговой части - это глупость.
По хорошему аналоговая часть питается от отдельного стабилизатора. Аналоговые Vcc, Vref, Vpll (не помню, есть он на STM32 ?) каждый отдельным LC фильтром вплотную к ногам.
И не игнорировать рекомендации на стабилизаторы - типы и номиналы кондеров. бОльше совсем не значит лучше.
Но, насколько помню, там тупо делается 'карусель' - набираешь список каналов, запрягаешь DMA, а дальше он тупо подряд выкладывает в буфер значения по очередно с каналов в списке и так далее по кругу.
Помню только, что там в документации и примерах все было вполне доступно и доходчиво.
Да, и не надо сразу лезть к голым регистрам - используй библиотеки производителя. Выгоды от ковыряния с регистрами - пара сотней байт кода и ноль в производительности. Ибо только настройка.
Но пытаться чтото там алгоритмически компенсировать при убитой аналоговой части - это глупость.
По хорошему аналоговая часть питается от отдельного стабилизатора. Аналоговые Vcc, Vref, Vpll (не помню, есть он на STM32 ?) каждый отдельным LC фильтром вплотную к ногам.
И не игнорировать рекомендации на стабилизаторы - типы и номиналы кондеров. бОльше совсем не значит лучше.
Re: STM32 новичку в ARM что к чему
Регистр один, а каналов много. Да и никаких флагов с номером канала, данные от которого хранятся в регистре, я не нашелSatyr писал(а):Но, насколько помню, там тупо делается 'карусель' - набираешь список каналов, запрягаешь DMA, а дальше он тупо подряд выкладывает в буфер значения по очередно с каналов в списке и так далее по кругу.
Я ещё с АВР работаю с регистрами. Так у меня все на глазахSatyr писал(а): Да, и не надо сразу лезть к голым регистрам - используй библиотеки производителя.
Это не глупость - это интерес. Интересны результаты вообщем, а не к конкретному случаю.Satyr писал(а): - это глупость.
Да и вообще, у меня проект предусматривает несколько каналов АЦП, а тут хрень такая - по-любому что-то решать нужно....
Re: STM32 новичку в ARM что к чему
И ячеек в массиве тоже много, что бы DMA сохранял каждый канал по определённому индексу в массиве.isx писал(а):Регистр один, а каналов много.
Иван Сусанин - первый полупроводник 
- Реклама
Re: STM32 новичку в ARM что к чему
Как пример. Вызвал и забыл.
Далее в 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);
}
Далее в 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);
}
Re: STM32 новичку в ARM что к чему
Совершенно неблагодарная трата времени.isx писал(а): Я ещё с АВР работаю с регистрами. Так у меня все на глазах.
Re: STM32 новичку в ARM что к чему
Добрый день, скажите кто как использует 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)
Re: STM32 новичку в ARM что к чему
Вот здесь можно посмотреть
https://hubstub.ru/programming/82-vremy ... stm32.html
https://hubstub.ru/programming/82-vremy ... stm32.html
Re: STM32 новичку в ARM что к чему
Тоесть, в DMA есть специально выделенный буфер, который хранит инфу о каждом конкретном канале?Myp3ik писал(а):И ячеек в массиве тоже много, что бы DMA сохранял каждый канал по определённому индексу в массиве.
За код спасибо. С DMA не работал никогда, но видимо, пришла пораSatyr писал(а):Как пример. Вызвал и забыл.
Может при использовании SPI, USB, UART и прочего это и оправдано (хотя не знаю, не использовал), но при настройке таймеров, АЦП и прочей простой периферии это излишне (сугубо мое мнениеSatyr писал(а):Совершенно неблагодарная трата времени.
Re: STM32 новичку в ARM что к чему
Нееет! Если на пальцах:isx писал(а): Тоесть, в DMA есть специально выделенный буфер, который хранит инфу о каждом конкретном канале?
DMA вещь совершенно тупая - ей сказано по сигналу DRQ от ADC брать с такой то позиции в памяти (дата регистр ADC) и класть попрядку в кольцевой буфер. Все, больше ничего не может и не знает. Кто и какие данные ему предлагает взять (ну, кроме известной линии DRQ от источника) понятия не имеет.
'Массив' есть в ADC - представляет их себя так же закольцованное (и длина кольца у него и ДМА одинаковая) очередь - в ней инструкции с какого канала какой разрядности и за какое время семплинга брать значение и класть в дата регистр. Точнее там не кольцо, а список + директива после окончания списка - "повторить".
Т.к. кольца совпадают - то и в буфере в ОПЕРАТИВКЕ по расположению данных полностью повторяет список ADC.
Ну это если нам надо кольцевой режим для чего то инструментального. Так то он может и в линейный буфер класть.
Вот этим меня '8-битчики' (это не спектр интересов, а скорее тип человека -)) ) всегда удивляют - готовы кучу время потратить на изобретение велосипеда над голыми регистрами. Код, который выполняется один раз при ините и абсолютно никакого влияния на производительность не оказывает. Вместо того, чтоб взять готовый инит из SDK проихводителя (хотя багов там у всех обычно куча, регистры и мануал почитать прийдется - не соскучитесь -)) ). Но реальными и удобными средствами организации процесса и повышения производтельности - DMA, прерывания, правильное размещение по зонам памяти, выравнивания, учет особенностей шин - этим начисто пренебрегают.isx писал(а):За код спасибо. С DMA не работал никогда, но видимо, пришла пораSatyr писал(а):Как пример. Вызвал и забыл..
Никакой разницы. Периферия не пахнет -))isx писал(а):Может при использовании SPI, USB, UART и прочего это и оправдано (хотя не знаю, не использовал), но при настройке таймеров, АЦП и прочей простой периферии это излишне (сугубо мое мнениеSatyr писал(а):Совершенно неблагодарная трата времени.).
Хотя с USB... сколько не делал на каких чипах и производителей - не помню, чтоб там без феерических фокусов обходилось -)))))
Re: STM32 новичку в ARM что к чему
О, да! Я тоже люблю эту древнюю и красивую легенду. Жил да был SDK у ST под названием "Standard Peripherial Library". И были там и баги и готовые иниты. И пользовались им программеры продвинутые, да посмеивались над 8-битничками неразумными. Только, вдруг, БАЦ!, и забила ST на SPL большой-пребольшой болт эмбеддерский и сказала, что теперь вместо SPL убогой будет HAL навороченный, а те дурни, что для SPL свой код писали, пусть теперь код под новый SDK переписывают или в управдомы переквалифицируются. А чтобы никто не слабился, мы через годик-другой новый SDK выкатим, там вы у нас и попляшете.Satyr писал(а):Вот этим меня '8-битчики' (это не спектр интересов, а скорее тип человека -)) ) всегда удивляют - готовы кучу время потратить на изобретение велосипеда над голыми регистрами. Код, который выполняется один раз при ините и абсолютно никакого влияния на производительность не оказывает. Вместо того, чтоб взять готовый инит из SDK проихводителя (хотя багов там у всех обычно куча, регистры и мануал почитать прийдется - не соскучитесь -)) ). Но реальными и удобными средствами организации процесса и повышения производтельности - DMA, прерывания, правильное размещение по зонам памяти, выравнивания, учет особенностей шин - этим начисто пренебрегают.
Re: STM32 новичку в ARM что к чему
baghear,Благодарю за ответ, но мой вопрос был в том, как это всё использовать не загромождая код.
Re: STM32 новичку в ARM что к чему
Ну поменяли, и что ? Старую под угрозой расстрела использовать запретили ?a5021 писал(а): О, да! Я тоже люблю эту древнюю и красивую легенду. Жил да был SDK у ST под названием "Standard Peripherial Library".
Все это регистро-копание до первого десятка освоенных контроллеров -)))
Re: STM32 новичку в ARM что к чему
ИМХО, HAL как-то логичнее выглядит. Ну и абстрактнее.
Ещё есть пользователи libopencm3. Надо пользоваться готовым, а не кодить ради кода
Ещё есть пользователи libopencm3. Надо пользоваться готовым, а не кодить ради кода
Re: STM32 новичку в ARM что к чему
этот "регистровый" код при смене или обновлении платформы можно практически выбрасывать и садиться изобретать велосипед с нуля.
у кого жизнь началась с ATMEGA8 и ей же закончится, возможно, подход целесообразный.
в остальных случаях это нецелесообразно и не дальновидно
p.s. года 2 как атмел взялся на ум и начал чтото конкурентоспособное выпускать. смотрите ихние Cortex M4/M7/A5. Ушел на них с AT32UC3A3xx, LPC247x/LPC178x, STM32F2xx, i.MX233
у кого жизнь началась с ATMEGA8 и ей же закончится, возможно, подход целесообразный.
в остальных случаях это нецелесообразно и не дальновидно
p.s. года 2 как атмел взялся на ум и начал чтото конкурентоспособное выпускать. смотрите ихние Cortex M4/M7/A5. Ушел на них с AT32UC3A3xx, LPC247x/LPC178x, STM32F2xx, i.MX233
Re: STM32 новичку в ARM что к чему
Это че за зверь такой? Не, я погуглил. А вот как часто используется и какие тараканы имеются?hybroid писал(а): libopencm3
Re: STM32 новичку в ARM что к чему
Учитывая законсервированность контенгента, то используется реже всех. Но кто использует - доволен, это ты скорее всего видел, когда гуглил
Развивается, поддержка нового добавляется. Удобно, что это ни разу STM32 only. Т.е. встал и свалил на другой камень.. Если он поддерживается
Развивается, поддержка нового добавляется. Удобно, что это ни разу STM32 only. Т.е. встал и свалил на другой камень.. Если он поддерживается
Re: STM32 новичку в ARM что к чему
Единственный смысл всех этих SDK заключается в том, чтобы писать код с их помощью могли малограмотные индусы за чашку риса. Любой, кто в теме чуть глубже, скорее всего уже владеет и библиотечным и регистровым подходом (или разберется с ними в разумные сроки) и предпочитает тот, каким лично ему пользоваться удобнее. Кому-то нужно быстрее запуститься и он выберает SDK, кто-то любит поосновательнее и ему хочется покопаться в регистрах. Ничто не мешает практиковать любой из подходов в зависимости от требований проекта. Какую-то надуманную тему вы подняли, да еще делить всех принялись на белых сахибов и грязных туземцев. Не серьезно.Satyr писал(а):этот "регистровый" код при смене или обновлении платформы можно практически выбрасывать и садиться изобретать велосипед с нуля.
у кого жизнь началась с ATMEGA8 и ей же закончится, возможно, подход целесообразный.
в остальных случаях это нецелесообразно и не дальновидно
- КРАМ
- Друг Кота
- Сообщения: 25237
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: STM32 новичку в ARM что к чему
А смысл?hybroid писал(а):Т.е. встал и свалил на другой камень..
Смысл свалить на другой камень есть только тогда, когда этот другой представляет из себя нечто ДЕЙСТВИТЕЛЬНО другое.
А сваливать на тот же хер, только в профиль - нет никакого смысла.
У меня в разных проектах разные платформы лишь потому, что эти проекты реализуются на них посредством особенностей платформ.
И заменить 24-ый ПИК на СТМ32 или наоборот не получится.
Каждому овощу - своя грядка.
Полагаю, что создавать переносимый на разные платформы проект, жертвуя функционалом (включая экономический функционал, конечно), - полная глупость.
Затраты на портирование практически равны затратам на новый проект.


