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

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 пользователей онлайн

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

  • Сообщения

    • Что то в жизни должно стоять 
    • В кАлонки гениус на место тда2003 нормально встает.
    • 2,4кОм уже заказал, новая сложность))) неполярные электролиты, впервые с ними сталкиваюсь, стоят они как космолет, можно конечно сделать из полярных но получится громоздко
    • Конечно нет. Более того, вышеупомянутой 140уд1 достаточно для 90% всех БП, но новые детали позволяют применять разные схемотехнические решения ранее недоступные - например, отсутствие отрицательного источника питания или цепей балансировки ибо их смещение по входам может оказаться пренебрежимо мало, а крайне малый ток полевикового входа не требует сильного согласования импедансов для выравнивания смещений, создаваемых входными токами. Но в чем тогда интерес в разработке схемы, если это будет всё тот же болгарский БП из 70х, причем на тех же самых деталях и по абсолютно такой же схеме Понятно, что особо улучшать схемотехнику линейных БП некуда. Но со старыми деталями, требующими дополнительные пару вольт питания из-за узкого диапазона синфазных сигналов или имеющих почти микроамперы входного тока приходится схемотехнически возиться как с каким-то пажылым дедушкой - там ему костыль в виде отрицательного питания, тут надо импедансы равные по входам, не то смещение будет (у 140уд1, например, даже нет выводов балансировки, т.е. смещение надо вводить отдельной  цепью по входу), а здесь надо выход повторителем усилить, ибо не может раскачать базу силового транзистора... и т.д. Повозиться из интереса можно, но не знаю какое веселье в который раз изобретать один и тот же болгарский велосипед.   Это даже скорее не БП, а гибрид из БП и  вольтамперметра для всяческих издевательств над детальками. Как пример. И вот ещё. Причем эти "много оу" не просто какие-то там буферы-измерялки, а именно в петле ООС стоят, что прибавляет головной боли схемотехнику. Я пытался повторить их "переключалку петель оос", или просто "клампу", как я ее обзываю, в микрокапе хотяб на моделях ОУ типа 741, с использованием в интеграторе TL071, но ничего не вышло, схема стабильно даёт овершуты под 5-10%, что говорит о неоптимально скорректированной под БП АЧХ. Этот рубеж пока что мне не доступен никак, вот  и вожусь со схемой шелестова на четырёх ОУ.  
×
×
  • Создать...