Просмотр полной версии : Микроконтроллеры STM32, "с нуля".
Viktor2312
25.04.2014, 11:52
***********************
Viktor2312, Я набросал по просьбе zst пару уроков http://www.zxkot.ru/
Сразу предупреждаю - писатель из меня никакой ...
Конкретно - http://www.zxkot.ru/firmware/f01/st09 и http://www.zxkot.ru/firmware/f01/st10
http://easyelectronics.ru/category/arm-uchebnyj-kurs - для расширения кругозора
http://ziblog.ru/ - довольно много примеров работы с стм32
книга на русском "Инсайдерское руководство по STM32".
psb, Там многое на SPL .
Я бы пока не рекомендовал...
спл вообще в топку, сразу. даже не смотреть, даже как пример для передирания.
в ссылках не многое на спл, ziblog на регистрах шпарит.
psb, ZIB еще проприетарщину не любит , многие проекты сборка на makefile'ах
Но суть, да согласен, изложена понятно .
Тут сразу возникает куча вопросов, а где её скачать? Какая версия наиболее предпочтительна?
Особо меня интересует, какая версия предпочтительна для STM32F3DISCOVERY.
http://rutracker.org/forum/viewtopic.php?t=2305709
Ну так бери обе . F4 мощней , но на ней многие пины уже заняты набортной периферией .
Дискаверина F0 так же неплоха.
Ты еще по спектру задачь смотри: если кучей пинов дергать - это одно, если сэмплировать что-то - то лучше брать где больше RAM'а.
А что кокос не хочешь попробовать?
Viktor2312, MDK4.73 можешь не качать . И счас подключусь к раздаче.
alx32, А зачем нужен геморрой ? :)
---------- Post added at 11:17 ---------- Previous post was at 11:08 ----------
поэтому может до кучи закажу ещё и STM32VLDISCOVERY.
Их в свое время много кто нахаляву получили . :)
Более-менее ценным становиться после запайки 103 чипа . ;)
Потому, что учитель сказал что качать и где качать.
Кактус(кокос) == проблемы с отладкой , танцы с бубном при переносе проекта . Оно надо ?
Подобными IDE пользуются нубы , нежелающие что либо изучать...
В Keil на минимальном проекте типа
main() { while (1)} , можешь в отладчике , потыкав галки, запустить/изучить работу периферии ...
Ну не знаю, я вот пользуюсь сборкой robocraft, потому как сижу в линухе...
alx32, И SPL , угу ? :))))
У меня на лине и эклипсина работает ...
Гы... Стою на раздаче , никто не тянет :)
Ну не знаю, я вот пользуюсь сборкой robocraft, потому как сижу в линухе...
Это эти танцы ? http://robocraft.ru/blog/ARM/653.html :biggrin:
Оно устарело да и сайт с аурдинщиками это что то .
Я знаю единственный вменяемый мануал под эклипс и линь
http://kazus.ru/forums/showthread.php?t=105029&highlight=eclipse
Чем вам SPL не угодила? Зато читабельность/сопровождаемость кода в разы лучше.
Дык доков и хэлпов в самой IDE мало ?
---------- Post added at 18:42 ---------- Previous post was at 18:41 ----------
Зато читабельность/сопровождаемость кода в разы лучше.
Чегой ? Это в сознании писано ?:biggrin:
Зато читабельность/сопровождаемость кода в разы лучше.
а чем лучше?
STM начало осознавать всю ущербность SPL , выложили примеры на F0 без индусского кода...
K&R как и всегда . И что значит "Си, который используется в Keil" ?
С он и в Африке С ...
Вот ...http://rghost.ru/54676938
Мда ... Ну для начала читай это http://lib.ru/CTOTOR/starterkit.txt
Не надо искать никаких С для МК . Если привык к специфическим фичам каких-то недокомпиляторов весьма печально...
Можно, я тоже пролезу в эту школу, как начинающий?
Я второй день ковыряюсь со своей девбордой на STM32L152RB, что о ней известно - есть там суровые отличия от F, код без плясок с бубном не перенесешь.
Поэтому я пользуюсь макросами от ZiB для инициализации GPIO.
С этим контроллером я на уровне "нажать кнопу, зажечь светик"...
---------- Post added at 19:28 ---------- Previous post was at 19:26 ----------
Также поставил Keil MDK 5.1 с торрентов.
Хоть мне IAR привычней. но лучше пока быть "как все" :)
Ewgeny7, Чем тебе сие не приглянулось ?
GPIOA->AFR[0]|=(1<<8)|(1<<12);
GPIOA->MODER &=~
GPIO_MODER_MODER2 |
GPIO_MODER_MODER3
;
GPIOA->MODER|=
GPIO_MODER_MODER2_1|
GPIO_MODER_MODER3_1
;
GPIOA->OSPEEDR|=
GPIO_OSPEEDER_OSPEEDR2|
GPIO_OSPEEDER_OSPEEDR3
;
Что за код переносишь?
Чем тебе сие не приглянулось ?
Именно приведенное и используется, в макросах или без них, голым кодом.
А вот конструкции типа
GPIOC-> CRH &= ~( GPIO_CRH_CNF9 | GPIO_CRH_CNF8 | GPIO_CRH_MODE9 | GPIO_CRH_MODE8 );
GPIOC-> CRH |= GPIO_CRH_MODE9_0 | GPIO_CRH_MODE8_0 ;
уже не кошерны, нет таких определений для этого камня.
---------- Post added at 21:21 ---------- Previous post was at 21:20 ----------
Что за код переносишь?
Это пока не важно, на стадии щупания камня переносится всё, что под руку попадается :)
А вот конструкции типа
Дык и конфигурация пинов обширней стала . Если ранее в 10х ( твой код)
пины конфигурировались в одних регистрах, GPIOx_CRL для пинов 0-7 и GPIOx_CRH для пинов 8-15 , то в более новых GPIOx_MODER .
Ранее было по 4бита на пин , теперь по 2 бита в GPIOx_MODER и еще куча регистров на скорость, пуллапы и т.д.
dosikus, вот и я о том же, после 8-битников приходится копать даташиты неподеццки :)
GPIOx_MODER
2 бита на пин
00: Input (reset state) - Вход
01: General purpose output mode -Выход общего использования
10: Alternate function mode -Альтернативная функция
11: Analog mode -Аналоговый режим
GPIOx_OTYPER
1 бит на пин
0: Output push-pull (reset state) - пушпул
1: Output open-drain - С открытым стоком
GPIOx_OSPEEDR - скорость пинов
2 бита на пин
00: 400 kHz Very low speed
01: 2 MHz Low speed
10: 10 MHz Medium speed
11: 40 MHz High speed
GPIOx_PUPDR - пуллапы/ пулдаун
2 бита на пин
00: No pull-up, pull-down
01: Pull-up
10: Pull-down
11: Reserved
ну и альтернативная функция для пинов GPIOx_AFRх
---------- Post added at 21:43 ---------- Previous post was at 21:42 ----------
dosikus, вот и я о том же, после 8-битников приходится копать даташиты неподеццки :)
Трудно первые месяца 2, потом привыкаешь :biggrin:
И другие чипы уже кажутся ущербными .
GPIOx_OSPEEDR - скорость пинов
Суть выбора частоты - энергопотребление? Иначе клок можно всегда ставить по максимуму...
Суть выбора частоты - энергопотребление? Иначе клок можно всегда ставить по максимуму...
Не, похоже там RC цепочки коммутируются , фронты режут . Если не вру :biggrin:
---------- Post added at 22:00 ---------- Previous post was at 21:54 ----------
Ewgeny7, Сразу же - осторожней с PortA , конкретно с пинами 13 и 14 .
На них повешен SWD .
Но если на борту дискаверины STLink v2 то не страшно -> Connect under Reset .
Сразу же - осторожней с PortA , конкретно с пинами 13 и 14 .
На них повешен SWD .
Но если на борту дискаверины STLink v2 то не страшно -> Connect under Reset .
Да, спасибо, вроде есть такое.
---------- Post added at 22:55 ---------- Previous post was at 22:03 ----------
dosikus, как правильно описать опрос пина (вход)?
if (GPIOA->IDR == GPIO_IDR_IDR_0)
{
GPIOB->ODR |= GPIO_ODR_ODR_6;
GPIOB->ODR &= ~GPIO_ODR_ODR_7;
}
else
{
GPIOB->ODR |= GPIO_ODR_ODR_7;
GPIOB->ODR &= ~GPIO_ODR_ODR_6;
}
Чую, что неправильно описал конструкцию IF.
Вход - пин 0 GPIOA
---------- Post added at 22:58 ---------- Previous post was at 22:55 ----------
Вот сама инициализация входа (кнопка) -
GPIOA->MODER &= ~ GPIO_MODER_MODER0; // GPIOA_0 - input
GPIOA->PUPDR |= GPIO_PUPDR_PUPDR0_0; //pull-up input
---------- Post added at 23:01 ---------- Previous post was at 22:58 ----------
Виктор2312, покупай такую же девбординку, там Кортекс3, но сильно экономичный, будем вместе ковырять ее :)
Чую, что неправильно описал конструкцию IF.
Ога, сам спросил - сам ответил :)
Вот так всё работает, забыл про фильтр остальных пинов порта -
if (GPIOA->IDR & GPIO_IDR_IDR_0)
---------- Post added at 23:30 ---------- Previous post was at 23:27 ----------
Боюсь мои познания в Си настолько малы, что до твоего уровня, я дойду не раньше чем через ...эээ нескоро, хотя и плата будет идти ко мне не менее 3 недель.
А вот это уже фигня.
Синтаксис С прост, не сложнее Паскаля или Васика.
Увидев готовые конструкции, ты всё поймешь. А не поймешь - для этого мы здесь и собрались все :)
Моя платка - http://tixer.ru/catalog/debug-board/devboard-stm/stm32l_discovery/
Правда, цена здесь высоковата, можно подешевле найти.
---------- Post added at 23:34 ---------- Previous post was at 23:30 ----------
Синтаксис С прост, не сложнее Паскаля или Васика.
if (условие)
{
тело
}
else
{
тело
}
Ведь несложно?
А = B; - еще легче
A |= B; - чуть сложнее, но тоже не премудрость - A = A or B.
Ну и тому подобное. Я язык С не учил, он в принципе и так читаем, а разбор готовых программ еще и правила синтаксиса в голову вобьет :)
---------- Post added at 23:39 ---------- Previous post was at 23:34 ----------
Чем меня всегда отпугивал С - это громоздкими определениями.
Если в своей программке на Васике ты напишешь
LET A=5
То в С принято гнуть пальцы и раздувать сопли типа
const TOP_VALUE_OF_COUNTER = 5;
_MAIN_FUCKING_COUNTER_FOR_SHITTING_MEGA_CYCLE = TOP_VALUE_OF_COUNTER;
Хотя разницы в действиях и результате - никакой :)
Я надеюсь, что современные встроенные редакторы Си кода всё это сами подставляют, а не заставляют вручную вбивать?
Ну как... Частично.
Свои определения ты называй как хочешь, хоть нецензурно.
Но, например, GPIOB->MODER ты по другому не назовешь, это зарезервированные имена, регистр режима работы регистра порта В.
Тут проще понять устройство самого порта, как регистра, и разобраться как он управляется. Это действительно несложно.
Реально напоминает 580ВВ55 с его РУС :)
---------- Post added at 23:54 ---------- Previous post was at 23:53 ----------
МК написано такой установлен STM32L152RBT6
Да, именно такой у меня и стоит. При всей своей мощи кушает какие-то мифические микроамперы, может работать от двух гвоздей в лимоне...
---------- Post added at 23:58 ---------- Previous post was at 23:54 ----------
Посмотрел, есть в наличии 655 руб. Это там, где я буду брать.
Это интернет-магазин, или обычный? Просто я тоже хочу 32F купить, но у нас они несколько дороговаты.
То в С принято гнуть пальцы и раздувать сопли типа
это не в си принято, ты можешь написать еще проще чем в бейсике: а=5.
но для читаемости больших программ такие соглашения о наименованиях могут иметь место быть.
Жень , плату такую надо ?
У меня сейчас как раз такая, вот с ней и ковыряюсь. Да, цена хорошая, даже если с доставкой.
---------- Post added at 08:05 ---------- Previous post was at 08:03 ----------
Всё ли я сделал необходимое или ещё что-то нужно делать?
По крайней мере, я делал всё точно так же. Работает.
Только там еще появлялось окно, предлагающее загрузить всякие либы и определения для выбранных чипов. Но это вроде можно сделать в любой момент потом.
---------- Post added at 08:09 ---------- Previous post was at 08:05 ----------
ты можешь написать еще проще чем в бейсике: а=5
Я об этом и написал. Что можешь как захочешь, но "по-пацански" там любят в название вкладывать всю информацию. Это необходимо для понимабельности, но может вызывать панику, когда впервые лезешь в чужой код :)
Viktor2312, У тебя при установке запускался менеджер паков ?
Надо установить паки на STM32, те что желаешь, они в папке PACK
Можно так же установить из папки Legacy Support , там куча примеров от Keil и слава богу не на SPL .
http://s020.radikal.ru/i716/1404/2d/7e6e67b8ed46.png
---------- Post added at 08:33 ---------- Previous post was at 08:16 ----------
!!! Земляки Хорошиста подложили свинью русскоговорящим .
В папке Rus_font_dll есть все для исправления - меняем UvEdit.dll на прилагаемый . Далее , если win7 запускаем KEil из под админа .
Идем Edit ->Configuration .
Ни в коем случае не меняем опцию Encoding !
Шрифт выставляем с Courier New на просто Courier
http://i056.radikal.ru/1404/22/ebabd88046f3.jpg
http://s018.radikal.ru/i515/1404/b1/bd73792025bd.jpg
---------- Post added at 08:44 ---------- Previous post was at 08:33 ----------
Для вашей дискаверины путь к устанвленному паку Keil\ARM\Pack\Keil\STM32L1xx_DFP\1.0.2
В каждом паке :
даташит, референс мануал, мануал на ядро.
Основные хэдеры и исходники .
Алгоритмы для флэш.
---------- Post added at 08:52 ---------- Previous post was at 08:44 ----------
Все документы на выбранный в проекте чип , доступны на вкладке Books
Для просмотра рекомендую Foxit Reader посвежее.
http://s019.radikal.ru/i640/1404/09/4e00535be2fe.jpg
Можешь ставить , можешь нет .
В основном там нужны примеры для Keil'вских демоборд , они весьма прозрачны и без геморройной SPL ...
Есть и минимальные проекты под все дискаверины см. папку Keil\ARM\Boards\ST
Кстати Жень, и твоя кнопко-нажималка :)))))))) см Blinky
Установил на работе весь софт, подключил девборду, начинаем...
Начнем с тактирования.
Запаиваю внешний кварц. Там вроде как 16Мгц требуется.
Запаиваю внешний кварц. Там вроде как 16Мгц требуется.
Начни c HSI . И откроем проект \Keil\ARM\Boards\ST\STM32L1-Discovery\Blinky
Копируем всю папку куда нибудь - я на другой диск где все проекты.
Открываем проект , компилим и прошиваем .
Так как у мну нет вашей платы шейте сами ... :)
Однако скопирнул такой же проект на F0 - усе работает .
Прошивать Flash->Download.
Хорошо описано здесь (http://ziblog.ru/2011/12/07/stm32l-ndash-sistema-taktirovaniya-obzor.html), курим.
---------- Post added at 09:53 ---------- Previous post was at 09:52 ----------
Так как у мну нет вашей платы шейте сами ...
Хорошо, разберемся по мере сил :)
Ну че . Прошили ? Можно начинать разбор полетов ...
---------- Post added at 09:57 ---------- Previous post was at 09:56 ----------
Где находится этот UvEdit.dll который нужно заменить на тот что в папке из дистрибутива?
Keil\UV4
Хорошо, разберемся по мере сил :)
Те проекты что Blinky имеют две конфигурации - один для заливки в Flash другой для отладки в RAM . Переключалка здесь
http://s020.radikal.ru/i711/1404/d9/9b25ac3fd2e6.png
Viktor2312, На вкладку Colors & Fonts перейди :)
Больше ничего настраивать/устанавливать не нужно?
Проект открой и собери .
Платы то пока нет ?
Да все . Я же говорю - проект собери , испытай...
Убегал по работе.
Залил Блинки, работает, разумеется.
Разбираю по косточкам SystemCoreClockSetHSI(void)
Разбираю по косточкам SystemCoreClockSetHSI(void)
Прикинь , а это лишняя функция :)
По дефолту первой из стартапа вызывается SystemInit что в исходнике system_stm32xxx .
А в ней идет настройка тактирования .
Хошь подебажить ?:biggrin:
Да как-то не очень :)
---------- Post added at 11:36 ---------- Previous post was at 11:35 ----------
Тогда каким раком я переключаю тактирование?
---------- Post added at 11:38 ---------- Previous post was at 11:36 ----------
Как она может быть лишней, если устанавливает режимы перед запуском основных процедур?
---------- Post added at 11:40 ---------- Previous post was at 11:38 ----------
Мне вот это нифига не понятно, зачем?
FLASH->ACR |= FLASH_ACR_ACC64; /* Enable 64-bit access */
FLASH->ACR |= FLASH_ACR_PRFTEN; /* Enable Prefetch Buffer */
FLASH->ACR |= FLASH_ACR_LATENCY; /* Flash 1 wait state
Говорю же :
Эта функция дублирует действия что делает SystemInit.
Вот самое начало в стартапе - вектор сброса :
; Reset handler routine
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
Что бы не мешалось заремарь :
; LDR R0, =SystemInit
;BLX R0
Мне вот это нифига не понятно, зачем?
FLASH->ACR |= FLASH_ACR_ACC64; /* Enable 64-bit access */
FLASH->ACR |= FLASH_ACR_PRFTEN; /* Enable Prefetch Buffer */
FLASH->ACR |= FLASH_ACR_LATENCY; /* Flash 1 wait state
Устанавливает латентность флэша , для тактовой 48МГц...
Тьфу ты , у тебя тактовая другая . Но смысл тот же...
---------- Post added at 12:09 ---------- Previous post was at 11:43 ----------
Ewgeny7, Выкачай сие STSW-STM32002 http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF257838
Там exel'вский скрипт для настройки тактовой . Визуальная облегчалка.
Поможет осознать - что, как,к чему . На первых порах более чем достаточно.
Генерит system_stm32xxx.c - заменяешь то что в проекте .
Естественно вызов той функции ремарить :
//SystemCoreClockSetHSI();
http://s43.radikal.ru/i101/1404/78/055a096e870c.png
dosikus, объясни простую вещь, пожалуйста...
Стартап - понятно, выполняется при запуске камня и конфигурирует генераторы-делители-переключатели. Т.е. ставит всё по некоему дефолту.
Но после его выполнения, можно же конфигурить тактовые уже из программы, в частности - указанной функцией? На СТМ8 ведь именно так и делается, дефолтный стартап с HSI, включен делитель на 8, сисклок равен 2МГц, но в начале СВОЕЙ программы я могу запустить HSE и выставить делители как мне кажется необходимым. Здесь не так же?
---------- Post added at 12:20 ---------- Previous post was at 12:20 ----------
Экселину скачал, спасибо! Занятная вещь :)
Ewgeny7, Да все так же .
Только кроме выбора источника тактовой есть еще и системные делители внутренних шин-мостов , PLL и т.д.
Тебе счас обязательно внешний кварц нужен?
Да и стратап в STM32 это только векторы сброса, прерываний, трапов. Настройка кучи и стека .
Те функции что ты говоришь - настройка тактовой , прерогатива system_stm32xxx.c
Вот полюбуйся на систему тактирования, насколько все гибче :
http://i019.radikal.ru/1404/d7/1b8883f4a924.jpg
Тебе счас обязательно внешний кварц нужен?
Нет, не обязательно. Да он по сути и не нужен вообще. Так, образования ради.
Ладно, обойдемся без него.
Такие вопросы - клок на само ядро - это SYSCLK?
А что такое HCLK? Это уже частота для расползания по GPIO и прочим таймерам/периферии?
Нет , посмотри на стр. 90 Ref.man
HCLK это ядро, AHB, DMA, память
http://s020.radikal.ru/i711/1404/aa/90f64d25c0a8.jpg
Ну, вроде как разобрался с тактированием.
По дефолту МК стартует с MSI-генератором, 2МГц.
Этот режим включен в дефолтном system_stm32l1xx.c
Это не всегда есть гуд, и мы можем переключиться на высокую частоту, пересобрав этот файлик под свои нужды, или применив команды настройки тактирования.
Я поигрался с параметрами, запускал разные источники клока, менял коэффициенты делителей, менял делитель системного таймера...
Собственно, мы запускаем нужный генератор, к примеру HSI (16Мгц)
RCC->CR |= ((uint32_t)RCC_CR_HSION);
Ждем, пока он стабилизуется -
while ((RCC->CR & RCC_CR_HSIRDY) == 0);
Подаем повышенное напряжение (1.8В) на цепи тактирования, дабы работала бОльшая частота -
PWR->CR = PWR_CR_VOS_0;
Ждем, пока оно устаканится -
while((PWR->CSR & PWR_CSR_VOSF) != 0);
Устанавливаем AHB-делитель в режим "не делить частоту", т.е. делитель равен 1 -
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
Устанавливаем делители на периферию с нужными коэффициентами, или вообще 1 -
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1;
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
Сообщаем системе, что "Хачу HSI! Дай, да?" -
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_SW) | RCC_CFGR_SW_HSI;
Ну и ждем, пока электронная буря от переключения успокоится... -
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI);
Система к работе готова...
Да, еще не мешало бы выставить системный таймер, вдруг пригодится -
SysTick_Config(16000);
Здесь 16000 - сколько тиков клока считать до отработки таймера. Поскольку мы только что установили системную частоту в 16000000 герц, то после установки таймера он будет срабатывать каждую миллисекунду. Подсчитывая эти "тики", легко строится функция задержки Delay, столь любимая упоротыми фанатами CodeVisionAVR :)
void SysTick_Handler(void) { //хендлер, "ловящий" тики системного таймера
msTicks++;
}
void Delay (uint32_t dlyTicks) {
uint32_t curTicks;
curTicks = msTicks;
while ((msTicks - curTicks) < dlyTicks); // собственно, ждем dlyTicks тиков таймера
}
Воть, что я вынес из этой темы.
Если есть неправильности - с благодарностью приму затрещины от гуру :)
Если есть неправильности - с благодарностью приму затрещины от гуру :)
Если ты имеешь в виду меня - то сам ты гуру .:biggrin:
Я так же учусь/постигаю , и без меня гур хватает. :biggrin:
А по делу - настройка тактирования весьма гибкая и тактирование во время работы можно менять и менять как нужно.
И для уменьшения жручести и наоборот для скорострельности .
Если ты имеешь в виду меня
Как бы да...
Ладно, сойдемся на тосте за прекрасных гурий :)
Ewgeny7, Есть Стас, nahimovv , жаль что наши его забанили в хохлосраче
http://kazus.ru/forums/showthread.php?t=107109
Вот он точно ходячая энциклопедия и щелкает как семечки любые чипы .
И для уменьшения жручести и наоборот для скорострельности .
Я так и понял из всей этой байды.
Можно варировать частоту, источник, питающее напряжение всего этого колхоза.
Попутно сейчас разобрался, для чего Flash Latency.
Оно включается, если системная частота предполагается выше 16Мгц, иначе флеша пошлет нафиг.
Включив эту "латентность", можно "раскачать" ядро и периферию на 32МГц, использовав даже внутренний HSI и PLL.
Гы ... Кто то разгонял дискаверины VL аж до 72МГц , ссылку не дам потерял.
Оказалось ядро урезано условно . :)))))))))
Но вроде все от ревизии чипа зависит.
Похоже та же фишка что и с Рыголами - железо одно и искусственные ограничения ...
Гы ... Кто то разгонял дискаверины VL аж до 72МГц , ссылку не дам потерял.
Оказалось ядро урезано условно . :)))))))))
У меня получалось и до 75МГц, причём тупо заменой на кварц в 25МГц... :D
dosikus, Нашел по твоей ссылке на Казусе интересную феню про работу с портами I/O как с 8-битными. Сие чудовищно прекрасно, я как раз задался таким вопросом :)
alx32, Алекс а это не ты ли был на изиэлектроникс ?
У меня получалось и до 75МГц,
Гонщики, млин... :)
Я тут пока документированные возможности изучаю!
...Александр... Да... заглядываю иногда...
dosikus, Нашел по твоей ссылке на Казусе интересную феню про работу с портами I/O как с 8-битными. Сие чудовищно прекрасно, я как раз задался таким вопросом :)
Ты о выхлопе в порт через DMA ? Смотри не все камни способны...
А, дошло ты про это - http://kazus.ru/forums/showpost.php?p=709716&postcount=6
Ты о выхлопе в порт через DMA ? Смотри не все камни способны...
Нет, проще - тыц! (http://kazus.ru/forums/showpost.php?p=709716&postcount=6)
Нет, проще - тыц! (http://kazus.ru/forums/showpost.php?p=709716&postcount=6)
А вот это новость! Я не думал, что с портами в/в можно так работать. Обычно на такое способна только память...
Гы ... Кто то разгонял дискаверины VL аж до 72МГц , ссылку не дам потерял.
Дискавери разгонять бесполезно ... Там разводка ужасна ... На ней только двойной клок на флешку прокатит "Flash Latency". Качественная разводка на STM32F100, прекрасно даёт 64 мегагерца. У нас компания по тысячу девайсов выпускают с моим софтом и разводкой, ниодного отказа, хотя всё разогнано по максимуму. Стастистика уже как минимум два года. Смысл разводки очень прост, под контроллером делается подложка питания по д всем корпусом, и такая же подложка с обратной стороны текстолита для земли, вплотную к ногами питания ядра и портов вешаются конденсаторы к земле на 0.1 микрофараду и никаких проблем с разгоном. Ни на одной дискавери 64 мегагерца я не получал, в лучшем случае 48 мегагерц. Самый шик это вариант без Flash Latency но на 64 мегагерца, тогда можно наружу руками делать скорость пинов 500 наносекунд в софтовом режиме, и разгонять DMA, SPI и SSP.
С контроллерами VL, такая же история. Всё упирается в разводку. Я не помню какое именно значение было, и было ли это 72 мегагерца, но помню, что быстрее паспортной гарантировано работало ...
Хорошист, ULink вещь в себе - только Keil .
Тебе и набортного STLink хватит .
Если хочешь есть клоны JLink
http://www.aliexpress.com/store/product/emulator-double-BUFFER-ARM-emulator-supports-ARM7-ARM9-ARM11-Cortex-M3-core-ADS-IAR-KEIL-development/211243_621593984.html
Дешево и сердито . Шьет до хрена чипов, поддерживается многими IDE .
Сам имею такой, хочу второй прикупить.
Если будешь только STM8/32 и с питанием только 3.3v, то и огрызка STLink за глаза -
http://www.aliexpress.com/item/DIY-ST-LINK-V2-stlink-Emulater-Downloader-For-STM8-STM32-Practical-and-Easy-to-carry-Free/1615278383.html
Это программаторы/отладчики . Если нужно только шить -хватит и преобразователя USB -USART, например на FT232 ...
dosikus, ок . Выкину его нафиГ .
Если уже купил нафига выкидывать, так же будешь шить и отлаживать .
Пы.Сы. Припёр домой , ну чтоб дом не захламлять ... Выкину нафиГ.
Подари мне ? :biggrin:
Хорошист, личку посмотри ...
Копаю таймеры.
Взял в качестве подопытного Таймер2. Обычный такой, 16-разрядный, общего назначения.
Запилил на нем мыргание светика раз в секунду.
В общем случае инициализация и запуск таймера выглядит так -
NVIC_EnableIRQ(TIM2_IRQn); //Запускаем контроллер прерываний, прицепляем к нему Таймер2.
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; //Подаем клок на Таймер2, он болтается на АРВ1.
TIM2->PSC = 16000-1UL; // Делитель на входе таймера. Делит до 65536 при желании. У нас частота, приходящая на АРВ1 - 16Мгц, поэтому делим на 16000.
TIM2->ARR = 1000-1UL; // До скольки считает таймер. Типа TCNT на AVR... При значении 1000 мы получаем прерывания 16000000/16000/1000 = 1 прерывание в секунду.
TIM2->DIER = TIM_DIER_UIE; // Включим прерывания от события update. Т.е., по достижению счета до ARR, происходит апдейт счетчика, и это событие инициирует прерывание.
TIM2->CR1 = TIM_CR1_CEN; // Собственно, включаем таймер2.
TIM2->CNT = 0; // Сбросим текущее значение таймера в 0, пускай считает дальше сам.
Для ловли прерывания от таймера используем дежурную функцию -
void TIM2_IRQHandler(void)
{
if(TIM2->SR & TIM_SR_UIF)
{
TIM2->SR &= ~TIM_SR_UIF; //сброс флага прерывания, иначе его зациклит.
}
//обработчик прерывания
}
Как бы и всё...
Пойду дальше разбираться.
TIM2->PSC = 16000 -1UL;
TIM2->ARR = 1000 -1UL;
http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00042534.pdf
И не забывай о приоритетах прерываний .
---------- Post added at 12:06 ---------- Previous post was at 11:48 ----------
TIM2->DIER = TIM_DIER_UIE; // Включим прерывания от события update. Т.е., по достижению счета до ARR, происходит апдейт счетчика, и это событие инициирует прерывание.
А события, Event, могут использоваться для пинков другой периферии - например DMA . В итоге получаем автоматически работающую, не тормозящую юзер_код периферию.
Например выхлоп буфера в порт, SPI, UART . Юзер_код заполняет буфер , периферия самостоятельно его выплевывает ...
dosikus, спасибо, поправил!
---------- Post added at 12:21 ---------- Previous post was at 12:20 ----------
Например выхлоп буфера в порт, SPI, UART
Насчет UART.
Как раз его ковыряю.
Без SPL это харакири какой-то...
Насчет UART.
Как раз его ковыряю.
Без SPL это харакири какой-то...
Да ну на .
Не пройдет и получаса как ты другое скажешь .
APBCLK меняешь на свои .
#define APBCLK 48000000UL
#define BAUDRATE 115200UL
void Usart_init (void)
{
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
RCC->APB2ENR|=RCC_APB2ENR_USART1EN;
;
GPIOA->MODER &= ~( GPIO_MODER_MODER10 |GPIO_MODER_MODER9);
GPIOA->MODER |= GPIO_MODER_MODER10_1 |GPIO_MODER_MODER9_1;
GPIOA->AFR[1] |=(7<<(4*1)) |(7<<(4*2));
USART1->BRR =(APBCLK+BAUDRATE/2)/BAUDRATE; //usart
USART1->CR1 |= USART_CR1_TE |USART_CR1_RE; // USART1
USART1->CR1 |= USART_CR1_UE; // USART1
}
void Transmit(uint8_t Data)
{
while(!(USART1->ISR & USART_ISR_TC));
USART1->TDR = Data;
}
---------- Post added at 14:43 ---------- Previous post was at 14:27 ----------
Запустишь, прием устроим на прерываниях..
Эх... поздновато.
Завтра на работе буду проверять.
если честно, ничего не понимаю из того, что вы пишете.
Не боИсь, прорвемся :)
О трудностях смд монтажа ...
Воздушный монтаж на скорую руку .
http://s020.radikal.ru/i710/1404/f4/07349fa96ba8.jpg
http://s020.radikal.ru/i704/1404/a3/7f16b1826eb6.jpg
http://youtu.be/YekS6kWs4PQ
Планшет снимает дерьмово, в жизни все интересней...
#include <stm32f05x.h>
static volatile uint32_t TimingDelay;
static volatile uint32_t TimerCntDN;
static volatile uint32_t TimeOut;
/* Delay & timers */
void SysTick_Handler(void) {
if (TimingDelay) {
TimingDelay--;
}
if (TimerCntDN) {
TimerCntDN--;
}
if (TimeOut) {
TimeOut--;
}
}
void Delay_mS(uint32_t nTime) {
TimingDelay = nTime;
while (TimingDelay);
}
/* main loop */
int main (void)
{
uint16_t i;
SysTick_Config(SystemCoreClock /1000);
RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN;
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
GPIOA->MODER &= ~GPIO_MODER_MODER15|GPIO_MODER_MODER0;
GPIOA->MODER |= GPIO_MODER_MODER15_1 | GPIO_MODER_MODER0_0;
GPIOB->MODER &= ~(GPIO_MODER_MODER3 | GPIO_MODER_MODER10 | GPIO_MODER_MODER11);
GPIOB->MODER |= ( GPIO_MODER_MODER3_1 | GPIO_MODER_MODER10_1 | GPIO_MODER_MODER11_1);
GPIOA->AFR[1] |= (2<<(4*7));
GPIOB->AFR[0] |= (2<<(4*3));
GPIOB->AFR[1] |= (2<<(4*2))|(2<<(4*3));
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR15 | GPIO_OSPEEDER_OSPEEDR0;
GPIOB->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR3 | GPIO_OSPEEDER_OSPEEDR10 | GPIO_OSPEEDER_OSPEEDR11);
TIM2->PSC = 160-1;
TIM2->ARR = 1000-1;
TIM2->CCR1 = 70; // Pulse_Output = ARR - CCR1
TIM2->CCR2 = 30;
TIM2->CCR3 = 10;
TIM2->CCR4 = 5;
TIM2->CCMR1 |=
TIM_CCMR1_OC1M_2 |
TIM_CCMR1_OC1M_1 |
TIM_CCMR1_OC1FE |
TIM_CCMR1_OC2M_2 |
TIM_CCMR1_OC2M_1 |
TIM_CCMR1_OC2FE
; // canell 1-2 PWM Mode1
TIM2->CCMR2 |=
TIM_CCMR2_OC3M_2 |
TIM_CCMR2_OC3M_1 |
TIM_CCMR2_OC3FE |
TIM_CCMR2_OC4M_2 |
TIM_CCMR2_OC4M_1 |
TIM_CCMR2_OC4FE
; // canell 3-4 PWM Mode1
TIM2->CCER |=
TIM_CCER_CC1E |
TIM_CCER_CC2E |
TIM_CCER_CC3E |
TIM_CCER_CC4E
;
//TIM2->BDTR |= TIM_BDTR_MOE;
TIM2->CR1 |= TIM_CR1_CEN;
while(1)
{
for(i=0;i<800;i++)
{
TIM2->CCR1 = i;
Delay_mS(1);
}
for(i=0;i<800;i++)
{
TIM2->CCR2 = i;
Delay_mS(1);
}
for(i=0;i<800;i++)
{
TIM2->CCR3 = i;
Delay_mS(1);
}
for(i=0;i<800;i++)
{
TIM2->CCR4 = i;
Delay_mS(1);
}
for(i=800;i>0;i--)
{
TIM2->CCR1 = i;
Delay_mS(1);
}
for(i=800;i>0;i--)
{
TIM2->CCR2 = i;
Delay_mS(1);
}
for(i=800;i>0;i--)
{
TIM2->CCR3 = i;
Delay_mS(1);
}
for(i=800;i>0;i--)
{
TIM2->CCR4 = i;
Delay_mS(1);
}
}
return 0;
}
Обошлась в 650 руб. сама плата
Так все таки F3 дискаверина или L ?
а мне все никак к uartу не вернуться. На работе всё бегом, а сейчас в ёперный театр меня тащат. Интиллихенты, млин...
Viktor2312, Для твоей борды ссылка на эту тулзу здесь http://www.zx.pk.ru/showpost.php?p=706770&postcount=75
Это скрипт exel для конфигурации тактовой , создает файл system_stm32xx.c . Где xx
лиейка чипов. При смене значения HSE - обязательно править значение HSE и в хэдере stm32xx.h !
Рекомендуется для изучения структуры системы тактирования на первоначальном уровне изучения .4
Я сегодня на работе , дык что до 16.30 спрашивай ...
Если речь идёт об этом:
Угу . Читай о системе тактирования в референс мануале + это http://ziblog.ru/2011/12/07/stm32l-ndash-sistema-taktirovaniya-obzor.html
balu_dark
01.05.2014, 13:56
Досикус приветствую.
Столкнулся тут с необходимостью запуска USB на STM32F20х чипе.
В общем встал вопрос с адекватным запуском прерываний для CDC которые будут класть в FIFO из USB и отправлять из другого буфера в USB.
Интересует именно блоковая передача а на побайтовый прием как в большинстве реализаций. Блоки до 4120 байт. Компилятор обычно юзаю EWARM но думаю что это не существенно особо.
Приветствую!!!!
Я USB рыл только на 103их , да и то только кейловские примеры перелопачивал.
Спроси у Паши http://kazus.ru/forums/showpost.php?p=726904&postcount=134
Он что то подобное творит...
В общим процесс потихоньку идёт... Но, очень медленно.
Быстрей пойдет с железом на руках .
Что из периферии имеется ?
Дисплеи с SPI, USB<->USART, и т.д. ?
Хотя с английскими мануалами пока ничего не получается процент понимания 0,1%, а вот с тем, что на русском описано, пока всё понятно.
Ну будем опираться именно на оригинал . Я буду описывать -как и что искать. Начнем с маленького а там привыкнешь...
Ничего, но там же на плате дисплей есть, он же наверное к микроконтроллеру подключён, если да, то можно будет на нём эксперименты проводить?
Лучше другой дисплей поищи, типа WH1602, или Нокиа-3310.
На демоплате дисплей без контроллера аппаратного, рулится самой СТМ, в реальных проектах ты вряд ли будешь такой применять, он ножек чипа ест огромное количество.
Далее, найди дата-шнурок от какого-нибудь древнего Сименса, типа С55, как адаптер USB<->UART. UART - вообще очень часто используется с МК, один из самых удобных интерфейсов. И первые уроки неспроста делаются именно с UART.
dosikus по-позже, дней через надцать на 9,10, 11 мая, для изучения, буду только рад.
А раньше скорей всего и не получится . До понедельника сваливаю на дачу .:biggrin: А с понедельника - до 8го 100% завал на работе ...:biggrin:
dosikus, про прием по USART успеешь накарябать?
Передачу я настроил по твоей науке :)
---------- Post added 02.05.2014 at 00:20 ---------- Previous post was 01.05.2014 at 23:23 ----------
Собственно, я уже запустил прием на прерываниях.
"Hello, World!" уже погонял в обоих направлениях.
Завтра отчитаюсь на суд знатоков :)
Немножко соберу в кучу информацию о работе с GPIO как портами I/O, без альтернативных функций, на примере пина 7 порта В.
RCC->AHBENR |= RCC_AHBENR_GPIOBEN; - включение порта GPIOB для работы.
GPIOB->MODER &= ~ GPIO_MODER_MODER7; - сброс "поля настроек пина", можно на этом и закончить, если пин будет входом, а если выходом - добавляем еще и следующее:
GPIOB->MODER|= GPIO_MODER_MODER7_0; - режим работы заданного пина как выход общего назначения.
Выбираем режим выхода, push-pull или open-drain.
GPIOB->OTYPER &= ~ GPIO_OTYPER_OT_7; - "очищаем" бит настройки пина, сейчас он стал настроен как push-pull. Если нужно включить режим открытый сток, пишем немножко по-другому -
GPIOB->OTYPER |= GPIO_OTYPER_OT_7;
Настроим пушпул, если требуется.
Сбросим битики, отвечающие за пушпул -
GPIOB->PUPDR &= ~ GPIO_PUPDR_PUPDR7;
Сейчас выставлен режим без подтяжки.
Включаем нужный режим -
GPIOB->PUPDR |= GPIO_PUPDR_PUPDR7_0; - включен пуллап.
или -
GPIOB->PUPDR |= GPIO_PUPDR_PUPDR7_1; - включен пуллдаун.
Осталось выставить скорость работы пина.
Сбрасываем настройки скорости в ноль, при этом скорость станет равна 400Кгц -
GPIOB->OSPEEDR &= ~ GPIO_OSPEEDER_OSPEEDR7;
Теперь можно выставить другую скорость, если нужно -
GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7_0; - 2Мгц.
GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7_1; - 10Мгц.
GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7; - 40Мгц.
Теперь вкратце о подаче 0 или 1 на выход пина.
GPIOB->ODR |= GPIO_ODR_ODR_7; - записываем 1 в бит регистра пина.
GPIOB->ODR &= ~GPIO_ODR_ODR_7; - сбрасываем битик пина, на выходе - 0.
Вариант на эту же тему -
GPIOB->BSRRL = GPIO_BSRR_BS_7; // установить бит 7 PORTB
GPIOB->BSRRH = GPIO_BSRR_BS_7; // сбросить бит 7 PORTB
Чтение уровня на пине, если он настроен как вход -
if (GPIOB->IDR & GPIO_IDR_IDR_7) - как условие в составе IF,
или просто присваивание переменной tmp значения входного пина -
tmp = (GPIOB->IDR & GPIO_IDR_IDR_7);
переменная примет значение 1, если на пине будет 1. Просто, как трактор.
---------- Post added at 14:07 ---------- Previous post was at 14:04 ----------
Виктор, прошу пардону, я там маленько влез в твой первый пост в теме, чтобы добавить немножко ссылок для удобства поиска в этой теме...
Вот хорошие на мой взгляд уроки (http://www.doneathome.ru) для начинающих или пробующих в программирование первые шаги . Только там на меге , но суть не играет , язык то все равно тот же си. К тому же там и видео объяснительно поучительное есть . Мне очень понравились , надеюсь и кому то еще пригодятся .
Dragoos, спасибо, но это не то.
На Меге и я могу уроки писать. СТМ32 - другая кухня...
Как-то у меня по другому выходит
У 32F и 32L есть различия.
У нашей платки на STM32L156 нет определения RCC_APB2ENR_IOPxEN...
Список определений можно подсмотреть в файле stm32l1xx.h
Там есть такое:
#define RCC_AHBENR_GPIOBEN /*!< GPIO port B clock enable */
---------- Post added at 11:30 ---------- Previous post was at 11:29 ----------
И насколько я понимаю, они 16-ти разрядные?
Да, 16-разрядные.
---------- Post added at 11:33 ---------- Previous post was at 11:30 ----------
Жень, а сколько в нашем микроконтроллере портов ввода-вывода?
Я бегло посчитал количество пинов I/O на демоплатке, вышло 45. Точнее можно посмотреть в даташите.
Фишка в том, что у чипа не обязательно порты выведены в полном составе. все 16 бит. Может быть и меньше. Вот, я вижу два вывода порта Н...
Нашёл ещё одну статью
Ага, это то же самое, что я проходил по минному полю несколько дней назад.
Только в статейке не описывается конфигурирование частот, а мы это уже сделали :)
---------- Post added at 20:34 ---------- Previous post was at 20:22 ----------
Вот, кстати, файлик system_stm32l1xx.c (http://yadi.sk/d/baoAS8_ANwbYz) с выставленными частотами 24Мгц от внутреннего генератора и PLL, systick равен 3000.
Это чтобы не париться с настройками клоков, а сразу знать, что мы имеем в проекте.
но для этого мне нужно дождаться плату.
Я тоже так думаю. Нужно предварительно запомнить, что такое шины AHB, APB, что на них висит и "разложить в голове" мнемоники команд на включение этих периферий, про это как раз хорошо написано в приведенной тобой статье.
У меня тоже уже возникает приятное чувство понимания происходящего.
И использовать HSE, и это будет намного стабильнее, чем у HSI с его стабильностью 1% при 25 гр. С.
Согласен, но только со стабильностью. С остальным - нет.
Аргументы - а зачем нам высокая стабильность? Часы делать на этом генераторе мы не будем, синтезом четких времянок типа видеосигнала - тоже заниматься не будем (пока). Поэтому смысла во внешнем кварце пока не вижу... А качество таймингов HSI вполне применимы для 99% применений. Это мое мнение :)
Это тоже не понял, какие 3000,
Виктор, еще раз посмотри визуальный построитель в Экселе.
Я использую HSI, 16Мгц, далее сигнал идет на PLL, где он умножается на 3 (получаем те же 48Мгц) и делим на 2, получаем 24Мгц. Эта частота уже расходится по АНВ (ядро, порты) и по АРВ1-2 (таймеры, RS-232, IIC...), а также через делитель на 8 создается клок 24000000/8=3000 кГц для системного таймера systick, который не периферийный таймер, а просто "тикалка", типа МультиМедиаТаймера для Винды, он удобен своей простотой для отсчета времянок внутри программы, например, для функции задержки выполнения программы. Я вкратце упоминал уже про него. Но пока не заморачивайся на нем.
---------- Post added at 22:03 ---------- Previous post was at 22:01 ----------
А я сейчас прицепляю индикатор WH1602 к демоплате.
Накопал библиотеку для работы с этим дисплейчиком, слегка перелопатил код для нашего примения и нашего чипа, сижу, паяю проводки :)
---------- Post added at 22:26 ---------- Previous post was at 22:03 ----------
Вот единственное с командами, какими это всё сделать, я пока не разобрался, в синтаксис этого Си не въезжаю, откуда вот эти все & ~ берутся, мне не понятно, пока.
Сейчас попробую это развернуто объяснить. Сначала это вызывает ступор, но потом привыкаешь и щелкаешь как двоичную арифметику. Пишу...
---------- Post added at 22:43 ---------- Previous post was at 22:26 ----------
Напишу на примере привычного байтового 8-битного представления. Просто для лёгкости и ради привычности.
Придумаем свою команду, похожую по синтаксису на СТМ32-овскую.
GPIOB->PORT |= PIN_6 | PIN_7;
Похоже? :)
Разбираем.
Порт В имеет свой адрес, число. Его "функция" PORT - это содержимое этого порта.
После включения питания на чип он как правило имеет во всех разрядах нули.
Т.е., GPIOB->PORT равно 0х00000000.
Заранее описанные мнемоники PIN_6 и PIN_7 - это просто числа... Можно посмотреть их значение в файлах типа stm32lxx.h.
Но у нас своя, выдуманная мнемоника.
Будет логичным присвоить значения 0х01000000 для PIN_6 и 0х10000000 для PIN_7.
Для восьмибитного порта это единички в соответствующих разрядах.
Дальше пошла обычная двоичная арифметика.
Что произойдет после выполнения описанной выше команды?
К содержимому порта (0х00000000) будет арифметическое ИЛИ двух чисел:
0х00000000
0х10000000
0х01000000
-----------
0х11000000 - результат. Т.е., на пинах 6 и 7 порта появятся единички.
Теперь, нам нужно "погасить" единичку в разряде 7, к примеру.
Как нам это сделать, не затронув прочие биты порта?
В языке С принято делать так - берем значение всего порта, и логическим И сбрасываем нужный битик.
Выглядит это так:
GPIOB->PORT &= ~PIN_7;
Т.е., мы берем ту же мнемонику PIN_7, инвертируем ее (значок ~), и делаем побитовое И с содержимым порта.
По шагам:
0х10000000
инвертируем командой ~
0х01111111
и делаем И с содержимым порта:
0х11000000 - порт
0х01111111 - инвертированное PIN_7
-----------
0х01000000 - результат. Бит 7 погашен, бит 6 остался, что нам и требовалось.
Просто хочется поэкспериментировать со временем и с внешним резонатором.
Я почему-то думаю, что часы мы обязательно сделаем, одним из первых проектов. просто так принято в мире микроконтроллеров, сначала часы и термометр, затем всё остальное :)
Собственно, я уже запустил прием на прерываниях.
"Hello, World!" уже погонял в обоих направлениях.
Завтра отчитаюсь на суд знатоков :)
Нужен еще пример?
---------- Post added at 12:12 ---------- Previous post was at 11:49 ----------
Теперь вкратце о подаче 0 или 1 на выход пина.
GPIOB->ODR |= GPIO_ODR_ODR_7; - записываем 1 в бит регистра пина.
GPIOB->ODR &= ~GPIO_ODR_ODR_7; - сбрасываем битик пина, на выходе - 0.
Все хорошо но эти операции не атомарные да и ЧМЗ же .
Для атомарных операций с портами GPIO есть регистр GPIOx_BSRR
6.3.5 I/O data bitwise handling
The bit set reset register (GPIOx_BSRR) is a 32-bit register which allows the application to
set and reset each individual bit in the outputdata register (GPIOx_ODR). The bit set reset
register has twice the size of GPIOx_ODR.
To each bit in GPIOx_ODR, correspond two control bits in GPIOx_BSRR: BSRR(i) and
BSRR(i+SIZE). When written to 1, bit BSRR(i) setsthe corresponding ODR(i) bit. When
written to 1, bit BSRR(i+SIZE) resetsthe ODR(i) corresponding bit.
Writing any bit to 0 in GPIOx_BSRR does not have any effect on the corresponding bit in
GPIOx_ODR. If there is an attempt to bothset and reset a bit in GPIOx_BSRR, the set
action takes priority.
Using the GPIOx_BSRR register to change the values of individual bits in GPIOx_ODR is a
“one-shot” effect that does not lock the GPIOx_ODR bits. The GPIOx_ODR bits can always
be accessed directly. The GPIOx_BSRR register provides a way of performing atomic
bitwise handling.
There is no need for the software to disable interrupts when programming the GPIOx_ODR
at bit level: it is possible to modify one or more bits in a single atomic AHB write access.
Логически разделен на два 16 битных . Запись 1 в младший устанавливает соответствующий бит в порту, запись в старший сбрасывает .
GPIOA->BSRRL = GPIO_BSRR_BS_0; // установить бит 0 PORTA
GPIOA->BSRRH =GPIO_BSRR_BS_0; // сбросить бит 0 PORTA
---------- Post added at 13:12 ---------- Previous post was at 12:12 ----------
Я почему-то думаю, что часы мы обязательно сделаем, одним из первых проектов. просто так принято в мире микроконтроллеров, сначала часы и термометр, затем всё остальное :)
Часики (RTC) + или набортный LCD или LED дисплей -
аппаратный драйвер LED описан здесь http://kazus.ru/forums/showpost.php?p=710395&postcount=8
с автоматической коррекцией разнояркости сегментов .
Либо здесь попроще http://kazus.ru/forums/showpost.php?p=651729&postcount=3239
Или любой дисплей с SPI (от сотовых) .
Для термодатчиков (1wire) пользуем USART .
а, если не секрет, почему L-ку выбрали изначально? А не F-ку какую-нить, там 207-407? И девборда под 407 поинтереснее будет...
Или любой дисплей с SPI (от сотовых) .
Не будем нарушать традиции :)
http://img-fotki.yandex.ru/get/5214/79278654.0/0_107853_4a6285ad_L
---------- Post added at 13:36 ---------- Previous post was at 13:33 ----------
а, если не секрет, почему L-ку выбрали изначально?
Начали с тем, что было в наличии.
---------- Post added at 13:37 ---------- Previous post was at 13:36 ----------
Нужен еще пример?
Да, конечно.
Запустить-то я запустил, но интересен правильный метод.
---------- Post added at 13:38 ---------- Previous post was at 13:37 ----------
Все хорошо но эти операции не атомарные да и ЧМЗ же .
Для атомарных операций с портами GPIO есть регистр GPIOx_BSRR
Разъясни пожалуйста "на пальцах", что такое атомарная операция?
Разъясни пожалуйста "на пальцах", что такое атомарная операция?
http://ru.wikipedia.org/wiki/%D0%90%D1%82%D0%BE%D0%BC%D0%B0%D1%80%D0%BD%D0%B0%D 1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1 %8F
Есть еще Bit Banding http://eugenemcu.ru/publ/13-1-0-77
http://ru.wikipedia.org/wiki/%D0%90%...86%D0%B8%D1%8F
Убиться тапком....
По рузски это можно озвучить так, что атомарная операция блокирует используемый ресурс на время своего выполнения, дабы прочие процессы не лезли туда же со своими хотелками?
---------- Post added at 14:12 ---------- Previous post was at 14:07 ----------
Для атомарных операций с портами GPIO есть регистр GPIOx_BSRR
Внес исправление в сообщение о GPIO, спасибо!
Да, конечно.
Запустить-то я запустил, но интересен правильный метод.
Доберусь завтра до железа ...
dosikus, еще хотелось бы прояснить вопрос об альтернативных функциях.
Например, включение SPI и IIC на пины.
Вижу, что для этого используется регистр AFR, но почему 0 или 1, и каким образом выбрать именно нужную функцию из возможных.
Сейчас изображу ...
Например для USART .
Идем на раздел 4 Pin descriptions даташита .
Смотрим таблицу 9 Table 9. Alternate function input/output
Ищем необходимую нам АФ . Смотрим на каких пинах висит и значение АФ .
В нашем случае это пины PA9 и P10 и значение АФ для обоих AFIO7 .
http://i055.radikal.ru/1405/83/dd87e6b6ab4b.png
Идем в референсе мануал.
6.4.9 GPIO alternate function low register (GPIOx_AFRL) (x = A..H)
и
6.4.10 GPIO alternate function high register (GPIOx_AFRH) (x = A..H)
Два 32х битных регистра . По 4бита на каждый пин .
Определены в хэдере как массив .
__IO uint16_t BSRRH; /*!< GPIO port bit set/reset high registerBSRR, Address offset: 0x1A */
__IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */
__IO uint32_t AFR[2]; /*!< GPIO alternate function low register, Address offset: 0x20-0x24 */
__IO uint16_t BRR; /*!< GPIO bit reset register, Address offset: 0x28 */
uint16_t RESERVED3; /*!< Reserved, 0x2A */
} GPIO_TypeDef;
В итоге нам нужно в регистр GPIOA_AFRH, в позиции AFRH10 и AFRH9 занести значения AFIO7 (0x07).
и получаем :
GPIOA->AFR[1] |= (7<<(4*2)) |(7<<(4*1));
http://s004.radikal.ru/i206/1405/bf/52eb972d3aa9.png
---------- Post added at 15:26 ---------- Previous post was at 14:44 ----------
Для SPI1 :
пины PA5-PA7 , AFIO5 .
или
пины PB3-PB5 , AFIO5
NSS не трогаю ибо толку от него 0 ...
---------- Post added at 15:30 ---------- Previous post was at 15:26 ----------
В конструкции
GPIOA->AFR[1] |= (7<<(4*2)) |(7<<(4*1));
семерки - значение АФ .
двойка и единица - порядковые номера пинов , если разделить 16битный порт на два 8ми битных...
В конструкции
Да, вот именно тут я уже минут пять и зависаю, пытаюсь логически объяснить себе ускользающую суть...
Ewgeny7,
Суть - сдвигаем значение АФ на позицию пина, а позиция кратна 4ке ...
Здесь проще магическими числами заляпать .
Суть - сдвигаем значение АФ на позицию пина, а позиция кратна 4ке ...
Я так и обозначил для себя эту формулу, чтобы упростить жизнь. 4 - размер "декады", 1 или 2 - номер пина (начиная с нуля), 7 - значение, которое пишем туда.
---------- Post added at 16:39 ---------- Previous post was at 16:31 ----------
Сюда (http://yadi.sk/d/dBNeg-vhNzvhK) я залил библиотеку для WH1602.
Она настроена для STM32L152, но можно заточить под другие камни, даже АВР.
Настройки, оставленные по дефолту -
PORTB10..15, RS,E,D4,D5,D6,D7
Клок - 16Мгц.
В инклюдах головного добавляем - mac.h и hd44780.h.
Пины порта инициализируются при lcd_init(), дополнительно прописывать не надо.
Инструкция и источник - http://makesystem.net/?p=2128
Ewgeny7,
typedef unsigned char int8u_t;
typedef signed char int8s_t;
typedef unsigned short int16u_t;
typedef signed short int16s_t;
typedef unsigned long int32u_t;
typedef signed long int32s_t;
Лучше придерживаться стандартных уже :
int8_t;
int16_t;
int32_t;
int64_t;
uint8_t;
uint16_t;
uint32_t;
uint64_t;
Keil их знает . И определены они в <stdint.h>.
Угловые скобки для поиска в системных директориях компилятора.
Лучше придерживаться стандартных уже
Это не я писал, но раз Кейл их проглотил, значит можно пока не заморачиваться :)
Добавляем в инит USART'а :
USART1->CR1 |= USART_CR1_TE |USART_CR1_RE|USART_CR1_RXNEIE; //
NVIC_SetPriority(USART1_IRQn, 0);
NVIC_EnableIRQ(USART1_IRQn);
USART_CR1_RXNEIE разрешение прерывание от приемника.
NVIC_SetPriority() установка приоритета прерывания
NVIC_EnableIRQ() разрешение прерывания , в нашем случае от USART1
Эти функции входят в CMSIS-CORE, так что не SPL.
Описываем обработчик (хэндлер) прерывания от USART1 .
void USART1_IRQHandler(void)
{
uint8_t buff;
if(USART1->SR & USART_SR_RXNE)
{
buff = (uint8_t)(USART1->DR); /* Receive data, clear flag */
}
}
Для отладки можно копировать переменную buff в глобальную переменную , и добавить эту глобальную переменную в Watch ...
dosikus, а случаем на сталкивался с каскадированием таймеров применительно к F100, F101?
---------- Post added at 12:01 ---------- Previous post was at 11:58 ----------
И какую макс. частоту можно подавать на внешнее тактирование таймера?
alx32, В 100 и 101 ХЗ , а на 103ем частотомер на 150МГц изобразили :)
И ограничилось все ленью...
Собственно ноги растут отсюда http://radiokot.ru/forum/viewtopic.php?f=59&t=75552&hilit=%D1%87%D0%B0%D1%81%D1%82%D0%BE%D1%82%D0%BE%D 0%BC%D0%B5%D1%80&start=20
http://radiokot.ru/forum/viewtopic.php?f=59&t=102175&hilit=%D1%87%D0%B0%D1%81%D1%82%D0%BE%D1%82%D0%BE%D 0%BC%D0%B5%D1%80&start=20
см. Посты HHIMERA, все остальное вода...
Добавляем в инит USART'а
Спасибо!
Я примерно так всё и сделал, только приоритет не выставлял.
А если используется несколько прерываний, то последнее объявление с нулевым приоритетом "сдвигает" все остальные вниз?
Наковырявшись с пинами досыта, прописал это -
#define EN(x,y) ((x)->BSRRL = 1<<(y))
#define DIS(x,y) ((x)->BSRRH = 1<<(y))
и сразу стало просторнее в коде :)
А также вынес модули инициализации RCC, USART, TIM2 в отдельные файлики-хэдеры, стало совсем хорошо.
Не знаю, как правильно именно в Keil, я короткие (в одну строку) пишу так:
// настроим порт на вывод
А большие, в несколько строк, так:
/*
Однажды в студеную зимнюю пору
Я из лесу вышел
*/
Перелопатил библиотеку для дисплейчика Нокиа-3310.
Была для STM8 IAR, стала для STM32 Keil :)
http://img-fotki.yandex.ru/get/5406/79278654.0/0_108965_2f39dbbd_L
Всё чудесно, но теперь надо побороть кириллицу в самом Кейле, тогда и русские шрифты появятся на дисплее.
Ewgeny7, Функции выхлопа SPI в студию...
Keil прекрасно лечиться , главное юникод не заюзать ...
http://i056.radikal.ru/1405/99/d20fdfb81e11.png
Функции выхлопа SPI в студию...
Софтверное ногодрыжество. Чуть позже всю либу выложу, как причешу ее.
Собственно, посыл байта выглядит так -
static void LcdVSPI (byte data ) {
unsigned int i;
unsigned char tmp;
for(i = 0; i< 8; i++, data = data << 1){
tmp=(data & 0x80);
if (tmp==0x80) SET_LCD_PIN(LCD_PORT,LCD_SDIN_PIN);
else RESET_LCD_PIN(LCD_PORT,LCD_SDIN_PIN);
SET_LCD_PIN(LCD_PORT,LCD_SCLK_PIN);
RESET_LCD_PIN(LCD_PORT,LCD_SCLK_PIN);
}
}
Можно пооптимизировать при желании, но там вообще можно код полопатить по-взрослому...
Ewgeny7, Отчего не SPI железный?
Отчего не SPI железный?
Вот честно, не люблю... Я предпочитаю сам выбирать лапы для периферии...
Кейл пачинил :)
http://img-fotki.yandex.ru/get/5311/79278654.0/0_108986_684a20c3_L
---------- Post added at 12:47 ---------- Previous post was at 12:37 ----------
Вот честно, не люблю...
Одно дело - пульнуть в железный ЮАРТ байтик и забыть про него, а рулить дисплеем - по-любому ресурсоемкое занятие, здесь железяка существенного выигрыша не даст.
Вот честно, не люблю... Я предпочитаю сам выбирать лапы для периферии...
А скорость выхлопа не любишь ? :biggrin:
Я на F0 на 24МГц выплевываю буфер экрана целиком , правда на 9бит SPI ,
зато непрерывным потоком . Без зазоров между байтами и без дерганья CS ...
Инит всего SPI
SPI1->CR1 |=
SPI_CR1_BR_0 | //
SPI_CR1_MSTR |
SPI_CR1_SSI |
SPI_CR1_SSM
;
SPI1->CR2 = 0x800; // 9 bit
SPI1->CR1 |= SPI_CR1_SPE;
Выхлоп буфера.
void Fill_image(void)
{
uint16_t i;
Gotoxy( 0,0);
for (i=0;i<LCD_MEM_SIZE;i++)
{
while(!(SPI1->SR & SPI_SR_TXE));
SPI1->DR =gImage_cat[i]|0x100;
}
С DMA еще прикольней будет ... :biggrin:
А скорость выхлопа не любишь ?
Не СкайНет запускаю, однако! :)
Одно дело - пульнуть в железный ЮАРТ байтик и забыть про него, а рулить дисплеем - по-любому ресурсоемкое занятие, здесь железяка существенного выигрыша не даст.
Ошибаешься , еще как даст .:biggrin:
правда на 9бит SPI
Это с чем-то связано?
---------- Post added at 12:58 ---------- Previous post was at 12:57 ----------
Ошибаешься , еще как даст
Попробую железный вариант :)
Это с чем-то связано?
Это нокиа 1200 и подобные . У него бит управления DС - data/command впихан в сам SPI - 9м битом .
С одной стороны меньше пинов , с другой геморрой с SPI на различных чипах . А на F0 и у тех где новая периферия, SPI с фреймом от 4х до 16 бит...
А на F0 и у тех где новая периферия, SPI с фреймом от 4х до 16 бит...
Угу, на L152 фрейм только 8 или 16 бит...
http://s43.radikal.ru/i101/1405/9f/f863823021ef.jpg
http://s006.radikal.ru/i213/1405/31/a4cf4f4ac809.jpg
dosikus, суровый ярославский разъем с крепежом! :)
Гы... Это у меня еще с прототипов на пЫк . Там тройники отводы для подсоединения ЛА .
Супер клей + китайские сопли - творят чудеса .:biggrin:
Зато оперативно .:biggrin:
И мы так можем :)
http://img-fotki.yandex.ru/get/6104/79278654.0/0_10898a_71ee1976_L
---------- Post added at 14:01 ---------- Previous post was at 13:30 ----------
В общем, вот файлы библиотеки для 3310 (http://yadi.sk/d/iyQm2B0FQ5PJt), которые я замучил.
Не пинаться, я только маленько поковырял его.
Для работы включаем нужный порт
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
В хедере n3310.h прописываем номера пинов и сам порт.
Работа с либой проста до безобразия.
LcdInit();
LcdClear();
//LcdStr(FONT_1X,"Привет,Виктор!");
//LcdStr(FONT_1X,"Скоро платка приедет?");
LcdImage(Picture);
LcdUpdate();
---------- Post added at 14:03 ---------- Previous post was at 14:01 ----------
Само картинко (или текст) рисуются в буфере, который по команде LcdUpdate() перекидывается на сам дисплейчик. Практически, DirectX 2D получается :)
Само картинко (или текст) рисуются в буфере, который по команде LcdUpdate() перекидывается на сам дисплейчик.
Вот про что я и говорил - буфер через DMA -> SPI, аппаратно или по пинку или по таймеру ...
До DMA мне еще дорасти нужно :)
Будет, но попозже...
А я тут переношу тестер мелкологики на эту демоплатку. С дисплеем от нокии, конечно :)
balu_dark
20.05.2014, 22:32
Надеюсь к мелкологике - добавится и тестер полупроводников ? :)
но вот реализация, зависит от Ewgeny7
Маленько отвлекся пока на железный SD-ридер для ЮТ-88, но размышляю на досуге.
---------- Post added at 14:14 ---------- Previous post was at 14:01 ----------
добавится и тестер полупроводников ?
По какому принципу?
Сунул неведому детальку - получил ответ диод/транзистор/анод/катод/эмиттер... ?
---------- Post added at 14:23 ---------- Previous post was at 14:14 ----------
пока только строение ядра Corex-M3 почитываю/изучаю
А зачем? Я вот почти и не знаю о нем ничего...
Для того язык С и нужен, чтобы максимально абстрагироваться от ядра.
А зачем? Я вот почти и не знаю о нем ничего...
Для того язык С и нужен, чтобы максимально абстрагироваться от ядра.
Лучше периферию изучал бы.
Ядро конечно так же пригодится, но потом . Например прерывания...
balu_dark
22.05.2014, 15:10
По какому принципу?
Сунул неведому детальку - получил ответ диод/транзистор/анод/катод/эмиттер... ?
Именно ! там на каждом канале добавлялось по 2 резистора и вход юзался.
Теория и практика в "АВР транзистор тестер" ищется.
тем более что у стмки больше ацпшных входов.
кстати - такой принцип можно вполне использовать для детектирования питающих и земляных пинов на микросхемках. но желательно еще добавлять полевики для подачи нормальных +5 и земли на заданные выводц.
Но это уже реализуется путем добавления CPLD например альтера MAX и кучи smd полевиков. Но в таком разе - наши брюки уже плавно превращаются в TL866 программер ( если не путаю модель).
превращаются в TL866 программер ( если не путаю модель).
Угу . Имею. Как прошивальщик флэшек и ROM , вроде ничего.
Как проггер AVR,PIC , тестер логики - имеет массу глюков ...
balu_dark, я так понял, что всё это делать не буду. Только то, что будет интересно :)
Ткните носом, в конкретный документ, буду изучать его.
Я же просил - не надо меня на "вы" ... :biggrin:
А читать для 152L - Reference manual, datashet и errata.
http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1295/LN962/PF259947#
DS9515: Ultra-low-power 32-bit MCU ARM®-based Cortex®-M3
RM0038: STM32L100xx, STM32L151xx, STM32L152xx and STM32L162xx advanced ARM-based 32-bit MCUs
ES0224: STM32L100x6/8/B-A STM32L151x6/8/B-A and STM32L152x6/8/B-A Ultra-Low power MCU limitations
AN3216: Getting started with STM32L1xxx hardware development
Читать и задавать здесь вопросы . Например - что такое DMA и как с помощью его облегчить свою участь... :biggrin:
И в помощь http://ziblog.ru/category/mikrokontrolleryi/stm32/stm32l1
balu_dark
22.05.2014, 21:35
balu_dark, я так понял, что всё это делать не буду. Только то, что будет интересно :)
А я и не заставляю ;) -пистолет , не наставляю ;)
Неправильная фотка .:biggrin:
Блистер в мусорку , дискаверину подключить и тыкать по слайдеру .:biggrin:
Viktor2312, слайдер это нарисованная фиговина в виде треугольника в самом низу дискаверины . :biggrin:
Она кстати подписана - SLIDER .
Можешь не тыкать а плавно двигать по нему пальцем .
Гы ... я думал ты поймешь - плату включи , по управляй и тогда фоткай.
От электроники в упаковке толку мало ... :biggrin:
Ага. Поигравшись, выдирай нафиг этот дисплей и убирай его на дальнюю полку :)
Viktor2312, Здесь вся документация на твою борду http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/PF250990
Конкретно UM1079: STM32L1 discovery kits: STM32L-DISCOVERY and 32L152CDISCOVERY
Там и схема и описание - что для чего ...
Not fitted - не установлены
http://s020.radikal.ru/i710/1405/38/dc57feab5e1c.png
Чисто С, без всяких плюсов. Плюсы в эмбедде для извращенцев и выходцев с PC кодинга . Что одно и то же ...
А так же все эти абра-кадабры которые тут выше выкладывались
Ты спрашивай что тебе не понятно ...
Так правильнее фотка будет:
Ой, у меня такая же шняжка есть. Только в первый же день прошил в неё что-то незапускающееся :) Теперь чисто как SWD-программатор использую.
---------- Post added at 12:09 ---------- Previous post was at 12:06 ----------
Чисто С, без всяких плюсов. Плюсы в эмбедде для извращенцев и выходцев с PC кодинга . Что одно и то же ...
Десять лет назад ровно теми же словами говорили про асм vs си :)
Что мешает прошить, что-то, запускающееся.
Незачем. В качестве программатора оно мне пока намного полезней, в денежном плане.
Изучая сейчас Си, вижу сразу указания, чем отличается то или иное действие в С++, пока отличия не значительные,
Оно ничем не должно отличаться, любая, по-моему, программа на Си может быть скомпилирована плюсовым компилятором. Плюсы удобны для больших (реально больших) программ. Полиморфизм там, наследование, вот это всё.
Плюсы удобны для больших (реально больших) программ. Полиморфизм там, наследование, вот это всё.
Но только не в DIY эмбедде , здесь оно излишество и развращает .
Не, если вы избираете хомячковый путь ITшника , засевшего на ардунью , тогда - ради бога ... :biggrin:
Демку залитую в дискаверину легко как и слить STM32 Utility, так и скомпилить из примеров для этой дискаверины.
Только оно не нужно , смело можно вытирать...
---------- Post added at 11:19 ---------- Previous post was at 11:13 ----------
Десять лет назад ровно теми же словами говорили про асм vs си :)
Не поверишь , есть адепты асма пытающиеся и для ARM писать .
В основном выходцы с AVR . :biggrin:
Я не знаю где ты подобный бред взял ...
Во первых читай что такое глобальные и локальные переменные - это для тебя сейчас намного важней .
Во вторых старайся давать имена переменным осмысленные и читаемые.
Чтобы выразить саму суть переменной.
Только ради бога не транслитом,
пример :
knopka
podgotovka
zaderjka
и т.д. и т.п.
Подобного НЕ НАДО !
Есть правила , их и придерживайся .
Здесь есть масса полезного http://www.pic24.ru/doku.php/osa/articles/encoding_without_errors
SpecialistMK87
01.06.2014, 18:18
Только ради бога не транслитом,
пример :
knopka
podgotovka
zaderjka
и т.д. и т.п.
Подобного НЕ НАДО !
лучше уж транслит чем безграмотный английский или выдуманные на ходу загадочные аббревиатуры)))
zaderjka - круто, надо заменить глупые нерусские delay() на zaderjka(),
пусть даже набирать больше, зато как ни у кого
Насчёт АСМа, как-то баловался им на самодельной отладке со 101-м камнем и подключенным к ней tft-дисплеем 480*272. Полностью написал инициализацию pll, периферии и дисплея на асме... В общем-то не так и сложно, единственно не хватает макросов типа hi16 low16 для инструкций movw и movt, хотя можно грузить данные в регистры косвенно по рс...
Подскажите по USB CDC.
Имею STM32F4-discovery, EWARM и т.д.
Скачал пример USB CDC. Всё нормально работает, но есть один ньюанс:
при рестарте платы (или кнопкой ресет, или download) естественно USB device "уходит" и снова "приходит". Но забава в том, что если я перед этим в терминалке не отключился от COM порта, то переподключится к нему не могу ("не могу найти COMx"). И далее чтобы таки COM стал находится надо от него отключиться и сделать еще один ресет. Если же я сначала в терминалке отключаюсь от COM порта, потом делают ресет платы, то никаких проблем с подключением нет.
Подозреваю что это настолько глючный драйвер виртуального COM порта под Win8.1 Pro x64.
Что посоветуете?
dosikus, вернемся к нашим баранам? :)
Ты не пробовал железное USB запускать на STM32?
Ewgeny7, На 103'ем HID . Но надо было пуллап отключемым делать.
Надо так же со дискрипторами разбираться , а времени не было . Сейчас в плотную попробую .
К тому же USB от MidleWare, а это всяко не SPL .
Если у тебя Keil ставь пак от MidleWare , документация присутствует ...
Гы... Я так понимаю Виктор слился , и из модераторов так же ?:biggrin:
Виктор "во всем разобрался", а я вот пока нет, продолжаю учиться :)
Сейчас мучаю STM32L152RBT6 на предмет виртуального USB-COM.
Нарыл даже готовый проект под этот камень, правда он почему-то не работает. Да и уже нашел ошибку в проекте. Но как база для ковырятельств вполне пригоден.
---------- Post added at 09:56 ---------- Previous post was at 08:43 ----------
Проект запустился после доработки напильником.
Вот он (https://yadi.sk/d/8fqJBsSFcQEdY), для борды STM32L-DISCOVERY.
Теперь буду препарировать его для понимания сути происходящего.
Автор оригинала - mspartak с изиэлектроникса.
У меня нет L'ок , так что облом...
У меня нет L'ок , так что облом...
Я жду на днях с тиксера STM32F105 с USB_OTG. Вот с ней и будут основные танцы с бубном.
dosikus, это вот что за порнография в кейле, где скачан мидлеваре?
.\Output\Keyboard.axf: Error: L9937E: MDK-Pro middleware is not allowed with this license
А ты кейген применял вообще ? :))))))))
Кстати все примеры в Keil работают пока только с CMSIS 3.20.4 и MiddleWare 5.15 ,
в то время как менагер паков упорно навязывает новые ...
А ты кейген применял вообще ? )))))))
Ага, лопуха словил :)
Приехала STM32F105RB, завтра буду забирать и платку лутить.
Замутил "эмулятор PS/2-клавиатуры" на эстээмке :)
Будет как часть планируемого проекта.
Ютуб (http://www.youtube.com/watch?v=JHInDv3tzH4&feature=youtu.be)
---------- Post added at 22:42 ---------- Previous post was at 22:29 ----------
Подумалось. а если к СТМ привинтить механическую клаву... То получится раритетная 40 или 60-кнопочная PS/2-клавиатура для современных клонов со встроенным контроллером :)
Ewgeny7, Я пока терзаю 1wire ...
А как обмениваться информацией между микроконтроллером и какой-нибудь своей консольной программой на компьютере через отладочный интерфейс SWD?
А как обмениваться информацией между микроконтроллером и какой-нибудь своей консольной программой на компьютере через отладочный интерфейс SWD?
На крайний случай можно почитать исходники openocd.
Не на USART случаем?
Не, USART банально и пошло . На таймерах и DMA ...
---------- Post added at 18:23 ---------- Previous post was at 18:19 ----------
А как обмениваться информацией между микроконтроллером и какой-нибудь своей консольной программой на компьютере через отладочный интерфейс SWD?
Eltaron, если я правильно понимаю - речь о SWO , а не о том как дебажить .
Терминалы SWO есть и STLink utility и в софте JLink .
Соединить соотвествующий пин чипа с пином отладчика.
И далее -
http://kazus.ru/forums/showpost.php?p=709622&postcount=5
если я правильно понимаю - речь о SWO , а не о том как дебажить .
Да, точно, это SWO.
Это есть в ST-Link'е?
И какая примерно пропускная способность этого интерфейса?
Titus, В STLink v 2 должна быть , но я пользовал только JLink .
На халявном JLink скорость низкая , большой поток не пропустить.
На STLink думается или так же или хуже .
Мне хватало для вывода дебаг сообщений ...
Сделал двусторонний ЛУТ для девбординки на STM32F105RB, с USB-OTG:
http://savepic.org/6396204.png
http://savepic.org/6389036.jpg
Ничего особенного, но это всегда приятно собирать и запускать :)
А полигончик-то, хоть небольшой, но надо было под пузом сделать. Я, когда-то, примерно такую плату для LPC2104 делал, так она глючила и ловила наводки, не то что при касании, а при простом приближении руки к плате... С тех пор на всех платах, с ARM-ом на борту, стараюсь землю по максимуму делать...
alx32, + 100500
Да,да - оставляю низ целиком землей ..
А полигончик-то, хоть небольшой, но надо было под пузом сделать. Я, когда-то, примерно такую плату для LPC2104 делал, так она глючила и ловила наводки, не то что при касании, а при простом приближении руки к плате... С тех пор на всех платах, с ARM-ом на борту, стараюсь землю по максимуму делать...
Не с чего глючить подобному чипу от микроскопических наводок. Одно дело, если анализируется аналоговый сигнал какой, или же повесили в воздухе ножки, вот они и переключаются.
balu_dark
03.11.2014, 12:01
Евгений - а файлик платы - мона положить? И схемы наверно тоже.
А полигончик-то, хоть небольшой, но надо было под пузом сделать.
А что, существующего недостаточно? :)
http://savepic.org/6364307.png
---------- Post added at 22:29 ---------- Previous post was at 22:25 ----------
а файлик платы - мона положить?
Воть (https://yadi.sk/d/Y53TvQMucUJ8V).
---------- Post added at 22:34 ---------- Previous post was at 22:29 ----------
И схемы наверно тоже.
Ээээ..... ммммм.... Нету схемы....
Кварц - 16Мгц.
Конденсаторы к нему - 22пф.
Кондёры по питанию - 0,1мкф.
Подтяжка NRESET - 10к.
Резисторы на светики - 200е
Светики - SMD, 2 шт, красные (двухвольтовые)
Тактовая кнопка
Стаб линейный LM1117 3.3в.
Резисторы на USB (DP и DM) - по 27е.
Ну и резисторы-нулевички на "заземление" разъемов (можно тупо провести дорожки).
Евгений - а файлик платы - мона положить? И схемы наверно тоже.
Если что , минимальная схема, подходящая для квикстарта, есть в Getting started ...
http://www.st.com/web/en/resource/technical/document/application_note/CD00273528.pdf
Спасибо, жаль, раньше не видел.
Но я делал по аналогии с девбордой 32L-Discovery, просто убрал лишнее.
balu_dark
04.11.2014, 00:50
Если что , минимальная схема, подходящая для квикстарта, есть в Getting started ...
http://www.st.com/web/en/resource/technical/document/application_note/CD00273528.pdf
Да все это отлично конечно - но для утюга не подходит :)
Минимальную схему то можно из даташита вытянуть. Лениво ее разрисовывать в кадах.
Просто хотел поиметь простейшую схемку уже кем то намастряченную под 105/107 но переделать ее под Device а не под Host.
Есть желание покувыркаться с собственной реализацией USB SPI\I2C flash programmer.
balu_dark, http://forum.chipmk.ru/index.php/topic/457-%D0%B4%D0%B5%D0%BC%D0%BE-%D0%BF%D0%BB%D0%B0%D1%82%D0%BA%D0%B0-%D0%BD%D0%B0-stm32f1xx-48-pin/
balu_dark, кстати в тему http://kazus.ru/forums/showthread.php?t=109336
на сей платке HID запустили ...
balu_dark
04.11.2014, 22:09
balu_dark, кстати в тему http://kazus.ru/forums/showthread.php?t=109336
на сей платке HID запустили ...
Блин - предупреждать же надо!
Такие топики нужно изрядно подготовленным читать. минимум грамм на 200 чего либо около 40%. Чуть мозг не сломал, но поржал.
За два дня чуть крышу не сорвало с этим USB HOST....
Перебираю проекты, читаю даташиты...
Как оказалось, STM105/107 вообще отличаются от STM32F10x в некоторых вопросах, и под них надо дополнительно переучиваться.
Сейчас мучаю готовый проект из состава библиотеки STM32_USB-Host-Device_Lib_V2.1.0. Пока не взлетело, но истина где-то рядом.
Главное - это увлекательнейшее занятие, меня никак не могут спать загнать :)
---------- Post added at 23:44 ---------- Previous post was at 23:41 ----------
Огорчило, что под это семейство нет экселевского визуального Клок Конфигуратора.
Приходится "на пальцах" идти по старт-ап коду....
---------- Post added at 23:45 ---------- Previous post was at 23:44 ----------
Количество PLL в этих чипах тоже "порадовало", поубивал бы :)
---------- Post added at 23:49 ---------- Previous post was at 23:45 ----------
но переделать ее под Device а не под Host
Резистор подтяжки добавить на DM на моей платке...
---------- Post added at 23:51 ---------- Previous post was at 23:49 ----------
Кварц - 16Мгц.
Заменил на 25МГц, как реальный на реальной борде с этим камнем.
balu_dark
05.11.2014, 02:17
я про гнездо. А подтяжку хочу на транзистор повесить для пере конфигурации без дерганья девайса из кабеля.
Платка работает.
Определяются разные флешки, СТ-линки, даже USB-Blaster. Но упорно не видятся клавиатуры...
balu_dark
05.11.2014, 10:15
а попробуй после втыкания клавы - передернуть подтяжку - может их с задержкой после подачи питания надо инить.
Да я уже пробовал перезапускать борду после подачи питания...
Есть одна мысля, что клавы работают по USB 1.1, как и USBASP, который тоже не определяется... Может драйвер тупо не хочет опускаться ниже 2.0?
balu_dark
05.11.2014, 11:20
глянь тут https://github.com/suapapa/stm32_library/tree/master/Project/USB_Host_Examples/HID
глянь тут
Именно это я сейчас и ковыряю :)
balu_dark
05.11.2014, 11:49
balu_dark, кстати в тему http://kazus.ru/forums/showthread.php?t=109336
на сей платке HID запустили ...
Дай плиз тому дятлу который ищет некое usb вот эту ссылку плиз https://forum.sparkfun.com/viewtopic.php?p=17940
А то не помню учетных данных своих с казуса.
Там вроде есть то что ему надо.
Народ, а поделитесь чудо Кайлом (или в чем вы так чудно программите), хорошо еще бы и настроенным для совсем начинающих, которые пока еще ниже "нуля".
Сразу скажу, торрентов у меня нет.
И второй вопрос, в этом чудо Кайле есть дизассемблер. А то надо посмотреть один файлик.
Народ, а поделитесь чудо Кайлом (или в чем вы так чудно программите)
https://www.keil.com/download/product/
У бесплатной версии ограничение в 32 килобайта кода. Но и это на первых порах недостижимый объем.
Дизасма там нет. Есть отладчик, но туда сторонний бинарь так просто не засунуть. Так что IDA в помощь.
Да мне бы что нибудь без всяких заморочей с регистрациями, всякими отсылками мылов и прочих. Ну и от IDA бы тогда тоже не откажусь, который поддерживает STM32 микроконтроллеры.
Приехала заказанная мне самому на 23 февраля демоплатка ST32F4-Discovery.
Камешек мощный, впору QUAKE запускать :)
Огорчило, что в новых партиях акселерометр LIS302 заменен на "аналогичный" и "более лучший", но - отличающийся в работе и по портам LIS3DSH, в результате - демопрограммы с ним не работают. Пока что вообще ничего с ним не работает :(
Накопал самодельную библиотеку от какого-то поляка под этот акселерометр, буду пробовать.
А пока что восстанавливал в памяти сведения про СТМ32, пишу небольшие программки в Кейле для осваивания периферии, подключил WH1602...
В общем, следующий сезон санта-барбары с СТМ32 считаю открытым :)
balu_dark
21.02.2015, 21:07
Меня будет интересовать проект для USB под этот кристал который использует putc и getc для вывода в порт USB. Что то типа CDC но без uart а с выгребом в буфер и отправкой из буфера - пока не могу толком переделать живые примеры. максимум что получилось - отвечает на пару обменов и потом начинает посылать толпу нулей в порт компьютера. :( Где то туплю а где - ни пойму :( У меня правда stm32f205 но у них с четвертой серией либы вроде одинаковы.
Я вечером бился с проетами немца на http://mikrocontroller.bplaced.net/wordpress/?page_id=1993
У него проекты в Кокосе, я - на Кейле.
Вроде как и несложно, создал рабочий шаблон в кейле, добавил либы из немецкого проекта, скопипастил main.c
И даже запускается компиляция.
Но меня люто убивает три строчки сообщения об ошибках, от линковщика,
Symbol USB_HID_STATUS multiply defined bla-bla-bla
Symbol USB_HID_STATUS multiply defined bla-bla-bla
Symbol USB_HID_STATUS multiply defined bla-bla-bla
Суть понятна, этот ЮСБ_ХИД_СТАТУС объявляется в нескольких местах. Как бы ни так.
Хрень в том, что этого нету, оно объявлено как typedef enum переменная только в одном месте в одном из хедеров.
И Кокос ну нифига ошибок не находит... Что этому Кайлу не нравится, не знаю... :(
Может он что-то тащит из своих либ?
balu_dark
22.02.2015, 09:23
очень даже могет тянуть из себя.
Обычно это означает что какие либо хидеры не подключены или пути не все указаны.
Но в IAR это как правило ворнинги а не ошибки. Но тоже сталкиваюсь иногда при переделке чужих проектов.
Ewgeny7, Кинь свой проект под Keil , влом заново ляпать.
Пока есть свободное время гляну ...
---------- Post added at 10:16 ---------- Previous post was at 09:58 ----------
создал рабочий шаблон в кейле,
Через RTE? Да еще там и USB подключил?
Кинь свой проект под Keil , влом заново ляпать
Воть - https://yadi.sk/d/vJZtk8kSepnCJ
В папке проекта много "лишнего", но это издержки шаблона.
Через RTE? Да еще там и USB подключил?
Да. Безупречный стиль еще не выработан :)
system_stm32f4xx.c настроен на 168 HCLK и 48USB, т.е. к работе USB всё готово.
Отмечу до кучи, что собирая три файла, отмеченные в ошибках в один единый файл, проект компилируется и запускается, компорт на ЮСБ появляется в ПЦ. Но это неправильно, хочется понять, где же собака порылась...
Ewgeny7,
Вообщем проблема в USB_HID_STATUS_t USB_HID_STATUS;
Она определена в хэдере stm32_ub_usb_hid.h, что есть неверно, ну и клонируется в исходниках .
Если кокос это хавает к нему близко приближаться нельзя...
Перенес ее в исходник stm32_ub_usb_hid.c, что правильно, добавил в usbd_usr.c как extern USB_HID_STATUS_t USB_HID_STATUS; . Все теперь без ошибок .
Выкинь лишние исходники SPL, исправь что выше писал и проверь.
Если не вру нужны только исходники SPL'ни - rcc и gpio .Проверить с ними потом выкинуть на ...
А ну еще и misc для NVIC .
Но все это легко вырезается и удаляется на .
Скорее всего в кокосе небыло прописано путей на дублирующую либу, там мало добавить папку в дерево проекта, нужно ещё и прописать пути в настройках компилера. Во всяком случае так в клипсе прмнято...
alx32, Не, все как выше я писал . Тот товарищЪ тупо добавил определение в хэдер . stm32_ub_usb_hid.h и stm32_ub_usb_hid.с это его изобретение.
---------- Post added at 15:36 ---------- Previous post was at 15:29 ----------
Ewgeny7, м**я Жень, ты зачем хэдеры в проект добавляешь?
м**я Жень, ты зачем хэдеры в проект добавляешь?
В данном проекте я тупо скопировал всё, что только можно, в том числе и хедеры.
Когда проект "не заводится", начинаешь копировать все мелочи.
За помощь - спасибо! Будем курить.
Выкинь лишние исходники SPL, исправь что выше писал и проверь
Там "лишние" - просто болтаются, это шаблонный проект. в котором собраны все либы, нужны они или нет. Если проект перерастает во что-то полезное - можно и повыкидывать нахрен все лишнее.
---------- Post added at 18:38 ---------- Previous post was at 18:34 ----------
Тот товарищЪ тупо добавил определение в хэдер
Я так понимаю, что этого делать в принципе не стОит?
Если имеем какую-нить глобальную переменную. которая должна быть доступна везде, то определяем ее в .с и определяем эктерном в модулях, которые ее пользуют?
там мало добавить папку в дерево проекта, нужно ещё и прописать пути в настройках компилера. Во всяком случае так в клипсе прмнято
В Кейле тоже полные пути ко всем папкам с файлами требуются.
Независимо от "дерева файлов" в инспекторе.
Если кокос это хавает к нему близко приближаться нельзя
Судя по всему хавает....
---------- Post added at 18:43 ---------- Previous post was at 18:38 ----------
что есть неверно, ну и клонируется в исходниках
А вот кстати, вопрос...
В хедерах ставят ifndef, как я понимаю. чтобы избежать многократного переопределения кода, который находится внутри этой конструкции. Почему же оно в данном случае не сработало?
---------- Post added at 18:49 ---------- Previous post was at 18:43 ----------
Всё работает!
dosicus, спасибо еще раз за науку! :)
Глобальные переменные сами по себе зло, а определения в хэдерах вдвойне ...
---------- Post added at 19:08 ---------- Previous post was at 19:03 ----------
В Кейле тоже полные пути ко всем папкам с файлами требуются.
Независимо от "дерева файлов" в инспекторе.
Да ну... Что пути к хэдерам , что пути к исходникам относительные .
Посмотри в редакторе *.uvprojx . Или в менагере проекта в контекстном меню -щелкнув по исходнику.
Почему и прокатывает простое копирование всей папки проекта с переименованием под себя *.uvprojx
А вот кстати, вопрос... сам в шоке...
Да ну... Что пути к хэдерам , что пути к исходникам относительные
Написал не то. что имел ввиду :)
Конечно относительные. Но ко всем.
---------- Post added at 19:19 ---------- Previous post was at 19:13 ----------
а определения в хэдерах вдвойне
А для чего тогда существуют хедеры?
Во многих случаях там как раз дают предустановку каких-либо параметров и переменных, насколько я вижу по примерам.
Это просто вопрос :)
---------- Post added at 19:21 ---------- Previous post was at 19:19 ----------
Уточню, классиков кодинга не читал, к сожалению... Полностью "спартанское" обучение Си. Плохо, но - что есть....
А для чего тогда существуют хедеры?
Во многих случаях там как раз дают предустановку каких-либо параметров и переменных, насколько я вижу по примерам.
Это просто вопрос :)
Разница между объявлением и определением
http://cppstudio.com/post/2647/
Запустил по образу и подобию USB-HOST с клавиатурой.
Кнопочки читаются. пытаюсь залезть "пониже" по уровням, чтобы отслеживать нажатия-отпускания. Там уже и до реального проекта недалеко...
Начинает помаленьку получаться конвертер USB->PS2 для клавиатуры.
Уже поигрался на ЮТ-88 с USB-клавиатуры.
Пока что все сильно "альфа", не все кнопы задействовал, есть сложности с префиксами в PS/2, но - уже пашет :)
В качестве камня использую девбординку на STM32F407VG.
Потом буду переносить проект на целевой камешек STM32F105RB. Он в разы дешевле.
Встретился с уже описанными в интернетах странностями в работе USB-клавы.
Она типа поддерживает нажатие до 6 кнопок, но далеко не всегда. Некоторые комбинации кнопок вводят в ступор после удержания более трех кнопок одновременно...
Пока что мой быдлокод обрабатывает только по одной нажатой кнопке, но алгоритм дальнейшего расширения ясен.
http://savepic.su/5303875m.jpg (http://savepic.su/5303875.htm)
---------- Post added at 22:59 ---------- Previous post was at 22:57 ----------
На фотке девборда STM32F4DISCOVERY и девборда U10-Reverse с ЮТ-88. И подопытная USB-клава :)
Начинает помаленьку получаться конвертер USB->PS2 для клавиатуры.
Уже поигрался на ЮТ-88 с USB-клавиатуры.
Пока что все сильно "альфа", не все кнопы задействовал, есть сложности с префиксами в PS/2, но - уже пашет :)
В качестве камня использую девбординку на STM32F407VG.
Потом буду переносить проект на целевой камешек STM32F105RB. Он в разы дешевле.
Да, сделай народу доброе дело - а то у народа уже ломка началась, что PS2 клавы в дефиците. Избалованный народ стал, дискогрызы понимаешь находят, а клаву уже лень. :)
balu_dark
09.03.2015, 00:10
А напомните по каким религиозным мотивам - юзание фенек типа USB 2 PS/2 считается плохим тоном ? тех которые типа свистка из литой пластикорезины - вставляются в ps2 гнездо ?
Anubis_OD
09.03.2015, 00:23
Уже обсуждали. Не все клавы работают с такими переходниками. Если контроллер двух режимный - то будет работать. Но из экономии такие встречаются все реже.
balu_dark
09.03.2015, 00:45
как по мне - не стоит гнаться за супер пупер навороченными клавами с блэкджеком,женщинами и кучей мультимедия контроллеров - с ними сто пудов будут приколы. Берется самая дешманская - только клава. Без наворотов и рюшечек. у меня пока не встречалось проблем с переходниками или клавами - правда не в спектрумах, а в ПЦ. Хотя на всех спектрумах имеющиеся у меня клавы - работали с переходником на ура.
Если речь идет о том что в драйвере со стороны спека не реализован некий режим - так тут уже совсем не клава виновата. и не переходник!
Если речь идет о том что в драйвере со стороны спека не реализован некий режим - так тут уже совсем не клава виновата. и не переходник!
Именно что клавиатура "виновата". Интерфейс USB - это 4 провода - земля, питание +5В, два сигнальных. Интерфейс PS/2 это тоже четыре провода - земля, питание +5В, два сигнальных. Практически все дешевые маленькие переходники USB->PS/2 представляют собой внутри просто 4 кусочка провода - я как-то один такой разобрал на спор с коллегой. Вся хитрость заключается в контроллере клавиатуры - он должен опознать автоматически по какому протоколу работать. Но, распознавать протокол PS/2 и работать по нему - это совсем необязательная опция для контроллера который стоит в клавиатуре с разъемом USB на шнуре. То есть - протокол USB, понятно, что работать должен,а PS/2 - зависит от, новые контроллеры вполне могут не работать.
balu_dark
09.03.2015, 12:40
я так понял что из за HID устройства - там могут идти некие дополнительные опкоды для некоторых режимов. Уже встречал тут на форуме что один из вариантов сканкодов где-то не реализовывали из за его трудности. посему думаю дело вовсе не в клавиатуре как таковой и тем более не в переходнике.
balu_dark, новые клавиатуры (точнее, года три как) просто физически не работают с PS/2 протоколом. Они его тупо не умеют. Поэтому переходник "зеленая пластмасска" вообще ничем не поможет. Внутри него два разъема и четыре проводка.
balu_dark
09.03.2015, 18:25
Сволочи - чего уж тут сказать тогда :( а у меня как раз старые клавы.
а у меня как раз старые клавы
Я так и подумал, раз ты так был уверен в переходничках :)
А я очень огорчился, когда мои любимые А4-Tech SL-5 стали только под USB :(
Но ничего, победим.
День ковыряния - привел код в более-менее порядок, написал нормальный кольцевой FIFO и трансмиттер. Теперь почти все кнопки работают и транслируются.
Паяю преобразователь уровней 3<->5 на двух полевичках и буду прицепляться к ПентЭве.
и буду прицепляться к ПентЭве
Прицепился, работает.
Теперь надо парсер наваять, чтобы несколько нажатых одновременно кнопок обслуживать, и всё будет готово для минимальной версии.
Теперь надо парсер наваять, чтобы несколько нажатых одновременно кнопок обслуживать, и всё будет готово для минимальной версии
Перенес проект на STM32F105RBT6.
Сделал обработку трех кнопок одновременно плюс управляющие (шифты, контролы, альты).
Погонял игрушки на Скорпионе. Прокатился на Скай Рэйсинг. Пришел первым :)
http://savepic.net/6425785m.jpg (http://savepic.net/6425785.htm)
Собственно, оно уже работает.
Содержание полезных деталей -
STM32F105RBT6 - 150..200 рублей на алиэкспрессе.
Разъем USB - 20руб.
Разъем PS/2 - 20руб.
Два полевичка - 6 рублей.
7 резисторов - 5 рублей.
7 конденсаторов - 5 рублей.
Кварц 12МГц - 15рублей
LM1117-3.3 - от 15 рублей.
Жаль, что на ПЦ не поиграться. Он, гад железный, при включении детектит клавиатуру, обменивается данными. Надо раскуривать, о чем они там базарят и делать имитацию. Тогда и в Кваку можно будет погонять :)
---------- Post added at 19:07 ---------- Previous post was at 18:02 ----------
Расширил обработку до пяти кнопок.
И вот оно, глюк ожидаемый.
Клава может прислать коды всех кнопок, а может и просто прислать пакет байтов 0х01 (ошибка), если нажать одновременно 4 и более кнопок.
Причем это зависит от используемых рядов на клаве.
Судя по всему, это не лечится, и зависит сугубо от реализации самой USB-клавы.
В общем, оставлю всё как есть.
Судя по всему, это не лечится, и зависит сугубо от реализации самой USB-клавы.
На другой клаве всё работает, все пять кноп.
Обдумываю вариант "матрица".
---------- Post added at 13:00 ---------- Previous post was at 12:40 ----------
Берем подопытный Скорпион (реал), цепляться будем к его штатному разъему клавиатуры. Аналогично будет подключение и для прочих клонов.
Ловить опрос буду пока сканированием восьми входов, на 72МГц клока это выглядит вполне реально, чтобы обойтись без прерываний по фронту.
Если вдруг не потянет - буду городить прерывания.
Если вдруг не потянет - буду городить прерывания.
Не взлетело. И прерывания не помогут.
Цикл обработки USB достаточно жручий, и приоритет его выше, поэтому просто не успеваем отреагировать...
Лепить мелкую CPLD придется наверное.
А как часто срабатывают прерывания от USB?
как по мне - не стоит гнаться за супер пупер навороченными клавами с блэкджеком,женщинами и кучей мультимедия контроллеров - с ними сто пудов будут приколы. Берется самая дешманская - только клава.
Не так давно прикупил себе вот такую. Блэкджеков особо никаких, а вот, поди ж ты - не заработала через переходник. Просто давно искал себе маленькую белую клаву для ZX-Evo - и такой облом!:(
http://www.dialoginvest.com/images/goods/kp112wu_1.jpg
http://www.dialoginvest.com/?lang=ru&mode=catalog&model=100228
Собственно, оно уже работает.
Содержание полезных деталей -
STM32F105RBT6 - 150..200 рублей на алиэкспрессе.
Разъем USB - 20руб.
Разъем PS/2 - 20руб.
Два полевичка - 6 рублей.
7 резисторов - 5 рублей.
7 конденсаторов - 5 рублей.
Кварц 12МГц - 15рублей
LM1117-3.3 - от 15 рублей.
А проект будет открыт для повторения? Печатную платку лутом под конвертер реально запилить?
Реально, если шаг 0,5 получится...
А проект будет открыт для повторения? Печатную платку лутом под конвертер реально запилить?
Конечно будет.
Просто я как обычно, сначала допиливаю железяку. а потом начинаю схему рисовать, вспоминая что куда подсоединено :)
Платка на фото - ЛУТовая, вполне реально делаются, даже с QFP-64x0.5.
Только текстолит надо нормальный. У меня дома два сорта, так вот на "втором" - даже 0,8 толком не сделаешь, дорожки перетравливаются и отлетают при пайке. поверхность текстолита слишком рифленая... зато стОит рубль за метр.
---------- Post added at 19:11 ---------- Previous post was at 18:41 ----------
А как часто срабатывают прерывания от USB?
Вот это я не знаю, как посмотреть. Но фигачить должно часто и быстро, судя по описанию USB как такового.
Вот это я не знаю, как посмотреть. Но фигачить должно часто и быстро, судя по описанию USB как такового.
Насколько я понимаю, у тебя же хост и значит опрашиваешь клаву ты. Она же сама по себе не инициирует обмен, она же работает как slave устройство. И по сути прерывания должны возникать с той частотой, с какой хост опрашивает устройства.
Я так понимаю.
---------- Post added at 19:18 ---------- Previous post was at 19:16 ----------
Не так давно прикупил себе вот такую. Блэкджеков особо никаких, а вот, поди ж ты - не заработала через переходник. Просто давно искал себе маленькую белую клаву для ZX-Evo - и такой облом!:(
Ну ты чего ни разу не радиолюбитель что ли. А как же жажда познаний и любопытства. Если клава не хочет работать, но она тебе нравится из своего дизайна, так замени ей мозги, чтобы была сговорчивая. :)
Насколько я понимаю, у тебя же хост и значит опрашиваешь клаву ты. Она же сама по себе не инициирует обмен, она же работает как slave устройство. И по сути прерывания должны возникать с той частотой, с какой хост опрашивает устройства.
Я так понимаю.
Всё это так.
Вкратце, USB использует ДВА таймера и циклический вызов поверх всего этого. Если вызов я могу отложить на дальнюю полку, то с двумя прерываниями по таймерам ситуация посложней.
Но здесь по-любому, мне еще разбираться и разбираться с этой техникой.
Пока же нарисую платку для USB-PS2 конвертера. Этот вариант имеет законченный вид, я активно бетатестирую ПентЭву с конвертером. Пока впечатления неомраченные.
Из минусов - какой-то чудо-инженер назначил единственной кнопе из всех "F7" сканкод более 0х80, убил бы... Пока что она просто не задействована, старший бит я использую как признак префикса. Ну и не стал обрабатывать кнопку Pause. Пока не стал. Она не используется, а код ее.... кхм... 0xE1 0x14 0x77 0xE1 0xF0 0x14 0xF0 0x77. Это кто-то злобно пошутил из айбиэМа, наверное. :v2_dizzy_vodka4:
Для сравнения, код кнопки Enter - 0x5A :)
Конечно будет.
Просто я как обычно, сначала допиливаю железяку. а потом начинаю схему рисовать, вспоминая что куда подсоединено
Спасибо. Значит буду подождать. :)
Ну ты чего ни разу не радиолюбитель что ли. А как же жажда познаний и любопытства. Если клава не хочет работать, но она тебе нравится из своего дизайна, так замени ей мозги, чтобы была сговорчивая.
Ды дело в том, что я не настоящий сварщик схемотехник. :DПовторить какой более-менее сложный девайс - это пожалуйста. А вот разработать с нуля чего-то новое пока для меня не просто. Хотя и этот путь я учитывал, т.к. уже нашел в инете схемку ps/2 мозгов для клавиатуры на микроконтроллере. Но там не обрабатывался слой FN, поэтому схемку отложил на потом. Пока, по совету TSL, собрал себе простенькую девборду на atmega32 просто для того чтобы поизучать программирование авр-ок и подергать лапами мк. Ну и сильно на будущее заказал себе микросхемку (аппаратный юсб-хост) VNC2-32. MVV предложил идею повесить его на лапы механической клавиатуры PentEvo. Это пока для меня вообще анриел, но с этим жуком вроде бы можно научить Эву работать с usb клавой, мышью, джойпэдом и флэшками. Но надо программить как сам VNC2, так и переписывать код авр-ки Эвы. Да ещё и в связку cpld вешать...
Для сравнения, код кнопки Enter - 0x5A :)
Ну для правильности, надо бы эмулировать еще команды PS/2 клавы. А то ведь обработчики могут быть разными и отсутствие ответа на какую то команду обработчик может расценить за ошибку и все клавы нема.
Ну для правильности, надо бы эмулировать еще команды PS/2 клавы. А то ведь обработчики могут быть разными и отсутствие ответа на какую то команду обработчик может расценить за ошибку и все клавы нема.
Вряд ли я буду этим заниматься.
Имеющийся на форуме парк машинок можно предусмотреть в программе конвертера. Т.е. варианты наборов сканкодов и оперативно переключать их. А большее, типа приема команд от хостов - нафиг пока что. Будет время и желание - можно будет и доковырять, если нужда хоть какя-нибудь появится.
---------- Post added at 21:46 ---------- Previous post was at 21:43 ----------
Для этого "будущего" железо в принципе готово, преобразователи уровней - двусторонние, можно как отправлять, так и получать команды.
---------- Post added at 22:40 ---------- Previous post was at 21:46 ----------
На скорую руку примерно так -
http://savepic.su/5408192m.png (http://savepic.su/5408192.htm)
Не шедевр, но работать должно :)
---------- Post added at 22:41 ---------- Previous post was at 22:40 ----------
лайку выложу после проверки на ошибки.
Ewgeny7, Сделай низ сплошной GND ...
И ничего хорошего в этом не будет, лишняя ёмкость монтажа.
Это не СВЧ конструкция, несколько пикофарад на скорость не повлияют.
Евгений, землёй можно и верхний слой залить, чтобы легче фоторезистом делать было, если что, с меня плата ;)
А что, как раз ВЧ...
...поэтому нужны полигоны земли.
Сделай низ сплошной GND ...
Хорошо, перерисую. Но у меня тестолит будет односторонний, с учетом на это и рисовал. На нижнем слое условно изобразил соединения для +Vcc.
---------- Post added at 12:25 ---------- Previous post was at 12:20 ----------
Шнурок PS/2 как подсоединять? На платке слева четыре дырдочки, чтобы запаять проводки шнура, и два отверстия для винтов с гайками, чтобы прижать хвост шнура к платке для жесткости.
Ewgeny7, Убьешь нескольких зайцев- стабильность в работе + более лучшая разводка + легче изготовление ЛУТ'ом .
Да и двухстронний текстолит не на столько дорог .
Тут заглянул на сайт ДНС и увидел что клав PS/2 извиняюсь за выражение "до жопы"
От дешевых, до дорогих. Посему проблему считаю высосали из пальца.
Другое дело хотелки, вот типа захотелось и все тут - полюбил клаву я, оказалась USBой.
Так ведь есть клавы с блютузом, я так полагаю скоро и его надо конвертор соображать, а то ведь тоже жизнь без клавы с блютузом не жизнь.
Ну это так, лирика.
Народу треба клавы слим-фактора, без дополнительных цифровых нумпадов.
Тут выбор уже резко сокращается. В Питере я таких вообще не нашел, только в Китаях, на Али.
Насчет блюпупов - ты имеешь в виду беспроводные? Так они должны работать на конвертере, по-идее. Ведь они тоже "представляются" как USB-HID устройства.
---------- Post added at 14:23 ---------- Previous post was at 14:02 ----------
http://savepic.su/5382447m.png (http://savepic.su/5382447.htm)
Что-то такое вот вырисовывается...
Снизу просто заливка металлизацией. Нижний слой - синий! Есть у меня такая неправильная привычка.
Лайка (https://yadi.sk/d/x3Hh7mxifGK4o) платки. Если кому надо, доводите ее до ума... Я пока же нарисую схемку.
Схема (https://yadi.sk/i/Z3sW1wS2fGZzo). Нарисовал в диптрейсе. Не люблю его, но что есть.
Ну для правильности, надо бы эмулировать еще команды PS/2 клавы. А то ведь обработчики могут быть разными и отсутствие ответа на какую то команду обработчик может расценить за ошибку и все клавы нема
Ты воистину мудр, Плюшевый медведь :)
Ищу команды обмена между ПЦ и клавиатурой. А пока ZXMC отдыхает :(
Ну а пока довавил к Scanset_2 и используемый Камилем scanset_3 в код конвертера.
Вот вроде пример общения комп - ps2 клава: http://www.tayloredge.com/reference/Interface/atkeyboard.pdf
Алсо, http://www.simandl.cz/stranky/elektro/keyboard/keyboard_a.htm
Tronix, спасибо! Я нашел эту же статью "в оригинале" на www.computer-engineering.org
Курю тексты, всё читаемо, завтра начну реализовывать. Судя по всему, нужна полная эмуляция, чем и займусь.
---------- Post added at 23:39 ---------- Previous post was at 23:37 ----------
Попутно написал Камилю, какие именно команды использует он, чтобы уж наверняка было.
Попутно написал Камилю, какие именно команды использует он, чтобы уж наверняка было.
При инициализации вроде используются команды
0xFF - сброс
0xF0, 0x03 - установка 3 режима
0xF8 - все кнопки типа отжаты или что то вроде этого
В процессе работы
0xED, 0xLED_STATE - собственно управление светодиодами
Но еще не забывай, что на эти команды есть подтверждения
0xFE и 0xFA
Также можешь почитать этот талмут http://electronic-engineering.ch/microchip/datasheets/kbd_spec.pdf
---------- Post added at 08:52 ---------- Previous post was at 08:21 ----------
Народу треба клавы слим-фактора, без дополнительных цифровых нумпадов.
Тут выбор уже резко сокращается. В Питере я таких вообще не нашел, только в Китаях, на Али.
Насчет блюпупов - ты имеешь в виду беспроводные? Так они должны работать на конвертере, по-идее. Ведь они тоже "представляются" как USB-HID устройства.
Тоесть все таки рюшечки и стразики. Уже типа шашечки или ехать не прокатывает.
А тогда и мне запилите плиз Блютуз клаву, тоже хочу со стразиками.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot