STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=3919190#p3919190"]Я понял так, что дма молотит сплошняком импульсы, вот лента и не реагирует, ждет паузы...[/uquote]
Как запрограммируют, так и будет работать, может бит передать и остановиться.
Реклама
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

как диод поймет, что в него влетело это ему лично , а не соседу
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

ARV, у меня отрабатывается как одиночный запуск

Код: Выделить всё

ws281x_send();
так и в цикле

Код: Выделить всё

    while(1)
    {
    	ws281x_send();
    }
В функции ws281x_send() сначала очищается буфер дма

Код: Выделить всё

memset(DMABuffer, 0, (sizeof(DMABuffer))); // очистить буфер дма для сигнала сброс
потом запускаю канал дма
Спойлер

Код: Выделить всё

	WS2812B_DMA_CHANNEL->CNDTR = sizeof(DMABuffer);
	// DMA1 Channel1 enable
	WS2812B_DMA_CHANNEL->CCR |= DMA_CCR1_EN;
	// clear counter for clean start
	WS2812B_TIM->CNT = 0;
	WS2812B_TIM->CCR1 = 0;
	// Enable Timer
	WS2812B_TIM->CR1 |= TIM_CR1_CEN;
в прерывание дма попадаем только тогда когда улетела первая половина буфера, а она равна 0, это и есть сигнал сброс.
То есть ровно 1 светик, при ШИМ 800кГц это 30мкс и +время выполнения функции ws281x_send().
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

30 мкс маловато будет.
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

VladislavS, что бы не переделывать прерывание дма, добавлю лишний 0 светодиодик в "предварительный буфер дма", а это еще + 30 мкс, итого уже будет 60 мкс, хватит?
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

У тебя же DMA на два диода. Если ты буфер перед запуском обнуляешь, то первые два автоматом должны нулями уйти. А 60 уже хватит.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Да, точно, при первом прерывании дма первая половина буфера уже ушла и пошла вторая, а заполняем первую половину буфера.
Надо в отладчике глянуть.?
А между светиками паузы не надо?
Может так попробовать?
Спойлер

Код: Выделить всё

	if(isr & WS2812B_DMA_IT_HT)
    {
	*((uint64_t*)&DMABuffer[0]) = *((uint64_t*)&tablica[pixeld[pixel_cnt].g]);
	*((uint64_t*)&DMABuffer[8]) = *((uint64_t*)&tablica[pixeld[pixel_cnt].r]);
	*((uint64_t*)&DMABuffer[16]) = *((uint64_t*)&tablica[pixeld[pixel_cnt].b]);
	DMABuffer[24] = 0;
    }
    else
    {
	*((uint64_t*)&DMABuffer[25]) = *((uint64_t*)&tablica[pixeld[pixel_cnt].g]);
	*((uint64_t*)&DMABuffer[33]) = *((uint64_t*)&tablica[pixeld[pixel_cnt].r]);
	*((uint64_t*)&DMABuffer[41]) = *((uint64_t*)&tablica[pixeld[pixel_cnt].b]);
	DMABuffer[49] = 0;
    }
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

А может документацию почитать?
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Документацию на что почитать?
Если есть идеи - говорите, если нет - молчите, а отправлять документацию читать я и сам могу.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3919350#p3919350"]Документацию на что почитать?[/uquote]
Удивительно, но факт, на WS2812B есть документация где, например, говорится какая должна быть минимальная пауза для сброса.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3919350#p3919350"]Если есть идеи - говорите, если нет - молчите[/uquote]Я свои идеи уже давным давно в коде показал. Так что, иди читай документацию.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Понятно, все равно это был просто эксперимент.
Остается под вопросом.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3919342#p3919342"]

Код: Выделить всё

*((uint64_t*)&DMABuffer[25]) = *((uint64_t*)&tablica[pixeld[pixel_cnt].g]);
[/uquote]Верной дорогой к HardFault идёте, товарищи :)
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3919377#p3919377"]Верной дорогой к HardFault идёте, товарищи :)[/uquote]
Я в похожей ситуации его ловил на F1/F3, если volatile не добавлять:

Код: Выделить всё

for (int x = 0; x < 32; x++)
{
	uint8_t pixels = VRAM[pixelsOffset++];
	uint8_t attr = VRAM[attrOffset++];
	uint32_t index = scrTableIndex[pixels];
	uint32_t addr = (uint32_t)scrTable8 + 564 * (attr & 0x7F) + index;

	auto p = (volatile uint64_t*)addr;
	*buf++ = p[0];
	*buf++ = p[1];
}
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3917055#p3917055"]Насколько я помню когда ARV рассказывал про этот "трюк", то речь шла о таблице во флеше.[/uquote]Поместил таблицу во флеш.
Оставил вариант с memcpy, 2% это не в счет.

Переписал Вариант_1 под F0, 254 светика, расход по оперативной памяти составил 2904 байта, по моим подсчетам осталось 160 байт.
На F0 светики работают идеально, 800 кГц, вот это вопрос - по чему на F100 капризничает.

Теперь тесты: контроллер STM32F030F4P6
на частоте 32МГц тест VladislavS показал 14мкс,
на частоте 48МГц - 9мкс.

Перешел на частоту 48МГц, тест ARV для CNT=254
СпойлерИзображение
При меньшем количестве светиков осциллограмма та же.
Скрипт "Мультирун" при CNT=60 забирает половину времени.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Что ещё за мой тест да ещё с такой позорной времянкой? Забери его себе. :shock:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

VladislavS, ну что сказать - ни знаю, я не программист.
F030 отличается от F100, F030 какой-то кастрированный чип, у него и набор команд меньше.
Сначала код был написан на F100, потом перенесен на F030, и он на F030 не заработал.
Мне удалось победить impure_data ценой +2к непонятно какого кода во флеше.
Пришлось отказаться от функции printf и использовать свою xprintf.
Но моя xprintf не работает без этой impure_data, пришлось добавить printf, всего одну команду

Код: Выделить всё

printf("\n");
что дает прирост лишнего +2к непонятно какого кода, но за то без impure_data.
Хотел свою xprintf поменять на printf, еще +2к коду во флеше надо.

Кроме всего прочего на F030 отказалась работать конструкция

Код: Выделить всё

*((uint64_t*)&DMABuffer[0]) = *((uint64_t*)&tablica[pixeld[pixel_cnt].g]);
хоть с volatile, хоть без.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3920603#p3920603"]Кроме всего прочего на F030 отказалась работать конструкция

Код: Выделить всё

*((uint64_t*)&DMABuffer[0]) = *((uint64_t*)&tablica[pixeld[pixel_cnt].g]);
хоть с volatile, хоть без.[/uquote]
Вероятно проблема в отсутствии поддержки невыровненного доступа у M0, а у тебя массивы байт... Был бы у них тип uint64_t, как я предлагал сделать, компилятор бы сам массивы выровнял, а memcpy пытается оптимизировать и должен проверять можно ли копировать по 32 бита, если нельзя, то вероятно копирует побайтно, что еще медленнее.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Reflector писал(а):а memcpy пытается оптимизировать и должен проверять можно ли копировать по 32 бита, если нельзя, то вероятно копирует побайтно, что еще медленнее.
но я могу таблицу выровнять __attribute__((aligned(1024))) ?
Reflector писал(а):Был бы у них тип uint64_t, как я предлагал сделать
можно поподробнее?
Ответить

Вернуться в «ARM»