Signus Опубликовано 16 ноября, 2017 Поделиться Опубликовано 16 ноября, 2017 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. Но тут стал рыть почему не работает код - сначала перешел к простой передаче, потом вообще побайтно руками пока до этого бага или фичи не дошел . 0 Платы и киты Ctrl-Amp Ссылка на комментарий Поделиться на другие сайты Поделиться
Darth_Vader Опубликовано 16 ноября, 2017 Поделиться Опубликовано 16 ноября, 2017 (изменено) 11 минуту назад, Signus сказал: Можете подсказать чем конвертить? Чем-чем... inline uint16_t swab(uint16_t i) // название - дань ассемблеру БК 0010-01 :-) { return (((i & 0x00FF) << 8) | ((i & 0xFF00) >> 8)) } Изменено 16 ноября, 2017 пользователем Darth_Vader 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Koret Опубликовано 16 ноября, 2017 Поделиться Опубликовано 16 ноября, 2017 (изменено) Продолжаю знакомиться с STM32 и с микроконтроллерами в целом, дошёл до DMA и появилось пара вопросов: 1) Почему для АЦП всегда не используют DMA, если это такой классный инструмент? Зачем предусмотрены ещё 2-а режима Polling и Interrupt, для каких задач, если по сути всё можно сделать через DMA? Или не всё? 2) Что приводит в действие DMA, т.е. чьи ресурсы он расходует? Ведь опрашивать (переносить значения в память), например, АЦП с такой частотой это же какие ресурсы нужны, за счёт чего это достигается, если мы не задействуем процессор? Изменено 16 ноября, 2017 пользователем Koret 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Darth_Vader Опубликовано 16 ноября, 2017 Поделиться Опубликовано 16 ноября, 2017 (изменено) Зачем мне в АЦП использовать ПДП, если мне надо иногда опрашивать кнопки - каждой задаче свой инструмент. Или как там Мао говорил: "Пусть расцветают сто цветов, пусть соперничают сто школ!" Изменено 16 ноября, 2017 пользователем Darth_Vader 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Signus Опубликовано 16 ноября, 2017 Поделиться Опубликовано 16 ноября, 2017 39 минут назад, Darth_Vader сказал: Чем-чем... Это понятно, речь шла о прогах, генерящих код си из файла картинки, дающих массив байтов, а не слов. 0 Платы и киты Ctrl-Amp Ссылка на комментарий Поделиться на другие сайты Поделиться
GOR23 Опубликовано 16 ноября, 2017 Поделиться Опубликовано 16 ноября, 2017 (изменено) @Darth_Vader у меня камень STM32F103RCT6 работает на 72МГц. По I2C подключен к акселерометру LIS331DLH. Нормально работает, 20 устройств уже катается. Тактирование вот так настроено: Изменено 16 ноября, 2017 пользователем GOR23 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Darth_Vader Опубликовано 16 ноября, 2017 Поделиться Опубликовано 16 ноября, 2017 @GOR23 верю. У меня DS3231 и DS1307 тоже прекрасно работают на любой частоте. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
GOR23 Опубликовано 16 ноября, 2017 Поделиться Опубликовано 16 ноября, 2017 (изменено) Настройка 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 к плюсу резисторами подтянуты? Изменено 16 ноября, 2017 пользователем GOR23 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Darth_Vader Опубликовано 16 ноября, 2017 Поделиться Опубликовано 16 ноября, 2017 1 минуту назад, GOR23 сказал: Настройка I2C на всякий случай У меня настройки идентичные. На предыдущей станице я выложил листинг. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
GOR23 Опубликовано 16 ноября, 2017 Поделиться Опубликовано 16 ноября, 2017 HAL при настройке устанавливает ещё время нарастания фронта, вот: hi2c->Instance->TRISE = I2C_RISE_TIME(freqrange, hi2c->Init.ClockSpeed); Может какой косяк самого HAL, можно попробовать покрутить его (freqrange), в разумных приделах. Лучше бы конечно осциллографом глянуть, что происходит на SDA, SCL. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Darth_Vader Опубликовано 16 ноября, 2017 Поделиться Опубликовано 16 ноября, 2017 14 минуты назад, GOR23 сказал: Может какой косяк самого HAL Наверное тогда бы все девайсы не работали. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Signus Опубликовано 16 ноября, 2017 Поделиться Опубликовано 16 ноября, 2017 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 точек в ручную не предлагать . 0 Платы и киты Ctrl-Amp Ссылка на комментарий Поделиться на другие сайты Поделиться
MihaNN52 Опубликовано 16 ноября, 2017 Поделиться Опубликовано 16 ноября, 2017 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 все работает... хочется разобраться. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Darth_Vader Опубликовано 17 ноября, 2017 Поделиться Опубликовано 17 ноября, 2017 (изменено) @MihaNN52 Попробуйте закончить текст sms кодом 26 и пошлите sms одним вызовом HAL_UART_Transmit 9 часов назад, Signus сказал: чем можно получить из файла картинки код на си с массивом в uint8_t ? Ну напишите сами. Считал бинарный файл - выдал текстовый. Работы-то на 10 минут. Изменено 17 ноября, 2017 пользователем Darth_Vader 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Signus Опубликовано 17 ноября, 2017 Поделиться Опубликовано 17 ноября, 2017 Согласен, но сто лет под винды ничего не писал . Или макрос в ворде/экселе, вставляющий ",0x" в нужные места текста . 0 Платы и киты Ctrl-Amp Ссылка на комментарий Поделиться на другие сайты Поделиться
Darth_Vader Опубликовано 17 ноября, 2017 Поделиться Опубликовано 17 ноября, 2017 2 минуты назад, Signus сказал: в нужные места текста Файл же бинарный, какой текст? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Signus Опубликовано 17 ноября, 2017 Поделиться Опубликовано 17 ноября, 2017 На вход текст с массивом uint16_t . 0 Платы и киты Ctrl-Amp Ссылка на комментарий Поделиться на другие сайты Поделиться
Darth_Vader Опубликовано 17 ноября, 2017 Поделиться Опубликовано 17 ноября, 2017 Тогда можно и в ворде макросом переколбасить. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Signus Опубликовано 17 ноября, 2017 Поделиться Опубликовано 17 ноября, 2017 Дык Про него и писал 0 Платы и киты Ctrl-Amp Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 17 ноября, 2017 Поделиться Опубликовано 17 ноября, 2017 (изменено) On 16.11.2017 at 10:34 PM, mail_robot said: проблема в том, что при передаче байта по указателю сначала передается младший полубайт, а потом уже старший. А в ручную у вас наоборот я вообще то вам сразу пытался втолковать, что байты у вас местами переставлены в исходном файле. Про полубайты это я от усталости оговорился. Полуслово конечно же Можно было в принципе и догадаться о чем толкуют. Зато по граблям самостоятельно и получилось как надо Изменено 17 ноября, 2017 пользователем mail_robot 1 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 17 ноября, 2017 Поделиться Опубликовано 17 ноября, 2017 "По граблям самостоятельно" - очень полезно. Укладывается лучше в голове. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Koret Опубликовано 17 ноября, 2017 Поделиться Опубликовано 17 ноября, 2017 Ребята, а как в многоканальном режиме 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); // Третий канал 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 17 ноября, 2017 Поделиться Опубликовано 17 ноября, 2017 (изменено) в принципе и так можно, но все равно как то не очень. Да и по времени затратно ждать каждый раз. Но в принципе в 100 миллисекунд уложится любое преобразование железобетонно. а если нет, то надо всю лавочку сворачивать, ибо проц неисправен лучше будет по ДМА организовать однократный опрос группы каналов. Так у вас будет просто каждый раз однократный перезапуск опроса и выпад в прерывание по окончании опроса без отрыва от основного кода. Будет гораздо элегантнее Изменено 17 ноября, 2017 пользователем mail_robot 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
Koret Опубликовано 17 ноября, 2017 Поделиться Опубликовано 17 ноября, 2017 (изменено) @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); Изменено 17 ноября, 2017 пользователем Koret 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Signus Опубликовано 17 ноября, 2017 Поделиться Опубликовано 17 ноября, 2017 9 часов назад, mail_robot сказал: по граблям самостоятельно и получилось как надо Да, свои грабли ближе к мозгу . Укладываются ровнее и надолго. За одно изучил распределение памяти, тоже пригодится. Вывел нормальный массив с картинкой по DMA. Просто сказка какая-то - по SPI рисуется мгновенно! Теперь можно вместо ожидания картинки, измерить частоту кадров в секунду . Но это уже завтра ... 0 Платы и киты Ctrl-Amp Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.