Перейти к содержанию

STM32 для чайника


ART_ME

Рекомендуемые сообщения

2 часа назад, mail_robot сказал:

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

Так я и не передаю полубайты (т.e 4 бита).  Проблема в том, что функция именно байты переставляет в зависимости от описания. Img - uint8_t -отлично, uint16_t - в 16-битном слове меняется местами младший и старший байты.  Хотя данные и там и там c адреса img должны распологаться одинаково:

img->  color_hi[1],color_low[1], color_hi[2],color_low[2], ......... .  

А описатели uint8_t b и uint16_t, как я понимаю, только показывают транслятору как увеличивать/уменьшать адрес - на 1 или на 2. Попробовал переключить SPI в 16-битный режим, та же фигня :( .  

Пока нашел проги, которые делаю си-код картинки только в 16-битных словах, а перебивать руками в байты как то вломно :) . Можете подсказать чем конвертить?  

Именно DMA и использую, HAL_SPI_Transmit_DMA,  работает конечно быстрее, держит 84мгц или 42мбит/с на F4. Но тут стал рыть почему не работает код - сначала перешел к простой передаче, потом вообще побайтно руками пока до этого бага или фичи не дошел :) .  

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

11 минуту назад, Signus сказал:

Можете подсказать чем конвертить?  

Чем-чем...

inline uint16_t swab(uint16_t i) // название - дань ассемблеру БК 0010-01 :-)
{
	return (((i & 0x00FF) << 8) | ((i & 0xFF00) >> 8))
}

 

Изменено пользователем Darth_Vader
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Продолжаю знакомиться с STM32 и с микроконтроллерами в целом, дошёл до DMA и появилось пара вопросов:

1) Почему для АЦП всегда не используют DMA, если это такой классный инструмент? Зачем предусмотрены ещё 2-а режима Polling и Interrupt, для каких задач, если по сути всё можно сделать через DMA? Или не всё?

2) Что приводит в действие DMA, т.е. чьи ресурсы он расходует? Ведь опрашивать (переносить значения в память), например, АЦП с такой частотой это же какие ресурсы нужны, за счёт чего это достигается, если мы не задействуем процессор?

Изменено пользователем Koret
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Зачем мне в АЦП использовать ПДП, если мне надо иногда опрашивать кнопки - каждой задаче свой инструмент. Или как там Мао говорил: "Пусть расцветают сто цветов, пусть соперничают сто школ!"

Изменено пользователем Darth_Vader
Ссылка на комментарий
Поделиться на другие сайты

39 минут назад, Darth_Vader сказал:

Чем-чем...

Это понятно, речь шла о прогах, генерящих код си из файла картинки, дающих массив байтов, а не слов. 

Ссылка на комментарий
Поделиться на другие сайты

@Darth_Vader у меня камень STM32F103RCT6 работает на 72МГц. По I2C подключен к акселерометру LIS331DLH. Нормально работает, 20 устройств уже катается. Тактирование вот так настроено:

 

clock_settings.png

Изменено пользователем GOR23
Ссылка на комментарий
Поделиться на другие сайты

Настройка I2C на всякий случай: 

  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 100000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);

Понижение ClockSpeed не как не влияет? У меня такая теория, что при смене тактирования,где то не правильно расчитываеться частота шины, от которой отталкивается расчёт ClockSpeed. В итоге он не соответствует установленному. Предположу что ClockSpeed получается выше, в разы. И некоторые устройства просто не могут работать на такой скорости. Ну это только теория, сейчас даташит гляну на ваш MPU6050 . Ещё вопрос, может и тупой, но спросить нужно. SDA, SCL к плюсу резисторами подтянуты?

Изменено пользователем GOR23
Ссылка на комментарий
Поделиться на другие сайты

HAL при настройке устанавливает ещё время нарастания фронта, вот:

hi2c->Instance->TRISE = I2C_RISE_TIME(freqrange, hi2c->Init.ClockSpeed);

Может какой косяк самого HAL, можно попробовать покрутить его (freqrange), в разумных приделах. Лучше бы конечно осциллографом глянуть, что происходит на SDA, SCL.

Ссылка на комментарий
Поделиться на другие сайты

23 часа назад, Signus сказал:

Если передаю все сразу,  дисплей получает данные цвета с поменяными местами младшим и старшим байтами.  


HAL_SPI_Transmit_IT(&hspi1, (uint8_t *)img,  words*2); //Передача всего массива uint16_t img[]
while( hspi1.State != HAL_SPI_STATE_READY) {}

Причем если массив img описан не как uint16_t, а как uint8_t,  вторая команда тоже работает корректно.  Не пойму, какая разница, ведь физически img - просто адрес начала массива? Или тут какие-то тонкости в организации распределения данных по памяти у транслятора, в зависимости от описания типа?

Дебаггер в Кейле рулит :) !  Действительно описания uint16_t и uint8_t для транслятора большая разница. Оказалось, что если пишем 

const uint8_t Img = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06}

данные в памяти будут лежать именно в этой последовательности. А если так:

const uint16_t Img = {0x0102,0x0304,0x0506}

то транслятор их раскладывает в физическую память младшим байтом вперед:

0x02, 0x01, 0x04, 0x03, 0x06, 0x05

Сам спросил, сам ответил :) .   Все проги, которые нашел, сохраняют картинку только в массиве  uint16_t.  Чтобы быстро вывести картинку на дисплей с использованием DMA,  нужен массив uint8_t.

Остался последний вопрос - чем можно получить из файла картинки код на си с массивом в uint8_t ???  Перебивать код массива с 240x320 точек в ручную не предлагать :D.  

Ссылка на комментарий
Поделиться на другие сайты

11 час назад, Darth_Vader сказал:

Да не за что!

Вот тут много полезного можно найти.

В общем почти победил с Hal-ом

AT
AT+CMGF=1
AT+CSCS="GSM"
AT+CMGS="89101269115" 

OK
OK

OK

> TEST
> // вот ждет char 26 но почемуто я его не могу отправить

отправляю так

HAL_UART_Transmit( &huart3, (uint8_t * )0x1A, 1, 100);  

или так

HAL_UART_Transmit( &huart3, (uint8_t * )26, 1, 100);

Может это не правильная команда или .... вроде все варианты перепробовал , что то недопонимаю.

Если отправляю 26 не через HAL все работает... хочется разобраться. 

Ссылка на комментарий
Поделиться на другие сайты

@MihaNN52 Попробуйте закончить текст sms кодом 26 и пошлите sms одним вызовом HAL_UART_Transmit

9 часов назад, Signus сказал:

чем можно получить из файла картинки код на си с массивом в uint8_t ?

Ну напишите сами. Считал бинарный файл - выдал текстовый. Работы-то на 10 минут.

Изменено пользователем Darth_Vader
Ссылка на комментарий
Поделиться на другие сайты

Согласен, но сто лет под винды ничего не писал :( .  Или макрос в ворде/экселе, вставляющий ",0x" в нужные места текста :) .

Ссылка на комментарий
Поделиться на другие сайты

On 16.11.2017 at 10:34 PM, mail_robot said:

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

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

Можно было в принципе и догадаться о чем толкуют. Зато по граблям самостоятельно и получилось как надо

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Ребята, а как в многоканальном режиме polling (АЦП) правильно проверять принадлежность конкретного значения к конкретному каналу. Т.е. в примерах показывается как правило так:

HAL_ADC_PollForConversion(&hadc, 100);

ADCValue = HAL_ADC_GetValue(&hadc);  // Первый канал

HAL_ADC_PollForConversion(&hadc, 100);

ADCValue = HAL_ADC_GetValue(&hadc);  // Второй канал

HAL_ADC_PollForConversion(&hadc, 100);

ADCValue = HAL_ADC_GetValue(&hadc);  // Третий канал

Т.е. согласно rank по-порядку выдаются значения, но ведь если какое-то преобразование не произойдёт или будет превышен таймаут произойдёт белиберда.

Если, например, проверять каждое значение вот-так, это нормально?

Цитата

if (HAL_ADC_PollForConversion(&hadc, 100) == HAL_OK)

ADCValue[0] = HAL_ADC_GetValue(&hadc); // Первый канал

if (HAL_ADC_PollForConversion(&hadc, 100) == HAL_OK)

ADCValue[1] = HAL_ADC_GetValue(&hadc); // Второй канал

if (HAL_ADC_PollForConversion(&hadc, 100) == HAL_OK)

ADCValue[2] = HAL_ADC_GetValue(&hadc);  // Третий канал

 

Ссылка на комментарий
Поделиться на другие сайты

в принципе и так можно, но все равно как то не очень. Да и по времени затратно ждать каждый раз. Но в принципе в 100 миллисекунд уложится любое преобразование железобетонно. а если нет, то надо всю лавочку сворачивать, ибо проц неисправен

лучше будет по ДМА организовать однократный опрос группы каналов.  Так у вас будет просто каждый раз однократный перезапуск опроса и выпад в прерывание по окончании опроса без отрыва от основного кода. Будет гораздо элегантнее

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

@mail_robot т.е. правильно ли я понимаю, если мне надо получать значение с 4-х каналов АЦП, я делаю таймер на 100мс, который каждый раз включает DMA (HAL_ADC_Start_DMA()) и в функцию прерывания от DMA (HAL_ADC_ConvCpltCallback()) добавляю код вывода информации (значения занесённые DMA в глобальный массив) на дисплей, так нормально? 

Проверяет ли DMA перед занесением данных в массив соответствие, т.е. не получится так, что в ADC_Data[1] занесётся значение с 3-го канала, вместо второго?

uint16_t ADC_Data[4];

HAL_ADC_Start_DMA(&hadc1,(uint32_t*) &ADC_Data,4);

Изменено пользователем Koret
Ссылка на комментарий
Поделиться на другие сайты

9 часов назад, mail_robot сказал:

по граблям самостоятельно и получилось как надо

Да, свои грабли ближе к мозгу ;). Укладываются ровнее и надолго. За одно изучил распределение памяти, тоже пригодится.

Вывел нормальный массив с картинкой по DMA.  Просто сказка какая-то - по SPI рисуется мгновенно!  Теперь можно вместо ожидания картинки, измерить частоту кадров в секунду :).  Но это уже завтра ...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • Судя по отверстиям в плате, будут прикручены как-то насквозь? У вас эскизика крепления к радиатору нет случайно? Как-то не складывается в голове, как будет осуществляться тепловой контакт транзисторов с радиатором...
    • Если речь про мультисим, то он работает у меня на древнем компе пенсионэре с i5, которому 12 лет. Никогда не вникал, что он там грузит, за ненадобностью. Касаемо усилителей, например, анализатор спектра расчитывает, довольно быстро, если ставить в анализаторе, минимум разрешения, без фанатизма, иначе можно и заночевать у компа. А разрешение зависит от исследуемой, основной частоты.
    • R23 не катит - явно не тот номинал, наверно 597кОм
    • Он довольно бесполезен в нашу современность. Всё, что нужно добавить к 7104 вместо второго чипа, находится на скрине, который вы скинули. Основная проблема с дискретной реализацией, имхо, в ключах и в таймингах. И если вторые ещё кое-как можно обеспечить чисто ардуиновскими костылями при таких разрядностях, то побороть утечку ключей трудно. Можно искать ADG411 конечно, и делать полностью дискретную реализацию самому, но эту проблему как раз и призвана решить 7104. Проектировщику остаётся взять два хороших ОУ, компарь, опору, и сделать схему похожую 8052 со скрина, а 7104 сама разберется с управлением Два 74hc165 регистра, и данные можно выгружать в МК. Что интересно, эта топология автонуля ещё ближе к схеме АЦП В7-38. Такая система автонуля мне больше нравится, чем автонуль в 7135, в которой ключ автонуля включен между очень чувствительным к утечкам инвертирующим входом интегратора и выходом, а тут между выходом и неинвертом, что не даёт утечке ключа автонуля "подсаживать" конденсатор интегратора. Я могу ошибаться в том, насколько хорошо это реально влияет на характеристики, мне просто больше нравится такая раздельная система, когда конденсатор автонуля не включен в цепь интегратора. Так или иначе, эти АЦП, по сути, есть пик двухтактной топологии, и что-то более крутое придумать будет сложно, остаётся лишь повторять, будь то в дискрете или используя микросхемы. Выжать больше 16 бит я думаю не выйдет, сложно объяснить, но это упирается в размахи напряжения, и слишком большое увеличение резистора интегратора/его емкости (что увеличивает влияние утечек, ухудшающих линейность). Не зря в 7104 питание аналоговой части +/-15В, а на интеграторе аж 9В. На эту тему там написано, что это компромисс между всеми ошибками:   И на всякий случай, нет, MAX132 не считается, потому что у неё многотактное интегрирование
    • Всем здравствуйте! Пока на улице идут ливни, я занялся написаем скетча для приемника. Написал, подключил, проверил, все работает! Но вылезла очень большая проблема. Когда подаю питание, севера становится в среднее положение, но потом ее начинает не по детски колбасить. То в одну сторону, то в другую, то она не двигается, то очень сильно гудит и "вибрирует" качалкой. При этом L7805CV дико греется. Уже спустя 3 секунды палец обжигает. В чем может быть дело? Я так полагаю, это нехватка тока для сервы? Кушает она немало... P.S На форумах пишут, что серва кушает до 2.5А в состоянии полного клина. При движении от 0.2 до 0.9А...
    • а можете ткнуть именно в ваши разработки ?
×
×
  • Создать...