STM32Fxxx вывод последовательности битов
-
Vladimir86
- Родился
- Сообщения: 14
- Зарегистрирован: Ср мар 18, 2020 10:25:01
- Откуда: Москва
STM32Fxxx вывод последовательности битов
Доброго все времени суток. Есть очень не стандарный вопрос: можно ли каким-либо способом преобразовать любой стандартный интерфейс (UART, SPI, CAN) в поток битов, например в кодировки NRZ средствами самого мк ?
- Реклама
- >TEHb<
- Друг Кота
- Сообщения: 5742
- Зарегистрирован: Ср ноя 11, 2009 17:19:30
- Откуда: Воронеж
- Контактная информация:
Re: STM32Fxxx вывод последовательности битов
С такой задачей справится и GPIO. Или по какой-то причине хочется именно периферию применить?
"Привет!" - соврал он.
-
Vladimir86
- Родился
- Сообщения: 14
- Зарегистрирован: Ср мар 18, 2020 10:25:01
- Откуда: Москва
Re: STM32Fxxx вывод последовательности битов
Применение GPIO (даже через DMA) - это уж совсем крайность.
Re: STM32Fxxx вывод последовательности битов
SPI (I2S) - чисто data, никакого "обрамления", кодирование, как раз - nrz
или я не понял вопроса
можно еще таймером через dma.
или я не понял вопроса
можно еще таймером через dma.
-
Vladimir86
- Родился
- Сообщения: 14
- Зарегистрирован: Ср мар 18, 2020 10:25:01
- Откуда: Москва
Re: STM32Fxxx вывод последовательности битов
a797945, вы правильно поняли вопрос. Да, я понимаю, что можно через gpio с таймером по dma. Но проблема в том, что кодировка может быть любой: NRZ, NRZI, манчестерский кол итд. Сейчас есть проект, в котором прием NRZI, а вот выход может быть другим.
Добавлено after 10 minutes 49 seconds:
a797945, да еще забыл добавить: просто поток байтов как в мк то и из него без какого либо тактирования со стороны.
Добавлено after 10 minutes 49 seconds:
a797945, да еще забыл добавить: просто поток байтов как в мк то и из него без какого либо тактирования со стороны.
- Реклама
Re: STM32Fxxx вывод последовательности битов
не имел ввиду gpio.
самим таймером, способ разжеван в мигалках на ws2812
примерно в таком духе (выводил 32-б слова с определенным таймингом):
самим таймером, способ разжеван в мигалках на ws2812
примерно в таком духе (выводил 32-б слова с определенным таймингом):
Спойлер
Код: Выделить всё
TIM1->CCMR1 = (TIM_CCMR1_OC1PE
|TIM_CCMR1_OC1M_1
|TIM_CCMR1_OC1M_2
|TIM_CCMR1_OC2PE
|TIM_CCMR1_OC2M_1
|TIM_CCMR1_OC2M_2 );
TIM1->CCER = (TIM_CCER_CC1E | TIM_CCER_CC1NE |TIM_CCER_CC2E | TIM_CCER_CC2NE); //
TIM1->DIER = TIM_DIER_UDE;
TIM1->CCR1 = 0;
TIM1->CCR2 = 0;
TIM1->ARR = 8-1;
TIM1->PSC = 180-1; //50kHz
TIM1->EGR = TIM_EGR_UG;
TIM1->BDTR |= TIM_BDTR_MOE;
TIM1->DCR = ((uint16_t)0x010D); //
// TIM4 KeyDelay
TIM4->PSC = 7200-1; // 0.5ms
TIM4->ARR = 5000-1; //
TIM4->EGR = TIM_EGR_UG;
DMA1_Channel5->CCR = 0;
DMA1_Channel5->CPAR = ((uint32_t)&(TIM1->DMAR));
DMA1_Channel5->CMAR = ((uint32_t)&buf[0]);
DMA1_Channel5->CNDTR = (4*(32+4))*2;
DMA1_Channel5->CCR = DMA_CCR5_CIRC|DMA_CCR5_MINC|DMA_CCR5_PSIZE_0|DMA_CCR5_MSIZE_0|
DMA_CCR5_PL|DMA_CCR5_DIR|DMA_CCR5_TCIE|DMA_CCR5_HTIE);
DMA1->IFCR = ((uint32_t)0x0FFFFFFF); // Clears all flags
uint32_t data0,data1,data2,data3;
uint8_t a=0x80;
uint32_t b=0;
uint32_t c=1;
uint32_t d=3;
DMA1_Channel5->CCR |= DMA_CCR5_EN;
TIM1->CR1 |= TIM_CR1_CEN;
uint32_t sp=4; //50kHz
while (1) {
data0=(0x80|((c<<=1)<<8)); // 01
data1=(0x40|((b++)<<8)); // 02
data2=(0x20|((d<<=1)<<8)); // 04
data3=(0b10101010101010101010101001010101); // AA
while (!(DMA1->ISR&DMA_ISR_HTIF5)) { ;}
W2Buf(data0,data1,Abuf1);
(a==1)?(a=0x80):(a>>=1);
if (c==0) c=1;
if (d==0) d=3;
if (!(TIM4->CR1&TIM_CR1_CEN)) {
if (!(GPIOB->IDR & K2)) {
sp++;
if (sp==15) sp=0;
TIM1->CR1 = 0;
TIM1->ARR = 8-1;
switch(sp) {
case 0: TIM1->PSC = 818-1; break; //11kHz
case 1: TIM1->PSC = 750-1; break; //12kHz
case 2: TIM1->PSC = 620-1; break; //14.5kHz
case 3: TIM1->PSC = 188-1; break; //48kHz
case 4: TIM1->PSC = 180-1; break; //50kHz
case 5: TIM1->PSC = 91-1; break; //99kHz
case 6: TIM1->PSC = 90-1; break; //100kHz
case 7: TIM1->PSC = 36-1; break; //250kHz
case 8: TIM1->PSC = 35-1; break; //257kHz
case 9: TIM1->PSC = 19-1; break; //473kHz
case 10: TIM1->PSC = 18-1; break; //500kHz
case 11: TIM1->PSC = 10-1; TIM1->ARR = 9-1; break; //800kHz
case 12: TIM1->PSC = 11-1; break; //818kHz
case 13: TIM1->PSC = 9-1; break; //1000kHz
case 14: TIM1->PSC = 8-1; break; //1125kHz
}
TIM1->EGR = TIM_EGR_UG;
TIM1->CR1 |= TIM_CR1_CEN;
TIM4->CR1 |= TIM_CR1_CEN|TIM_CR1_OPM;
} // key pressed
} // time key
while (!(DMA1->ISR&DMA_ISR_TCIF5)) {;}
DMA1->IFCR = DMA_IFCR_CGIF5;
W2Buf(data2,data3,Abuf2);
} // end while
} // END main
void W2Buf(uint32_t w1,uint32_t w2,uint32_t Abuf) {
uint32_t y=0x0004000F; //
uint32_t n=0x00040000;
uint32_t z=0; //
uint32_t *p = (uint32_t*)&buf[Abuf];
for (uint32_t i=0;i<32;i++) {(w1&1)?(*p=y):(*p=n); w1>>=1; p++;}
for (uint32_t i=0;i<4; i++) {*p=z; p++;}
for (uint32_t i=0;i<32;i++) {(w2&1)?(*p=y):(*p=n); w2>>=1; p++;}
for (uint32_t i=0;i<4; i++) {*p=z; p++;}
}
- AlanDrakes
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Пн июл 04, 2016 16:51:22
- Откуда: Россия, Омск
Re: STM32Fxxx вывод последовательности битов
Забавно. А я для вывода битов в WS2812 использовал SPI с кольцевым буфером (фактически, буфером на два светодиода) и его заполнением через DMA по переходу через середину и конец буфера. Конкретно для диодов - отличное решение. Для более широких временнЫх интервалов, лучше всё же таймер.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: STM32Fxxx вывод последовательности битов
Я для адресных светодиодов таймер с DMA использовал.
Re: STM32Fxxx вывод последовательности битов
в той приспособе (на blue pill) у меня получился I2S на любые (условно) скорость и размер слова. data и clock с двух каналов одного таймера.
а поскольку данные готовятся "в ручную", то и кодировку можно прикрутить разную, какую-то элементарно, какую-то чуть геморойней. поэтому и предложил.
формировать данные в буфере, а dma через таймер сам будет выталкивать на нужной скорости.
пишу "получился" потому, что цель была не s2i - это мои замуты с Arinc, по второму кругу.
[uquote="Vladimir86",url="/forum/viewtopic.php?p=4269334#p4269334"]без какого либо тактирования со стороны.[/uquote]
не вижу в чем затык, не нужен clock - просто не отдаете его, даже не формируете.
а поскольку данные готовятся "в ручную", то и кодировку можно прикрутить разную, какую-то элементарно, какую-то чуть геморойней. поэтому и предложил.
формировать данные в буфере, а dma через таймер сам будет выталкивать на нужной скорости.
пишу "получился" потому, что цель была не s2i - это мои замуты с Arinc, по второму кругу.
[uquote="Vladimir86",url="/forum/viewtopic.php?p=4269334#p4269334"]без какого либо тактирования со стороны.[/uquote]
не вижу в чем затык, не нужен clock - просто не отдаете его, даже не формируете.
Re: STM32Fxxx вывод последовательности битов
Поток произвольных битов легко сделать на LPC43xx. Там и периферия соответствующая имеется - SGPIO. Хоть на ввод хоть на вывод. Хоть с DMA хоть без. С макс. частотой <=102МГц (если не путаю).
Вроде в некоторых других линейках LPC SGPIO тоже есть.
SGPIO - это не костыли на GPIO+DMA. Совсем другой уровень.
Вроде в некоторых других линейках LPC SGPIO тоже есть.
SGPIO - это не костыли на GPIO+DMA. Совсем другой уровень.
-
Vladimir86
- Родился
- Сообщения: 14
- Зарегистрирован: Ср мар 18, 2020 10:25:01
- Откуда: Москва
Re: STM32Fxxx вывод последовательности битов
[uquote="a797945",url="/forum/viewtopic.php?p=4270613#p4270613"]в той приспособе (на blue pill) у меня получился I2S на любые (условно) скорость и размер слова. data и clock с двух каналов одного таймера.
а поскольку данные готовятся "в ручную", то и кодировку можно прикрутить разную, какую-то элементарно, какую-то чуть геморойней. поэтому и предложил.
формировать данные в буфере, а dma через таймер сам будет выталкивать на нужной скорости.
пишу "получился" потому, что цель была не s2i - это мои замуты с Arinc, по второму кругу.
[uquote="Vladimir86",url="/forum/viewtopic.php?p=4269334#p4269334"]без какого либо тактирования со стороны.[/uquote]
не вижу в чем затык, не нужен clock - просто не отдаете его, даже не формируете.[/uquote]
Да, вы правы, насчет вывода, а как быть со входом. Ни SPI, ни I2C без тактирования из вне ничего не будет принимать.
а поскольку данные готовятся "в ручную", то и кодировку можно прикрутить разную, какую-то элементарно, какую-то чуть геморойней. поэтому и предложил.
формировать данные в буфере, а dma через таймер сам будет выталкивать на нужной скорости.
пишу "получился" потому, что цель была не s2i - это мои замуты с Arinc, по второму кругу.
[uquote="Vladimir86",url="/forum/viewtopic.php?p=4269334#p4269334"]без какого либо тактирования со стороны.[/uquote]
не вижу в чем затык, не нужен clock - просто не отдаете его, даже не формируете.[/uquote]
Да, вы правы, насчет вывода, а как быть со входом. Ни SPI, ни I2C без тактирования из вне ничего не будет принимать.
Re: STM32Fxxx вывод последовательности битов
Вам же дали грамотный совет- применяйте "шапку по Сеньке".
-
Vladimir86
- Родился
- Сообщения: 14
- Зарегистрирован: Ср мар 18, 2020 10:25:01
- Откуда: Москва
Re: STM32Fxxx вывод последовательности битов
Уважаемые, может быть подскажите возможное решение вопроса: есть сформированный массив из n элементов (каждый 1 байт). Его нужно преобразовать в NRZI кодировку. Каким алгоритмом это можно сделать ?
Re: STM32Fxxx вывод последовательности битов
Представьте, как выглядит NRZI:
- если подряд идет два нулевых бита, состояние выхода не переключается.
- если соседние биты меняются из 1 в 0, состояние выхода не переключается.
- если соседние биты меняются из 0 в 1, состояние выхода переключится между битами на противоположное.
- если подряд идут два единичных бита, состояние выхода переключится между этими битами на противоположное.
(существует вариант, когда выход инвертируется при двух нулевых битах, а при двух единичных не изменяется)
Таким образом, есть 4 входных комбинации и 2 выходных состояния. Это надо и записать. Проверка состояние бита в языке Си делается через логическую операцию AND по маске, содержащей 1 в проверяемом разряде. Здесь нужно проверять два соседних бита. Можно сделать несколькими способами. Например вот так:
, где массив change[] содержит признак, требующий смены состояния на выходе (THUE) после передачи бита или оставляющий состояние выхода без изменения (FALSE).
PS. Кодирование NRZ и NRZI значительно отличается по виду. В NRZ смена состояния выхода на противоположное происходит при изменении двух соседних битов и по форме оно повторяет битовые измениния. А в NRZI алгоритм сложнее. Вам какое всё-таки нужно? Вначале вы писали про NRZ а сейчас NRZI хотите.
- если подряд идет два нулевых бита, состояние выхода не переключается.
- если соседние биты меняются из 1 в 0, состояние выхода не переключается.
- если соседние биты меняются из 0 в 1, состояние выхода переключится между битами на противоположное.
- если подряд идут два единичных бита, состояние выхода переключится между этими битами на противоположное.
(существует вариант, когда выход инвертируется при двух нулевых битах, а при двух единичных не изменяется)
Таким образом, есть 4 входных комбинации и 2 выходных состояния. Это надо и записать. Проверка состояние бита в языке Си делается через логическую операцию AND по маске, содержащей 1 в проверяемом разряде. Здесь нужно проверять два соседних бита. Можно сделать несколькими способами. Например вот так:
Код: Выделить всё
for(int bit = 0; bit < 7; bit++)
{
if(((byte >> bit) & 0x03) < 0x2)
change[bit] = FALSE;
else
change[bit] = TRUE;
}
PS. Кодирование NRZ и NRZI значительно отличается по виду. В NRZ смена состояния выхода на противоположное происходит при изменении двух соседних битов и по форме оно повторяет битовые измениния. А в NRZI алгоритм сложнее. Вам какое всё-таки нужно? Вначале вы писали про NRZ а сейчас NRZI хотите.
-
Vladimir86
- Родился
- Сообщения: 14
- Зарегистрирован: Ср мар 18, 2020 10:25:01
- Откуда: Москва
Re: STM32Fxxx вывод последовательности битов
MLX90640, спасибо. Сейчас принято решение про NRZI. Я понимаю как устроена кодировка NRZI. Вопрос в следующем: есть последовательность байтов, она может быть любой длины (ну в разумных пределах, естественно). Проблема в том, что в ручную, когда последовательность маленькая можно и в ручную построить последовательность. А вот когда она неизвестного размера.... Я понимаю, что NRZ и NRZI принципиально отличаются. Меня интересует NRZI. Просто про NRZ я написал для примера, там могла быть абсолютно любая кодировка.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32Fxxx вывод последовательности битов
[uquote="Vladimir86",url="/forum/viewtopic.php?p=4274790#p4274790"]А вот когда она неизвестного размера....[/uquote]А в чём проблема держать во временной переменной последний бит и при переходе на следующий байт просто учитывать его?
ЗЫ: Про приколу накидал алгоритм с табличной перекодировкой. Compiler Explorer.
ЗЫ: Про приколу накидал алгоритм с табличной перекодировкой. Compiler Explorer.
-
Vladimir86
- Родился
- Сообщения: 14
- Зарегистрирован: Ср мар 18, 2020 10:25:01
- Откуда: Москва
Re: STM32Fxxx вывод последовательности битов
VladislavS, спасибо.


