STM32 новичку в ARM что к чему
Re: STM32 новичку в ARM что к чему
Енумы стейтов там строго локальные и в одном коротком файле, не было смысла в разухабистых префиксах. Дефайны надо будет перепроверить.
Вообще, подозреваю, что когда девайс окончательно заработает, проще будет кого-нибудь попросить, чтобы оформили нормально. У меня нет иллюзий на тему собственных познаний в плюсах, но заныривать глубже тоже как-то не хочется.
https://github.com/zserge/pt - нашел прототреды, забавная штука. Если станет совсем тяжко, можно будет попробовать.
Вообще, подозреваю, что когда девайс окончательно заработает, проще будет кого-нибудь попросить, чтобы оформили нормально. У меня нет иллюзий на тему собственных познаний в плюсах, но заныривать глубже тоже как-то не хочется.
https://github.com/zserge/pt - нашел прототреды, забавная штука. Если станет совсем тяжко, можно будет попробовать.
- Реклама
- bezzabotna
- Встал на лапы
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Re: STM32 новичку в ARM что к чему
Почему могут отставать RTC?
Даже когда плата питается от внешнего источника питания.
В регистрах все тикает, но видимо реже чем в 1с.
инициализация:
LSE 32768кГц.
Даже когда плата питается от внешнего источника питания.
В регистрах все тикает, но видимо реже чем в 1с.
инициализация:
Код: Выделить всё
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 127;
hrtc.Init.SynchPrediv = 255;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;Я конечно все понимаю, но этого я не понимаю.
Re: STM32 новичку в ARM что к чему
Кстати, может кто-то из благородных донов пожелает поучаствовать в улучшении мира? Есть в паре железок такие места, где можно кодить только на сях, которые я плохо перевариваю. Ну или если кто-то пожелает попрактиковаться в расте, надо аккуратно сколоть сишную. библиотеку GUI (для дисплея).
Я вполне реалистично оцениваю свои скилы программирования, и не вижу смысла трясти пыльными орденами, рассказывая как кодил на ассемблере под PIC12F508 двадцать лет назад
. Типа, если сильно припрет, то шашкой помахать могу, но нормальный программист справится быстрее и лучше. Зато я неплохо шарю в проектировании архитектур проектов и понимаю как сделать так, чтобы на выходе был "продукт", а не любительская поделка.
Так что если кому интересно приложить руку к опенсорсным регуляторам или reflow-паялке, был бы рад помощи. Они в любом случае будут доделаны, но время... рук на все не хватает...
Я вполне реалистично оцениваю свои скилы программирования, и не вижу смысла трясти пыльными орденами, рассказывая как кодил на ассемблере под PIC12F508 двадцать лет назад
Так что если кому интересно приложить руку к опенсорсным регуляторам или reflow-паялке, был бы рад помощи. Они в любом случае будут доделаны, но время... рук на все не хватает...
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
bezzabotna, я не спец по ARM, но делитель 255 меня насторожил. Я чаще встречал 256.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: STM32 новичку в ARM что к чему
bezzabotna, начиная с железяки говёный кварц, разводка , кондёры, не отмыли плату, софт stm32f4xx_hal_conf.h (или что там у вас)
LSE_VALUE , LSE_STARTUP_TIMEOUT , RCC_OscInitTypeDef {.LSEState = RCC_LSE_ON, .LSIState = RCC_LSI_OFF,}
LSE_VALUE , LSE_STARTUP_TIMEOUT , RCC_OscInitTypeDef {.LSEState = RCC_LSE_ON, .LSIState = RCC_LSI_OFF,}
Спойлер
Код: Выделить всё
RTC_HandleTypeDef hrtc;
void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)
{
if(hrtc->Instance == RTC) {
__HAL_RCC_RTC_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
}
}
void RTC_Init(void)
{
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 0x7f;
hrtc.Init.SynchPrediv = 0xff;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if(HAL_RTC_Init(&hrtc) != HAL_OK) {
printf("File:%s Fun:%s Line:%i\n",__FILE__,__func__,__LINE__);
}
if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x1111) {
sTime.Hours = 0x0;
sTime.Minutes = 0x0;
sTime.Seconds = 0x0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if( HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) {
printf("File:%s Fun:%s Line:%i\n",__FILE__,__func__,__LINE__);
}
sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month = RTC_MONTH_JANUARY;
sDate.Date = 0x1;
sDate.Year = 0x0;
if(HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK) {
printf("File:%s Fun:%s Line:%i\n",__FILE__,__func__,__LINE__);
}
HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x1111);
}
__HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&hrtc, RTC_FLAG_WUTF);
if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc,
0, RTC_WAKEUPCLOCK_CK_SPRE_16BITS) != HAL_OK) {
printf("File:%s Fun:%s Line:%i\n",__FILE__,__func__,__LINE__);
}
HAL_NVIC_EnableIRQ(RTC_WKUP_IRQn);
}
- Реклама
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Маленький вопрос.
Тут недавно пришла из Китая отладочная плата на STM32F407VET6. Обвеска вроде ничего (даже батарейку поставили, не пожалели) и относительно недорого.
Есть на ней разъём для подключения дисплея. Может, кто-то сталкивался с такой платой и может посоветовать ссылку на какой-нибудь дисплей, который легко подключается в этот разъём без лишних шлейфов?
P.S. Вот про эту платку: http://wiki.stm32duino.com/index.php?title=STM32F407
Тут недавно пришла из Китая отладочная плата на STM32F407VET6. Обвеска вроде ничего (даже батарейку поставили, не пожалели) и относительно недорого.
Есть на ней разъём для подключения дисплея. Может, кто-то сталкивался с такой платой и может посоветовать ссылку на какой-нибудь дисплей, который легко подключается в этот разъём без лишних шлейфов?
Спойлер

- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Нет, совсем другая разводка у дисплея.
После долгих поисков нашёл-таки подходящий: Чуть дороже, но зато без проблем подключить можно. Для экспериментов с этой платой удобнее, а для какого-нибудь конечного устройства со своей платой можно и подешевле будет выбрать, пусть и с другой разводкой.
После долгих поисков нашёл-таки подходящий: Чуть дороже, но зато без проблем подключить можно. Для экспериментов с этой платой удобнее, а для какого-нибудь конечного устройства со своей платой можно и подешевле будет выбрать, пусть и с другой разводкой.
Re: STM32 новичку в ARM что к чему
Кстати, я тут топил за PlatformIO. Все-таки есть у него косяк - через месяц в бесплатной версии отваливается дебагер и тесты, и надо либо перерегистрироваться либо платить - ну кому что ближе.
Но к сожалению, альтернатив где юзерам было бы удобно заливать прошивки пока найти так и не удалось. Пока сваливать некуда.
Но к сожалению, альтернатив где юзерам было бы удобно заливать прошивки пока найти так и не удалось. Пока сваливать некуда.
Re: STM32 новичку в ARM что к чему
Подскажите пожалуйста как перезапустить dma в 407?
В РМ написано, что после отработки в сингл режиме дма отключается и надо снова заполнить все его регистры и запустить, но у меня он повторно не запускается
В РМ написано, что после отработки в сингл режиме дма отключается и надо снова заполнить все его регистры и запустить, но у меня он повторно не запускается
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
Конечно не запустится, в вашем секретном коде явная ошибка!
Re: STM32 новичку в ARM что к чему
[uquote="ARV",url="/forum/viewtopic.php?p=3442988#p3442988"]bezzabotna, я не спец по ARM, но делитель 255 меня насторожил. Я чаще встречал 256.[/uquote]
Обычное дело когда в регистр сравнения некоего таймера записывается максимально возможное его значение. Тогда период такого таймера будет == максимально возможное значение + 1.
Настораживать должна запись в регистр делителя значений 2_в_степени_N.
Добавлено after 4 minutes 23 seconds:
[uquote="bezzabotna",url="/forum/viewtopic.php?p=3442889#p3442889"]Почему могут отставать RTC?[/uquote]
Численное выражение проблемы есть?
Обычное дело когда в регистр сравнения некоего таймера записывается максимально возможное его значение. Тогда период такого таймера будет == максимально возможное значение + 1.
Настораживать должна запись в регистр делителя значений 2_в_степени_N.
Добавлено after 4 minutes 23 seconds:
[uquote="bezzabotna",url="/forum/viewtopic.php?p=3442889#p3442889"]Почему могут отставать RTC?[/uquote]
Численное выражение проблемы есть?
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
По поводу RTC.. Я столкнулся с тем, что на широко распространённых платах с STM32F103C8T6 (т.н. BluePill) стоит часовой кварц с нагрузочными конденсаторами где-то в 15пФ. Тогда как по даташиту кварц обязательно должен быть рассчитан на 6пФ (или около того).
Пока не сменил кварц на такой, всё было очень плохо. Часы могли идти нормально, могли заметно тормозить, могли вообще не запуститься. Ход зависел от того, держишь плату в руке или нет. В общем, всё было очень нестабильно.
После замены - всё чётко.
Так что, bezzabotna, советую убедиться, может и в Вашем случае стоит неправильный кварц.
Пока не сменил кварц на такой, всё было очень плохо. Часы могли идти нормально, могли заметно тормозить, могли вообще не запуститься. Ход зависел от того, держишь плату в руке или нет. В общем, всё было очень нестабильно.
После замены - всё чётко.
Так что, bezzabotna, советую убедиться, может и в Вашем случае стоит неправильный кварц.
- bezzabotna
- Встал на лапы
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Re: STM32 новичку в ARM что к чему
Проблема решилась. Была ошибка в выводе данных.
У меня теперь вопрос по ацп.
Нужно мне мерить 3 канала.
1,2- сигналы 10кгц, а так же прикрутить watchdog и вызывать прерывание если сигнал превысит порог
3- сигнал 100Гц
Мне бы хотелось разобраться с регулярными каналами, поэтому для данных будет 1 регистр, и через дма надо отправлять данные в сдкарту. Но мне непонятно как я буду отличать данные один от другого? С одной стороны они по очереди измеряются, но с другой что то может пойти не так и где-то данные потеряются по дороге и я получу смещение. Это как-то ненадежно. Это если использовать режим ScanConv.
Можно конечно измерять данные для каждого канала по отдельности в режиме SingleConv, но это как-то не очень рационально. Да и неинтересно, этот режим уже освоен. Хотелось бы разобраться дальше.
И еще был вариант делать это в режиме Scan continuous, но в этом случае непонятно как подобрать частоту измерения. То есть АЦП у меня висит на шине 60МГц, там в настройках есть предделитель и для каждого канала фиксированные выборки в сек. Еще надо учесть время которое пойдет на преобразование каждого канала и разрешение данных. Стоит ли вообще заморачиваться с этим режимом? Частота сигналов не очень большая. Можно и по таймеру ацп пинать используя первый вариант.
Кстати, на счет таймера тоже не очень понятно. Если настроить включение ацп по таймеру, то ацп будет включаться с той частотой, что будет тикать таймер или таймер будет вызывать включение ацп по какому-то событию (переполнение например)?
У меня теперь вопрос по ацп.
Нужно мне мерить 3 канала.
1,2- сигналы 10кгц, а так же прикрутить watchdog и вызывать прерывание если сигнал превысит порог
3- сигнал 100Гц
Мне бы хотелось разобраться с регулярными каналами, поэтому для данных будет 1 регистр, и через дма надо отправлять данные в сдкарту. Но мне непонятно как я буду отличать данные один от другого? С одной стороны они по очереди измеряются, но с другой что то может пойти не так и где-то данные потеряются по дороге и я получу смещение. Это как-то ненадежно. Это если использовать режим ScanConv.
Можно конечно измерять данные для каждого канала по отдельности в режиме SingleConv, но это как-то не очень рационально. Да и неинтересно, этот режим уже освоен. Хотелось бы разобраться дальше.
И еще был вариант делать это в режиме Scan continuous, но в этом случае непонятно как подобрать частоту измерения. То есть АЦП у меня висит на шине 60МГц, там в настройках есть предделитель и для каждого канала фиксированные выборки в сек. Еще надо учесть время которое пойдет на преобразование каждого канала и разрешение данных. Стоит ли вообще заморачиваться с этим режимом? Частота сигналов не очень большая. Можно и по таймеру ацп пинать используя первый вариант.
Кстати, на счет таймера тоже не очень понятно. Если настроить включение ацп по таймеру, то ацп будет включаться с той частотой, что будет тикать таймер или таймер будет вызывать включение ацп по какому-то событию (переполнение например)?
Я конечно все понимаю, но этого я не понимаю.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Pебята, завязываем флудить ! 
Последние посты с флудом вычистил.
Последние посты с флудом вычистил.
Re: STM32 новичку в ARM что к чему
[uquote="bezzabotna",url="/forum/viewtopic.php?p=3446048#p3446048"]И еще был вариант делать это в режиме Scan continuous, но в этом случае непонятно как подобрать частоту измерения. То есть АЦП у меня висит на шине 60МГц, там в настройках есть предделитель и для каждого канала фиксированные выборки в сек. Еще надо учесть время которое пойдет на преобразование каждого канала и разрешение данных. Стоит ли вообще заморачиваться с этим режимом? Частота сигналов не очень большая. Можно и по таймеру ацп пинать используя первый вариант.[/uquote]
Небольшая? Вы же написали про 2 канала по 10кГц каждый. 10кГц - это максимальная гармоника сигнала? Тогда частоту оцифровки нужно как минимум в 4 раза выше, а лучше ещё повыше. А это уже довольно немаленькая частота получается. И лучше конечно положить на непрерывный режим измерения + DMA с двойной буферизацией (или как оно там в STM32 называется). С АЦП именно в STM32 не работал, но думаю ничего там особенно отличающегося от других МК нет.
А то может ещё и фильтровать сигналы нужно окажется каким-нить КИХ или медианным фильтром. Чтобы всё это делать эффективно, не нагружая ЦП кучей лишних входов/выходов в ISR, нужно это делать пакетно, над блоком данных, полученным с DMA.
Небольшая? Вы же написали про 2 канала по 10кГц каждый. 10кГц - это максимальная гармоника сигнала? Тогда частоту оцифровки нужно как минимум в 4 раза выше, а лучше ещё повыше. А это уже довольно немаленькая частота получается. И лучше конечно положить на непрерывный режим измерения + DMA с двойной буферизацией (или как оно там в STM32 называется). С АЦП именно в STM32 не работал, но думаю ничего там особенно отличающегося от других МК нет.
А то может ещё и фильтровать сигналы нужно окажется каким-нить КИХ или медианным фильтром. Чтобы всё это делать эффективно, не нагружая ЦП кучей лишних входов/выходов в ISR, нужно это делать пакетно, над блоком данных, полученным с DMA.
- bezzabotna
- Встал на лапы
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Re: STM32 новичку в ARM что к чему
Частота оцифровки - это частота дискретизации канала?
Не очень понятно как ее установить.
Допустим частота тактирования АЦП у меня задается через предделитель 60МГц/8=7,5Мгц=0,13333мкс-1
Для канала 10 кГц мне нужна частота дискретизации
С помощью SamplingTime я могу установить лишь время преобразования, тупо выжидая какое-то количество циклов перед тем как начать собственно измерять канал. Потом ждать SamplingTime для второго канала, потом третий и так по кругу. Или я неправильно понимаю предназначение SamplingTime?
Есть еще мысль, что это как бы время прореживания сигнала. То есть допустим
1 канал SamplingTime = 3
2 канал SamplingTime=3
3 канал SamplingTime =15
Таким образом третий канал будет преобразовываться только каждую 5 итерацию. Не могу найти где об этом можно подробно почитать.
Не очень понятно как ее установить.
Допустим частота тактирования АЦП у меня задается через предделитель 60МГц/8=7,5Мгц=0,13333мкс-1
Для канала 10 кГц мне нужна частота дискретизации
.как минимум в 4 раза выше, а лучше ещё повыше.
С помощью SamplingTime я могу установить лишь время преобразования, тупо выжидая какое-то количество циклов перед тем как начать собственно измерять канал. Потом ждать SamplingTime для второго канала, потом третий и так по кругу. Или я неправильно понимаю предназначение SamplingTime?
Есть еще мысль, что это как бы время прореживания сигнала. То есть допустим
1 канал SamplingTime = 3
2 канал SamplingTime=3
3 канал SamplingTime =15
Таким образом третий канал будет преобразовываться только каждую 5 итерацию. Не могу найти где об этом можно подробно почитать.
Я конечно все понимаю, но этого я не понимаю.
Re: STM32 новичку в ARM что к чему
[uquote="bezzabotna",url="/forum/viewtopic.php?p=3446569#p3446569"]1 канал SamplingTime = 3
2 канал SamplingTime=3
3 канал SamplingTime =15
Таким образом третий канал будет преобразовываться только каждую 5 итерацию. Не могу найти где об этом можно подробно почитать.[/uquote]
Это же не полное время, там еще прибавляется 12 тактов(для 12 бит), итого получится 15 и 27... Вообще берешь таймер, задаешь в регистре CR2 поле MMS, например, чтобы Update генерил TRGO, потом в том же CR2, но уже ADC, выбираешь для EXTSEL нужный TRGO. Вроде все, даже если будет DMA, то, насколько помню, ничего больше добавлять не нужно.
2 канал SamplingTime=3
3 канал SamplingTime =15
Таким образом третий канал будет преобразовываться только каждую 5 итерацию. Не могу найти где об этом можно подробно почитать.[/uquote]
Это же не полное время, там еще прибавляется 12 тактов(для 12 бит), итого получится 15 и 27... Вообще берешь таймер, задаешь в регистре CR2 поле MMS, например, чтобы Update генерил TRGO, потом в том же CR2, но уже ADC, выбираешь для EXTSEL нужный TRGO. Вроде все, даже если будет DMA, то, насколько помню, ничего больше добавлять не нужно.
- bezzabotna
- Встал на лапы
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Re: STM32 новичку в ARM что к чему
Хорошо, а зачем вообще установка времени выборки? Я все не могу понять на что она влияет. Ну понятно что на время преобразования, но почему она индивидуальна для каждого канала. В чем разница между каналом с временем выборки установленным на 3 и каналом с временем выборки 112?
Я конечно все понимаю, но этого я не понимаю.
Re: STM32 новичку в ARM что к чему
[uquote="bezzabotna",url="/forum/viewtopic.php?p=3446659#p3446659"]Хорошо, а зачем вообще установка времени выборки?[/uquote]
Если по-простому, то ADC подключает канал и заряжает конденсатор, потом канал отключается и измеряется напряжение на этом конденсаторе. SamplingTime подбирается таким образом, чтобы этот конденсатор успевал полностью заряжаться, от этого зависит точность измерений, а частоту дискретизации таким образом не задают, хотя в некоторых случаях можно, конечно, и так...
Если по-простому, то ADC подключает канал и заряжает конденсатор, потом канал отключается и измеряется напряжение на этом конденсаторе. SamplingTime подбирается таким образом, чтобы этот конденсатор успевал полностью заряжаться, от этого зависит точность измерений, а частоту дискретизации таким образом не задают, хотя в некоторых случаях можно, конечно, и так...


