27.12.2020, 21:06
|
#6001
|
Вид на жительство
Регистрация: 27.11.2007
Сообщений: 429
Сказал спасибо: 19
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
eddy, Выход устанавливается в полярность которую задаешь в конфигурации выхода TIM1-›CCER или я чего то не понял?.
|
|
|
|
27.12.2020, 21:09
|
#6002
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,646
Сказал спасибо: 117
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
sat_art, ну так мне нужно, чтобы в активном состоянии была единица, а в пассивном - нуль. Однако, после UE независимо от значения CCR1 выставляется единица. А через ~120нс проверяется значение CCR1, и если оно нулевое, то выставляется нуль...
Вот такие, блин, пироги!
Лет 5 назад, когда я ковырялся с 1-wire (но тогда не на CMSIS, а с opencm3), намучился с этим лишним импульсом. Но там частота маленькая, так что можно было в прерывании таймера выставлять линию в нуль.
В данном же случае такое не прокатывает!
В общем, лишнее доказательство говнистости STM32F103: на F0x2 я таких косяков не припомню. Но думал же, что у 103 шина пошустрей, плюс аппаратное деление есть - как раз, что нужно для работы с адресуемыми светодиодами, чтобы панель 20×30 хотя бы 30 раз в секунду обновлять…
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
Последний раз редактировалось eddy; 27.12.2020 в 21:14.
|
|
|
|
27.12.2020, 21:16
|
#6003
|
Вид на жительство
Регистрация: 27.11.2007
Сообщений: 429
Сказал спасибо: 19
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
eddy, Ну тогда можно PWM режим. И значения от верха таймера. Тогда будет красиво.
|
|
|
|
27.12.2020, 22:21
|
#6004
|
Гражданин KAZUS.RU
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 735
Сказал спасибо: 363
Сказали Спасибо 808 раз(а) в 380 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от eddy
|
Дело в том, что я для светодиодной ленты на WS2815 код выдумываю.
|
Возможно, пригодится подход с использованием SPI+DMA или USART+DMA.
Чтобы не быть многословным, вот ссылка на статью, где описан принцип формирования сигнала для таких светиков. Правда, для передачи 1 байта цвета потребуется 4 байта ОЗУ.
Это как вариант; понятно, что можно делать разными способами.
Ногодрыг не рассматривается
В STM32F0xx выхлоп USART можно инвертировать настройкой, что есть гуд.
|
|
|
|
27.12.2020, 23:56
|
#6005
|
Вид на жительство
Регистрация: 27.11.2007
Сообщений: 429
Сказал спасибо: 19
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от j-Roger
|
Правда, для передачи 1 байта цвета потребуется 4 байта ОЗУ
|
Или с любым таймером но 8 байт на цвет.
|
|
|
|
28.12.2020, 19:21
|
#6006
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,646
Сказал спасибо: 117
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от sat_art
|
И значения от верха таймера
|
Нет, не получается так. Либо в конце будет опять единица, либо на выходе инверсный сигнал (т.е. ничего передать не получится).
Похоже, задача абсолютно нерешаема на STM32F103 в общем случае. Только в частных…
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
Последний раз редактировалось eddy; 28.12.2020 в 19:41.
|
|
|
|
28.12.2020, 20:12
|
#6007
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,646
Сказал спасибо: 117
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сделал два варианта: для больших и маленьких скоростей:
Код:
|
void hw_setup(){
gpio_setup();
RCC-›APB2ENR |= RCC_APB2ENR_TIM1EN; // enable TIM1 clocking
TIM1-›ARR = 8; // 9 ticks till UEV
#ifdef HIGHSPEED
TIM1-›PSC = 7;
#else
TIM1-›PSC = 6999;
#endif
// PWM mode 1 (active-›inactive)
TIM1-›CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1;
// main output
TIM1-›BDTR = TIM_BDTR_MOE;
// main PWM output
TIM1-›CCER = TIM_CCER_CC1E;
#ifndef HIGHSPEED
NVIC_EnableIRQ(TIM1_CC_IRQn);
#endif
RCC-›AHBENR |= RCC_AHBENR_DMA1EN; // DMA1 clocking
// memsize 8bit, periphsize 16bit, memincr, circular, mem2periph, half & full transfer interrupt
DMA1_Channel5-›CCR = DMA_CCR_PSIZE_0 | DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_TCIE;
DMA1_Channel5-›CPAR = (uint32_t)&TIM1-›CCR1;
NVIC_EnableIRQ(DMA1_Channel5_IRQn);
} |
Код:
|
#ifndef HIGHSPEED
void tim1_cc_isr(){
TIM1-›SR = 0;
TIM1-›CCR1 = 0;
TIM1-›DIER = 0;
}
#endif
void dma1_channel5_isr(){
if(DMA1-›ISR & DMA_ISR_TCIF5){ // transfer complete - stop
TIM1-›CR1 |= TIM_CR1_OPM;
// THIS IS A DIRTY HACK! IT WORKS ONLY @ HIGH SPEEDS, WHEN THERE'S NO TIME TO GO INTO IRQ
// On small frequencies comment this line and allow CC1 IRQ
#ifdef HIGHSPEED
TIM1-›CCR1 = 0;
#else
TIM1-›DIER = TIM_DIER_CC1IE;
#endif
}
DMA1-›IFCR = DMA_IFCR_CGIF5;
}
uint8_t dmabuff[] = {3,6,3,3,6,6,3,6};
static void sendone(){
TIM1-›CR1 = 0; // stop
DMA1_Channel5-›CCR &= ~DMA_CCR_EN; // disable DMA to reconfigure
TIM1-›DIER = TIM_DIER_UDE; // enable DMA requests
DMA1-›IFCR = DMA_IFCR_CGIF5;
DMA1_Channel5-›CNDTR = 8;
DMA1_Channel5-›CMAR = (uint32_t)dmabuff;
DMA1_Channel5-›CCR |= DMA_CCR_EN; // start DMA
TIM1-›CR1 = TIM_CR1_CEN | TIM_CR1_URS;// | TIM_CR1_DIR;
} |
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
03.01.2021, 17:10
|
#6008
|
Вид на жительство
Регистрация: 27.11.2007
Сообщений: 429
Сказал спасибо: 19
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
eddy,
Код:
|
void hw_setup(){
gpio_setup();
RCC-›APB2ENR |= RCC_APB2ENR_TIM1EN; // enable TIM1 clocking
TIM1-›ARR = 8; // 9 ticks till UEV
TIM1-›PSC = 6999;
TIM1-›CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2| TIM_CCMR1_OC1PE;
TIM1-›BDTR = TIM_BDTR_MOE;
TIM1-›CCER = TIM_CCER_CC1E;
RCC-›AHBENR |= RCC_AHBENR_DMA1EN;
DMA1_Channel2-›CCR = DMA_CCR_PSIZE_0 | DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_TCIE;
DMA1_Channel2-›CPAR = (uint32_t)&TIM1-›CCR1;
NVIC_EnableIRQ(DMA1_Channel2_IRQn);
}
uint8_t dmabuff[] = {3,6,3,3,6,6,3,6,0};
void sendone(){
TIM1-›CCR1=dmabuff[0];
TIM1-›CR1 = 0; // stop
DMA1_Channel2-›CCR &= ~DMA_CCR_EN; // disable DMA to reconfigure
TIM1-›DIER = TIM_DIER_CC1DE; // enable DMA requests
DMA1-›IFCR = DMA_IFCR_CGIF2;
DMA1_Channel2-›CNDTR = 8;
DMA1_Channel2-›CMAR = (uint32_t)dmabuff+1;
DMA1_Channel2-›CCR |= DMA_CCR_EN; // start DMA
TIM1-›CR1|= TIM_CR1_CEN;
}
void DMA1_Channel2_IRQHandler()
{
if(DMA1-›ISR & DMA_ISR_TCIF2)
{
TIM1-›CR1 |= TIM_CR1_OPM;
DMA1-›IFCR = DMA_IFCR_CGIF2;
}
} |
|
|
|
|
03.01.2021, 17:41
|
#6009
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,646
Сказал спасибо: 117
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
sat_art, и самый первый импульс канет в Лету, т.к. UEV при старте таймера пнет DMA…
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
03.01.2021, 17:44
|
#6010
|
Вид на жительство
Регистрация: 27.11.2007
Сообщений: 429
Сказал спасибо: 19
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
eddy,
DMA по сравнению сработает.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:36.
|
|