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

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. Но тут стал рыть почему не работает код - сначала перешел к простой передаче, потом вообще побайтно руками пока до этого бага или фичи не дошел :) .  

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

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

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

Чем-чем...

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

 

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

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

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

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

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

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

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

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

Чем-чем...

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

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

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

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

×
×
  • Создать...