С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
dosikus, про прием по USART успеешь накарябать?
Передачу я настроил по твоей науке
---------- Post added 02.05.2014 at 00:20 ---------- Previous post was 01.05.2014 at 23:23 ----------
Собственно, я уже запустил прием на прерываниях.
"Hello, World!" уже погонял в обоих направлениях.
Завтра отчитаюсь на суд знатоков![]()
ScorpEvo ZS 1024 turbo+ CF-HDD/FDD/Mouse/SMUC 3.1/ProfROMse/NeoGS/ZC
Speccy-2007 128/AY/TR-DOS
Сайт с документацией к "Scorpion ZS 256"
Немножко соберу в кучу информацию о работе с 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 ----------
Виктор, прошу пардону, я там маленько влез в твой первый пост в теме, чтобы добавить немножко ссылок для удобства поиска в этой теме...
Последний раз редактировалось Ewgeny7; 04.05.2014 в 14:11.
ScorpEvo ZS 1024 turbo+ CF-HDD/FDD/Mouse/SMUC 3.1/ProfROMse/NeoGS/ZC
Speccy-2007 128/AY/TR-DOS
Сайт с документацией к "Scorpion ZS 256"
Вот хорошие на мой взгляд уроки для начинающих или пробующих в программирование первые шаги . Только там на меге , но суть не играет , язык то все равно тот же си. К тому же там и видео объяснительно поучительное есть . Мне очень понравились , надеюсь и кому то еще пригодятся .
Последний раз редактировалось Dragoos; 02.05.2014 в 15:57.
Dragoos, спасибо, но это не то.
На Меге и я могу уроки писать. СТМ32 - другая кухня...
ScorpEvo ZS 1024 turbo+ CF-HDD/FDD/Mouse/SMUC 3.1/ProfROMse/NeoGS/ZC
Speccy-2007 128/AY/TR-DOS
Сайт с документацией к "Scorpion ZS 256"
У 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-разрядные.
---------- Post added at 11:33 ---------- Previous post was at 11:30 ----------
Я бегло посчитал количество пинов I/O на демоплатке, вышло 45. Точнее можно посмотреть в даташите.
Фишка в том, что у чипа не обязательно порты выведены в полном составе. все 16 бит. Может быть и меньше. Вот, я вижу два вывода порта Н...
Последний раз редактировалось Ewgeny7; 03.05.2014 в 11:36.
ScorpEvo ZS 1024 turbo+ CF-HDD/FDD/Mouse/SMUC 3.1/ProfROMse/NeoGS/ZC
Speccy-2007 128/AY/TR-DOS
Сайт с документацией к "Scorpion ZS 256"
Ага, это то же самое, что я проходил по минному полю несколько дней назад.
Только в статейке не описывается конфигурирование частот, а мы это уже сделали
---------- Post added at 20:34 ---------- Previous post was at 20:22 ----------
Вот, кстати, файлик system_stm32l1xx.c с выставленными частотами 24Мгц от внутреннего генератора и PLL, systick равен 3000.
Это чтобы не париться с настройками клоков, а сразу знать, что мы имеем в проекте.
ScorpEvo ZS 1024 turbo+ CF-HDD/FDD/Mouse/SMUC 3.1/ProfROMse/NeoGS/ZC
Speccy-2007 128/AY/TR-DOS
Сайт с документацией к "Scorpion ZS 256"
Я тоже так думаю. Нужно предварительно запомнить, что такое шины AHB, APB, что на них висит и "разложить в голове" мнемоники команд на включение этих периферий, про это как раз хорошо написано в приведенной тобой статье.
У меня тоже уже возникает приятное чувство понимания происходящего.
ScorpEvo ZS 1024 turbo+ CF-HDD/FDD/Mouse/SMUC 3.1/ProfROMse/NeoGS/ZC
Speccy-2007 128/AY/TR-DOS
Сайт с документацией к "Scorpion ZS 256"
Согласен, но только со стабильностью. С остальным - нет.
Аргументы - а зачем нам высокая стабильность? Часы делать на этом генераторе мы не будем, синтезом четких времянок типа видеосигнала - тоже заниматься не будем (пока). Поэтому смысла во внешнем кварце пока не вижу... А качество таймингов HSI вполне применимы для 99% применений. Это мое мнение
Виктор, еще раз посмотри визуальный построитель в Экселе.
Я использую 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 остался, что нам и требовалось.
ScorpEvo ZS 1024 turbo+ CF-HDD/FDD/Mouse/SMUC 3.1/ProfROMse/NeoGS/ZC
Speccy-2007 128/AY/TR-DOS
Сайт с документацией к "Scorpion ZS 256"
ScorpEvo ZS 1024 turbo+ CF-HDD/FDD/Mouse/SMUC 3.1/ProfROMse/NeoGS/ZC
Speccy-2007 128/AY/TR-DOS
Сайт с документацией к "Scorpion ZS 256"
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)