Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 27.12.2020, 19:41  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,629
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от sat_art Посмотреть сообщение
(uint32_t)(&dmabuff);
Не, dmabuff - это адрес массива, брать его адрес не нужно...
Теперь разбираюсь, как правильно таймер остановить, чтобы последний импульс был нужной длины, а после него был 0.
Реклама:
__________________
Союз Советских Социалистических Округов Северной Америки
eddy вне форума  
Непрочитано 27.12.2020, 19:47  
sat_art
Вид на жительство
 
Регистрация: 27.11.2007
Сообщений: 429
Сказал спасибо: 19
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
sat_art на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

eddy, ну много вариантов. Впрерывании ДМА включай прерывание ТИМУпдейт и там выключай таймер.
Второй - включить прелоадер для CCR таймера и писать 0 в CCR в прерывании ДМА (если у 103-го есть прелоадер для него - не помню).
И
dmabuff - это массив, а &dmabuff - указатель - т.е. адрес.
sat_art вне форума  
Непрочитано 27.12.2020, 19:57  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,629
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от sat_art Посмотреть сообщение
Впрерывании ДМА включай прерывание ТИМУпдейт и там выключай таймер.
Не получается: последний импульс обрезается при этом:
Код:
void tim1_up_isr(){
    TIM1-›SR = 0;
    TIM1-›CCR1 = 0;
    TIM1-›CR1 = 0;
}

void dma1_channel5_isr(){
    if(DMA1-›ISR & DMA_ISR_TCIF5){ // transfer complete - stop
        TIM1-›DIER = TIM_DIER_UIE;
    }
    DMA1-›IFCR = DMA_IFCR_CGIF5;
}
Сообщение от sat_art Посмотреть сообщение
включить прелоадер для CCR таймера и писать 0 в CCR в прерывании ДМА
Тоже фигня какая-то получается...
Сообщение от sat_art Посмотреть сообщение
dmabuff - это массив, а &dmabuff - указатель - т.е. адрес.
dmabuff - это и есть адрес. А &dmabuff - адрес размещения этого адреса.
__________________
Союз Советских Социалистических Округов Северной Америки
eddy вне форума  
Непрочитано 27.12.2020, 20:00  
sat_art
Вид на жительство
 
Регистрация: 27.11.2007
Сообщений: 429
Сказал спасибо: 19
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
sat_art на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Да поступи проще - сделай 10 значений в буфере - последнее 0.
sat_art вне форума  
Непрочитано 27.12.2020, 20:23  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,629
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

sat_art, не, это не кошерно. Решил этот трэш так:
Код:
void tim1_up_isr(){
    TIM1-›SR = 0;
    TIM1-›CCR1 = 0;
}

void tim1_cc_isr(){
    TIM1-›SR = 0;
    TIM1-›CR1 |= TIM_CR1_OPM;
    TIM1-›DIER = TIM_DIER_UIE;
}

void dma1_channel5_isr(){
    if(DMA1-›ISR & DMA_ISR_TCIF5){ // transfer complete - stop
        DMA1_Channel5-›CCR &= ~DMA_CCR_EN;
        TIM1-›DIER = TIM_DIER_CC1IE;
    }
    DMA1-›IFCR = DMA_IFCR_CGIF5;
}

static void sendone(){
    TIM1-›CR1 = 0; // stop
    TIM1-›DIER = TIM_DIER_UDE; // enable DMA requests
    DMA1-›IFCR = DMA_IFCR_CGIF5;
    DMA1_Channel5-›CNDTR = 6;
    DMA1_Channel5-›CMAR = (uint32_t)dmabuff;
    DMA1_Channel5-›CCR |= DMA_CCR_EN; // start DMA
    TIM1-›CR1 = TIM_CR1_CEN | TIM_CR1_URS;
}
Дело в том, что я для светодиодной ленты на WS2815 код выдумываю. И там буфер ограничен 48 записями. В прерывании по половине передачи DMA заполняю первые 24 байта, в прерывании по окончании передачи заполняю вторые 24. А как количество светодиодов кончилось, отключаю передачу…
__________________
Союз Советских Социалистических Округов Северной Америки
eddy вне форума  
Непрочитано 27.12.2020, 20:25  
sat_art
Вид на жительство
 
Регистрация: 27.11.2007
Сообщений: 429
Сказал спасибо: 19
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
sat_art на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

А это кошерно?
sat_art вне форума  
Непрочитано 27.12.2020, 20:33  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,629
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Тоже фигня получается: пока на низких частотах работал, нормально было. Как только установил нужную — получаю в конце 2 лишних импульса. И даже добавление в конец массива нуля не дает ничего: получаю лишний короткий импульс длительностью около 120нс... И он не пропадает, даже если я таймер в прерывании DMA отключаю!
Сейчас проверил: если в середину массива 0 добавить, то все равно не получается нуля (на 1 такт таймера вылезает единица). В принципе, это и в RM написано: чтобы вообще 0 на ШИМ получить, нужно выбирать второй режим, а не первый. А мне второй режим не подходит.
__________________
Союз Советских Социалистических Округов Северной Америки

Последний раз редактировалось eddy; 27.12.2020 в 20:37.
eddy вне форума  
Непрочитано 27.12.2020, 20:40  
sat_art
Вид на жительство
 
Регистрация: 27.11.2007
Сообщений: 429
Сказал спасибо: 19
Сказали Спасибо 39 раз(а) в 30 сообщении(ях)
sat_art на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Попробуй
void dma1_channel5_isr(){
.
.
TIM1-›CR|=TIM_CR1_OPM;


}
sat_art вне форума  
Непрочитано 27.12.2020, 20:48  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,629
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

В итоге внезапно нужное количество импульсов без урезания длительности последнего получилось так:
Код:
void dma1_channel5_isr(){
    if(DMA1-›ISR & DMA_ISR_TCIF5){ // transfer complete - stop
        TIM1-›CR1 = 0;
        TIM1-›DIER = 0;
    }
    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;
}
Но если PSC увеличить, получается полная лажа!
OPM не спасает.
__________________
Союз Советских Социалистических Округов Северной Америки

Последний раз редактировалось eddy; 27.12.2020 в 20:51.
eddy вне форума  
Непрочитано 27.12.2020, 21:02  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,629
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

В общем, эксперименты показали, что на большой скорости нельзя выставлять линию в нуль в отложенном прерывании по CC или UE. Нужно это делать сразу в прерывании DMA. И безразлично, выключаем мы таймер сразу, или же ставим OPM: все равно работает и так, и так.
А вот в случае с малыми частотами нужно активировать прерывания таймера...
Очень хреново, что даже в режиме OPM на событии UE выход устанавливается в нуль!
__________________
Союз Советских Социалистических Округов Северной Америки
eddy вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Школа АRMрестлинга Uragan90 Микроконтроллеры, АЦП, память и т.д 54 22.08.2011 16:13
ARM Cortex M3 + Linux SiMiLya Микроконтроллеры, АЦП, память и т.д 10 17.06.2011 17:20
Помогите с STM32 - очень нужно... yakuzaa Микроконтроллеры, АЦП, память и т.д 60 04.08.2010 11:04
Как добавить поддержку для STM32 SFHK Микроконтроллеры, АЦП, память и т.д 11 18.12.2009 18:09


Часовой пояс GMT +4, время: 15:20.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot