Easyelectronics.ru

Электроника для всех
Текущее время: 23 янв 2021, 01:23

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 45 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 16:34 
Старожил

Зарегистрирован: 16 окт 2013, 01:27
Сообщения: 1688
Reflector писал(а):
sed_alex писал(а):
https://github.com/AlekseySedyshev/WS2812B

Зачем вычитывать DR, если чтение не используется?
Код:
while (!(SPI1->SR & SPI_SR_TXE)){};   
SPI1_DR_8bit = (pBuf[i]);
while (SPI1->SR & SPI_SR_BSY){};
while (!(SPI1->SR & SPI_SR_RXNE)){};
SPI1->DR;

Последние 3 строки лишние.


Заготовка с другого проекта :) - copy past :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 18:11 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
Сейчас все перепроверил. Ничего не изменял, перекомпилил проект и стал входить в прерывание от DMA. Переписал обратно нолики. Запустил в пошаговом режиме и вижу, что в TIM2->CCR2 записалось 0x001D001D. Почемуто игнорируется ширина периферии (в DMA установлено PSIZE 32 бита:
DMA1_Channel3->CCR &= ~DMA_CCR_PSIZE;
DMA1_Channel3->CCR |= DMA_CCR_PSIZE_1;
)
То есть 0x001D есть 29 в десятичной системе, а это и есть интервал для LO импульса, но в 32 битный регистр почемуто записалось как 2 uint16_t. Вот совершенно неясно, что происходит?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 27 окт 2020, 18:32 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1396
wasa7272 писал(а):
Запустил в пошаговом режиме и вижу, что в TIM2->CCR2 записалось 0x001D001D.

Опять же у меня с твоим кодом пишет в CCR2 правильные 0x0000001D.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 28 окт 2020, 13:47 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2014, 18:09
Сообщения: 655
Откуда: Киев
Там в статье есть ссылка на гит. Почему бу не посмотреть пример оттуда? Таймеры, ДМА, сброс цепочки, всё там работает без участия процессора.
Впрочем, насильно мил не будешь, я не настаиваю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 28 окт 2020, 14:15 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1396
SOVA писал(а):
Там в статье есть ссылка на гит. Почему бу не посмотреть пример оттуда?

Там таймер 16-ти битный, а У ТС - 32-х и проблема как раз в том, что почему-то в него пишет(или кажется, что пишется) по 16 бит, соответственно твой код придется переделывать и весьма вероятно получится то же самое. А вообще это наоборот хорошо когда поняв идею пишут код сами, а не передирают его друг у друга :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 28 окт 2020, 15:23 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
Вообщем решил исключать проблемы по одной.
1. При пошаговой отладке то входит в прерывание, то не входит, в регистр пишется то два по 16 бит, то нормально одно число. Каждая компиляция проекта приносит какие-то сюрпризы. Возможно что-то с кейлом, может винда чудит. Дабы исключить п.1 - переполз на убунту и stm32CubeIDE. Создам новый проект (без HAL и LL), только CMSIS (дюже нравится она мне).

2. Так как 48 МГц явно не достаточно, а 72 МГц не есть хорошо (штатно) для stm32f042, то вход пускаю stm32f429i-disco. Так сказать: "из пушки по воробушкам" (слова не мои, помоему Досикус с соседнего форума).
Теперь при наличии пары свободных часиков, осуществлю задуманное, оглашу результат.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 28 окт 2020, 15:29 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1396
wasa7272 писал(а):
Так как 48 МГц явно не достаточно

Это было без DMA, а с DMA нужно в разы меньше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 28 окт 2020, 17:39 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
Перед глобальным переездом на ubuntu, сменой IDE с keil на stm32CubeIDE и выбором более мощного МК - убедил себя проверить всё еще раз...
...juygj;mne fuyuy xcjo... непереводимая игра слов. В прерывании DMA пытаясь сбросить флаг окончания передачи (DMA_ISR_TCIF3) записью 1 в регистр DMA->IFSR, я же записывал 1 в регистр DMA->ISR.
Исправил, снизил тактирование до 48МГц, запустил - работает, работает прекрасно.
Теперь осталось прикинуть, хотябы примерно, насколько загружен МК. Что можно еще на него повесить? Есть tft240x240 с контроллером st7789 интерфейс SPI. Как примерно прикинуть хватит ресурсов МК или нет, SPI планирую запилить также через DMA на другом канале.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 28 окт 2020, 17:51 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1396
wasa7272 писал(а):
снизил тактирование до 48МГц, запустил - работает, работает прекрасно.

Для 72MHz WS увеличивал до двух? У меня мелкие F0 стабильно на 96MHz работают, 72 - это с большим запасом.

Цитата:
Теперь осталось прикинуть, хотябы примерно, насколько загружен МК. Что можно еще на него повесить? Есть tft240x240 с контроллером st7789 интерфейс SPI. Как примерно прикинуть хватит ресурсов МК или нет, SPI планирую запилить также через DMA на другом канале.

Так ничего не известно же. Сколько диодов? Какая частота обновления? Насколько сложные эффекты? Что выводить на дисплей...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 28 окт 2020, 18:31 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
На 48МГц запустил 5 светодиодов, одним цветом, зел., кр., син. , меняют цвет через каждую секунду. 10 мин. работает, полет нормальный.

По поводу скока светиков, какая инфа на дисп: вот к примеру создал буфер для пяти светиков 24*5=120 байт, плюс 50мкс пауза перед стартом = 5 байт ИТОГО 125 байт для 5 ти светиков, это все запишется в область программ (FLASH)?
Вот вывод keil. Кроме засветки пяти светиков нет ничего:
Program Size: Code=1772 RO-data=224 RW-data=4 ZI-data=1796
как расшифровать эту запись? Code - FLASH, RO - ОЗУ, RW - EEPROM, ZI - ???
правильно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 28 окт 2020, 18:39 
Старожил
Аватара пользователя

Зарегистрирован: 11 авг 2016, 20:52
Сообщения: 786
Откуда: GMT+6
Code - программа, RO-data - константы, RW-data - переменные, инициализированные не нулем, ZI-data - переменные, инициализированные нулем.
ОЗУ = RW Data + ZI Data
FLASH = Code + RO Data + RW Data


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 28 окт 2020, 19:26 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
Kelvin, спасибо.

Вот теперь новая бяка, при переключении на 72МГц крайний светодиод запаздывает, то есть 4 ре зажглись зеленым, а пятый (первый на входе в ленту) - не горит, через секунду 4 ре переключились на красный, а пятый стал зеленым, еще через секунд 4 ре преключились на синий, 5 й стал красным и так по кругу? Если использовать только два светика, то тоже самое, крайний запаздываеь ровно на одно переключение.
Хотя при перключении на 48МГц все окай, все пять светиков светят одинаковым цветом. Что подкрутить?

main.c

Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 28 окт 2020, 19:29 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 875
wasa7272 писал(а):
На 48МГц запустил 5 светодиодов...

stm32f030f4, sn74lvc1g3157, sk6812 (5 метров), мелкий жк на st7735 чипе, три кнопки, и микрофон с усилителем на двух транзисторах.
Успевает рисовать водопад в такт с музыкой, 4к рам памяти на это дело хватает, да ещё и свободное остаётся.
Я не понимаю смысла программно мусолить отдельные биты, превращая их в байты для таймера, когда это дело полностью аппаратно получиться может.
Не обязательно все задачи нужно решать программным способом, нужно делать оптимально - чтобы ценник получался минимальный.
Если для вас sn74lvc1g3157 слишком мелкая - купите CD4052 в корпусе so16, или даже в дипе. Ценник у неё копеечный.

_________________
[url=https://github.com/AVI-crak/Rtos_cortex]Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 28 окт 2020, 19:44 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
Цитата:
Я не понимаю смысла программно мусолить отдельные биты, превращая их в байты для таймера, когда это дело полностью аппаратно получиться может.


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

Конкретно: "програмно мусолить отдельные биты, превращая их в байты для таймера, когда это дело полностью аппаратно получиться может." Если можно поподробнее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 28 окт 2020, 20:02 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1396
AVI-crak писал(а):
Я не понимаю смысла программно мусолить отдельные биты, превращая их в байты для таймера, когда это дело полностью аппаратно получиться может.

Таблица на 2КБ, байт в качестве индекса, копируешь 2 раза по 32 бита, повторяешь для двух оставшихся цветов, сколько это примерно тактов? А выводиться оно будет 30us или 1440-2880 тактов, в зависимости от разгона. Лишний корпус ставить смысла не много, даже если есть серьезные проблемы с производительностью на заполнении буфера все равно много не сэкономишь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 28 окт 2020, 20:32 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 875
wasa7272 писал(а):
Если можно поподробнее.

Описание как подключать уже есть на первой странице, о том как работает:..
SPI обновляет данные при передаче по спаду тактового импульса, читает по нарастанию. Это означает что пока тактовый выход в единице, данные можно запомнить и сдвинуть без использования триггера, простым аналоговым коммутатором. Запоминать будет проходная ёмкость контактов, ну или навесная (100пФ достаточно). Таймер в режиме Trigger mode, контакт триггера на sck spi, и на первый адресный вход первого коммутатора.
На коммутаторе первый вход на линию данных spi, второй вход замкнуть с выходом (чтоб не болтался).
Выход нагрузить ёмкостью 100пф и адресным контактом второго коммутатора.
На таймере настроить автозагрузку регистров, 2 канала в режиме pwm на время лог единицы и нуля - с подключением к второму коммутатору.
На выхлопе второго коммутатора будет идеальный сигнал, как по доке на светик.
SPI естественно с натравленным дма, 8-16 бит без особой разницы - там сплошной поток, если не делиться ровно - то добавить "пустые" , байты для ровности, светики такое проглотят и не подавятся. А вот сам массив желательно выровнять на 8 байт - чтоб fifo красиво работало.
В массиве байты именно в таком виде как нужно светикам.


Reflector - sn74lvc1g3157 ценник в 4 рубля. Я конечно понимаю что программист может на танке в поле воробья до смерти загонять, но расход соляры меня не радует.

_________________
[url=https://github.com/AVI-crak/Rtos_cortex]Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 28 окт 2020, 20:54 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
AVI-crak, спасибо, но это слишком круто для меня, во всяком случае в ближайшее время.

Мне щас самые азы понять, DMA TIM. Вот как так, при 48МГц как надо работает, а при 72МГц крайний светодиод отстает?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 18 ноя 2020, 20:22 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
Всем доброго времени.
Впродолжение вышеизложенного.
Вот пришел логический анализатор. Тут же тыкнул им в выход с таймера. Вижу импульсы, все красиво. Первые 50 мкс в нуле, далее 24 бита, ровненько как заказывал, но в конце, за крайним битом, сигнал на выходе не падает в ноль, а так и остается в высоком уровне. Что-то не доходит как его скинуть в ноль, после окончания посылки? Для попробовать добавил в буфер еще 50 мкс ноликов. Теперь буфер получился (Start_NULL+24*LED+Start_NULL). Заработало на ура.
Остался вопрос, каким образом не добавляя в буфер конечных нулей, сбросить вывод (TIM2_Chennal2) в ноль?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 18 ноя 2020, 20:27 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1396
Если в CCRx будет 0, то и на выходе канала будет 0, хотя это зависит от настроек(PwmMode1 или PwmMode2 и т.д.). Т.е. нолик нужен только один в самом конце, а дальше уже все зависит от многих факторов. Может быть массив изначально больше на 1 и там ноль, может этого нолика в массиве и не быть совсем, а после окончания работы DMA он пишется в CCR вручную и т.д....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как подружить stm32f042f6p6 Tim2 Interrupts ws2812b???
СообщениеДобавлено: 18 ноя 2020, 20:41 
Заглядывает иногда

Зарегистрирован: 25 апр 2020, 12:03
Сообщения: 43
Цитата:
Если в CCRx будет 0, то и на выходе канала будет 0...


В прерывании DMA, по завершению передачи, записал в CCRx = 0, и наступило счастье.
Спасибо.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 45 ]  На страницу Пред.  1, 2


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB