21.07.2015, 19:10
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Цитата:
|
Реализация довольно простая: через таймер TIM2 и DMA, разве что сброс происходит через прерывание (но эта процедура выполняется один раз перед отправкой пакета данных, так что не страшно).
|
И почему не до конца было доделать, непонятно. Что в том сбросе такого?
Цитата:
|
Канал 4 таймера TIM2 используется одновременно как выход и вход: TIM2_CH4 работает в режиме ШИМ-выхода, а TIM2_CH3 — в режиме ШИМ-захвата.
|
А смысл в захвате? Какая разница что разбирать, длительность импульса или состояние порта? С состоянием порта ИМХО меньше головняка.
Цитата:
|
По истечению захвата DMA генерирует прерывание, внутри обработчика которого отключается все ненужное и устанавливается флаг готовности принятых данных.
|
Если есть прерывание, то это уже не хардварно, это полухардварно.
В принципе, тебе нравится - и ладно!
|
|
|
|
21.07.2015, 20:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,655
Сказал спасибо: 117
Сказали Спасибо 815 раз(а) в 592 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от STM32F0
|
Что в том сбросе такого?
|
Одиночный запуск — нет особого смысла (зачем одну-единственную посылку через DMA гнать, тем паче, что все равно вручную ARR придется выставить?).
Сообщение от STM32F0
|
Какая разница что разбирать, длительность импульса или состояние порта?
|
Для измерения состояния порта пришлось бы все равно еще один канал таймера активировать, чтобы после установки в 1 дать время датчику пискнуть.
Сообщение от STM32F0
|
Если есть прерывание, то это уже не хардварно, это полухардварно.
|
Можно и без прерывания: просто мониторить состояние DMA: как только отработало, перерабатывать данные. Но с прерыванием меньше дергатни.
Сообщение от STM32F0
|
В принципе, тебе нравится - и ладно!
|
Ага. 1-wire — довольно-таки тормозная штука (особенно если работать не с DS18S20, а с DS18B20 в 12-битном режиме), поэтому лучше все-таки выполнять связанные с нею операции с минимальным отвлечением от основных функций (а то ведь можно и профукать что-нибудь).
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
21.07.2015, 20:45
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от eddy
|
Одиночный запуск — нет особого смысла (зачем одну-единственную посылку через DMA гнать, тем паче, что все равно вручную ARR придется выставить?).
|
Зачем вручную? Через DMAR. Тогда точно всё аппаратно.
Сообщение от eddy
|
Для измерения состояния порта пришлось бы все равно еще один канал таймера активировать, чтобы после установки в 1 дать время датчику пискнуть.
|
При многоканалке проще состояние порта сохранять/парсить. А так нужно кучу длительностей запоминать.
Сообщение от eddy
|
Можно и без прерывания: просто мониторить состояние DMA: как только отработало, перерабатывать данные. Но с прерыванием меньше дергатни.
|
Так прерывание не одно, а два? Прерывание по окончанию трансфера это святое. Если больше ничего не нужно особенного, то в нём всё остальное можно и мутить. Делал так несколько датчиков бегущей строкой, майн практически пустой, с вечным циклом в конце.
Сообщение от eddy
|
1-wire — довольно-таки тормозная штука (особенно если работать не с DS18S20, а с DS18B20 в 12-битном режиме), поэтому лучше все-таки выполнять связанные с нею операции с минимальным отвлечением от основных функций (а то ведь можно и профукать что-нибудь).
|
Если всё уж так плохо, то тогда надо делать всё на ДМА, без прерываний, полностью хардварно.
|
|
|
|
21.07.2015, 20:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,655
Сказал спасибо: 117
Сказали Спасибо 815 раз(а) в 592 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от STM32F0
|
надо делать всё на ДМА, без прерываний, полностью хардварно.
|
Не, в теле прерываний почти ничего особенного же: просто флаги устанавливаются/снимаются. Вот прерывания DMA: DMA1 канал 7 просто отрубает DMA, как отработало; DMA1 канал 1 устанавливает флаг готовности, отрубает DMA и таймер.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
21.07.2015, 21:13
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Зачем? Вся прелесть полной хардварности - 1-wire крутится самостоятельно, дисплей - самостоятельно. Всё без прерываний и отключений/манипуляций. В майне или прерывании только обработка и пересылка нужных данных.
|
|
|
|
21.07.2015, 23:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,655
Сказал спасибо: 117
Сказали Спасибо 815 раз(а) в 592 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Кстати, никто не натыкался на онлайновый "генератор" структур для инициализации USB? Я поковырял сегодня пример HID (мышка) из opencm3, захотелось туда еще клаву добавить. Но как все эти дескрипторы совместить — ума не приложу!
// придумал прикольную фигню, чтобы народ пугать: сделать "квазифлешку" (там надо-то по-минимуму, а уж USB1.1 вполне возможно, что даже на внутреннем RC-генераторе заведется). Втыкаем ее в компьютер и курсор мыши начинает бешено мотыляться по кругу, а в активное текстовое поле пишется какая-нибудь тарабарщина. Ну и, конечно, можно что-нибудь полезное придумать..
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
22.07.2015, 09:21
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.03.2007
Сообщений: 1,368
Сказал спасибо: 85
Сказали Спасибо 626 раз(а) в 378 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Дескрипторов и репортов клавы и мыши вроде валом в инете.
Как понимаю, в самом начале ставится другое кол-во интерфейсов (в 2 раза больше), и тупо в конец добавляются дескрипторы.
Ну и к репортам добавляет еще репорт.
По крайней мере на кипарисе у меня такое прокатывало.
Получается составное устройство.
|
|
|
|
22.07.2015, 11:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от eddy
|
Кстати, никто не натыкался на онлайновый "генератор" структур для инициализации USB?
|
http://www.usb.org/developers/hidpag...criptor%20Tool
|
|
|
|
22.07.2015, 12:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,655
Сказал спасибо: 117
Сказали Спасибо 815 раз(а) в 592 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
omercury, не вижу. Там только какой-то зип скачать предлагают, а я онлайн хочу найти, потому что нафиг мне этот зип с кучей непонятных файлов внутри? Ладно бы, исходники были, чтобы собрать утилитку...
По поводу составного устройства частично разобрался. По systick дергаю мышу, чтобы она перемещалась по квадрату, а в каждом углу хочу еще и слово "hello" печатать. И вот тут-то косяк, код
Код:
|
void send_key(){
int8_t wrd[] = {11, 8, 15, 15, 18, 0}, *ptr = wrd-1; // hello
int8_t buf[9] = {2,0,0,0,0,0,0,0,0};
do{
buf[3] = *(++ptr);
usbd_ep_write_packet(usbd_dev, 0x81, buf, 9);
buf[3] = 0;
}while(*ptr);
} |
Запускается один раз и выдает кучу букв 'h'. Если на нормальной клавиатуре нажать клавишу, то выдача прекращается.
Похоже, слишком шустро пытаюсь писать — буфер-то асинхронно считывается по инициализации компьютера. Видимо, надо или паузы добавить или еще что придумать.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
22.07.2015, 13:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,655
Сказал спасибо: 117
Сказали Спасибо 815 раз(а) в 592 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Все, разобрался: надо было просто ждать, пока буфер точно не передастся + уменьшить интервал опроса (чтобы поменьше ждать). Вот что получилось:
Код:
|
void send_key(){
int8_t wrd[] = {11, 8, 15, 15, 18, 0}, *ptr = wrd; // hello
int8_t buf[9] = {2,0,0,0,0,0,0,0,0};
do{
buf[3] = *ptr;
while(9 != usbd_ep_write_packet(usbd_dev, 0x81, buf, 9));
buf[3] = 0;
while(9 != usbd_ep_write_packet(usbd_dev, 0x81, buf, 9));
}while(*(++ptr));
} |
В принципе, можно сразу по нескольку клавиш отправлять, главное — чтобы не повторялись коды (если коды повторяются, надо послать ноль).
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:54.
|
|