Практический курс STM32. Урок 1 - GPIO. Порты ввода-вывода

В предыдущем уроке мы поговорили о необходимой нам документации и установили IDE. Сейчас самое время познакомится с GPIO.

В этом уроке мы:
  • Узнаем о возможностях GPIO серии STM32F4
  • Пройдемся по Справочному руководству (Reference Manual, далее просто СР) попутно его комментируя
  • Освоим 80% его функционала, не вдаваясь в работу с альтернативными функциями(об этом ниже). Поверьте, этого будет вполне достаточно для начала. А поскольку альтернативные функции касаются отдельных блоков STM(USB, таймеры, USART), о них мы поговорим уже по ходу освоения конкретных блоки в следующих(надеюсь) уроках
  • К концу урока, как это положено по традиции, помигаем миру светодиодами наших F4-Discovery. Напишем код и подробно разберем каждую его строку(кроме одной, относящейся к следующему уроку).

Начало
Что это за зверь такой? Если по-нашему, то GPIO — это порты ввода-вывода общего назначения. Через них микроконтроллер по сути связан с внешним миром. Вот почему именно с этого и нужно начинать знакомство с STM32.

Я попрошу вас открыть скачанное ранее Справочное руководство, страницу 265 и взглянуть на раздел 8 General-purpose I/Os (GPIO). В первом же предложении сказано, что все написанное в разделе касается всей серии STM32F4, если только в каком-либо пункте не сказано иначе. Окей, возьмем на заметку, что в случае чего нужно смотреть Даташит. К пункту 8.1 мы еще вернемся при рассмотрении регистров GPIO, поэтому сейчас пропускаем его и переходим к пункту 8.2. В нем сказано, что:

  • Для каждого порта можно выбрать свою скорость тактирования для каждой ножки МК
  • Каждый порт может контролировать до 16ти выводов МК
  • На смену режима порта уходит около 2х тактов
  • На выход данные могут поступать из регистра вывода GPIOx_ODR(или отдельного периферийного блока, запомним на будущее)
  • Сигнал, поступивший на вход записывается в аналогичный регистр ввода GPIOx_IDR(или идет на периферийный блок)
  • У нас есть специальный механизм блокировки конфигурации порта посредством регистра GPIOx_LCKR. Очень хорошо, такой подход добавляет надежности. Ведь при «случайной» записи не той конфигурации можно легко спалить вывод МК или того хуже: представьте, что наш STM32 управляет устройством, от которого зависит жизнь людей, только представьте, к чему может привести появление «не того» сигнала на выходе МК(Кажется я уже слышу смех злых гениев, читающих статью=) ). А как известно, в процессе написания кода довольно легко допустить ошибку, которую так сразу и не выявить. Под «не тем сигналом» я подразумеваю например случайную смену режима «двухтактный выход» на режим «открытый сток» или наоборот. Об этих режимах поговорим чуть ниже.
  • У нас есть мультиплексирование выводов. Тоже хорошо. Такой подход позаимствован из FPGA. Использование мультиплексирование позволяет сделать дизайн более гибким и значительно упростить разводку и улучшить частотные свойства, у нас ведь предел 168 MHz(и это без оверклокинга). Тем не менее, мультиплексирование — не панацея и учитывать расположение выводов все же придется.


Основные возможности GPIO рассмотрели, перейдем к режимам работы порта. Смотрим в пункте 8.3 GPIO functional description режимы:

  • Input floating
    По-нашему это высокоимпедансный вход, он же плавающий, он же Hi-Z. На выходе МК установла комплиментарная пара полевых транзисторов(один n-канальный и один p-канальный). В закрытом состоянии сопротивление сток-исток стремится к бесконечности, следовательно ток через вывод МК, можно сказать, не течет. Говорят что в таком случае выход ведет себя как «плавающий», т.е. отключенный от схемы. Комплиментарную пару можно увидеть на Figure 25(и в статье чуть ниже). Более подробно об этом типе входа можно почитать на Википедии
  • Input pull-up
    Это вход с подтяжкой к питанию, т.е. между входом и питанием включен подтягивающий резистор(номинала порядка килоом). Подтягивающий резистор позволяет выходу находиться либо в высоком(подтянут к питанию), либо в низком(подтянут к земле) состоянии, когда к выходу не приложено внешнее напряжение. Это позволяет избежать спонтанных появлений 0 и 1 на входе. Подробнее о подтяжке можно почитать тут
  • Input-pull-down
    По аналогии с предыдущим, этот вход — с подтяжкой к земле. Если открыть стр. 110 Даташита на STM32F407, а конкретно таблицу Table 47. I/O static characteristics, можно увидеть что значение подтягивающих резисторов обычно равно 40 кОм(кроме выводов PA10 и PB12 — для них 11 кОм).
  • Analog
    Вывод может быть сконфигурирован как аналоговый вход или выход. Это касается отдельных периферийных блоков(АЦП, ЦАП), так что пока просто запомним, что такой режим есть.
  • Output open-drain with pull-up or pull-down capability
    По-нашему звучит как «выход с открытым коллектором», но я с этим определением не согласен, транзисторы-то полевые. Так что назовем его "выход с открытым стоком". Ну и конечно МК позволяет подключить к выводу подтяжку. Почитать можно тут(только не забывайте про тип транзистора). Ну и управляем при этом мы только n-канальным транзистором, опять таки, это можно увидеть на Figure 25.
  • Output push-pull with pull-up or pull-down capability
    Push-pull означает «двухтактный выход». Пожалуй самый часто используемый тип выхода: подали 0 — выход подключился к земле, 1 — подключился к питанию. Это настолько просто, что мне как Мавроди, «Лень даже объяснять»=). Вот тут рассказывается об этом режиме выхода и дается сравнение с другими режимами.
  • Alternate function push-pull with pull-up or pull-down capability
    Уже описанный ранее двухтактный выход, только для альтернативной функции. Пока не затрагиваем.
  • Alternate function open-drain with pull-up or pull-down capability
    И соответственно выход с откыртым стоком, так же для альтернативной функции, так же пока не трогаем. Важно пока просто запомнить, что нечто подобное есть.
Ну и то самое изображение(из Справочного руководства), иллюстрирующее как устроен GPIO в STM32F407:


Остановимся еще на одном важном моменте: после системного сброса порты по умолчанию находятся в режиме высокоимпедансного входа(Hi-Z).
Я попрошу вас еще раз пройтись по пунктам 8.1 — 8.3.2 Справочного руководства, и переходить к следующей части статьи только когда убедитесь, что освоили все вышеописанное. Не пытайтесь разобраться сразу во всем, это просто невозможно, у нас ведь практический курс и во всем не понятном мы будем разбираться по ходу изучения.
Разобрались? Отлично, теперь поговорим о регистрах.

Регистры GPIO
В соответствии с пунктом 8.1 GPIO introduction у нас есть 10 регистров для каждого порта. Давайте-ка разобъем их на типы:

  • Регистры конфигурации
    Как можно догадаться из названия, эти регистры позволяют задавать режим работы каждой ножки отдельно. Всего их 4 для каждого порта:
    1. GPIOx_MODER. Этот регистр задает направление ввода-вывода каждой ножки. Направление может быть: вход, выход, альтернативная ф-я, аналоговый. По-умолчанию(после сброса) направление всех ножек устанавливается на вход, кроме портов A и B(начальное состояние можно посмотреть в пункте 8.4.1. СР)
    2. GPIOx_OTYPER. Этот регистр задает тип выхода: двухтактный или открытый сток. По умолчанию — двухтактный для каждой ножки
    3. GPIOx_OSPEEDR. С помощью этого регистра задается частота тактирования каждого вывода. СР описывает частоты как: низкая, средняя, повышенная, высокая. После сброса скорость низкая(кроме В.3, тут высокая). Где же сами частоты? Их нужно смотреть в Даташите, об этом ниже.
    4. GPIOx_PUPDR. Этот регистр управляет подтяжкой каждой ножки. Нам предлагают на выбор: без подтяжки, подтяжка к питанию, подтяжка к земле. По умолчанию подтяжки нет(кроме портов А и В, их состояние уточняйте в пункте 8.4.4 СР)
  • Регистры данных
    Тут все намного проще: два регистра, один на вывод, другой на ввод. Давайте рассмотрим их поподробнее:
    1. GPIOx_IDR. Регистр ввода. Если вывод МК настроен на вход, то любой, поданный на ножку сигнал пройдет через триггер Шмитта и отразится в этом регистре в виде соответствующего 0 или 1.
    2. GPIOx_ODR. Регистр вывода. То же самое, только задом-на-перед: то, что мы запишем в этот регистр(0 или 1) попадет на ножку МК в виде логического уровня цифрового сигнала.
  • Регистр установки/сброса
    GPIOx_BSRR. При помощи этого регистра осуществляется запись 0 или 1 в регистр вывода GPIOx_ODR. Вы спросите, зачем же нам нужен этот дополнительный регистр, если можно прочитать регистр вывода, установить и сбросить в нем нужные нам биты и снова записать результат регистр? Тут дело в атомарности операций. Без использования регистра установки/сброса такой подход занимает сразу несколько операций(тактов): сначала необходимо записать данные из регистра вывода в один из общих регистров, затем применить к данным в общем регистре логические операции(для переключения бита/битов используют XOR, для установки в 0 используют NOT затем AND, для установки в 1 используют OR), и наконец снова записать полученное значение из общего регистра обратно в регистр вывода. Как видим одна такая операция на самом деле состоит из 3-4 подопераций и не является единичной(атомарной). Такова особенность большинства архитектур. Неатомарность операций плоха тем, что если в момент выполнения одной из подопераций возникнет запрос прерывания, то МК переключится на выполнение кода прерывания и только после этого вернется к нашей подоперации. Следовательно если в коде обработчика прерывания используется GPIO — можно получить на выводе МК не то состояние(помните про жизни людей?=) ). Есть много подходов к решению этой проблемы, словом некоторые(маскируемые) прерывания можно запретить на время выполнения операции, можно контролировать атомарность программно. Но STM предоставляет готовое решение — регистр установки/сброса, обращения через который атомарны и выполняются быстрее. О прерываниях мы поговорим в следующих уроках, а пока можно заглянуть сюда и вот сюда. При работе с МК знание булевой алгебры на начальном уровне обязательно, этой статьи нам будет вполне достаточно(только не забывайте, что она из цикла по MSP430, а мы изучаем STM32).
  • Регистр блокировки
    GPIOx_LCKR. Этот регистр осуществляет управление механизмом блокировки конфигурации, о котором я уже говорил в начале статьи. Что бы не забивать голову с самого начала, останавливаться на этом регистре, впрочем как и на самом механизме, мы не будем. При желании можно заглянуть в пункт 8.3.6 GPIO locking mechanism СР. Упомяну лишь, что даже в заблокированном состоянии доступна работа с регистром установки/сброса(GPIOx_BSRR) и регистром вывода(GPIOx_ODR).
    (А как же жизни людей? -Их уже не спасти, зато контроллер останется цел)
  • Регистры альтернативных функций
    GPIOx_AFRL и GPIOx_AFRH. О них пока ни слова, надо будет — вернемся.


Попрошу вас пройтись по пунктам 8.3.3 — 8.3.15 Справочного руководства и слегка заглянуть в 8.4. Слегка потому, что писать мы будем на Си, совсем изредка используя ассемблерные вставки в критичных участках.
Серьезно, если у вас есть друг, который пишет под высокоуровневые МК только на ассемблере и он не джедай, скорее бегите за лекарствами. Можно на пальцах пересчитать проекты на STM32 которые требуют исключительно ассемблерного кода. Написать часть RTOS или криптофункцию на асме вполне оправданно, но проект целиком? К счастью лихие 90е прошли, и если код не влазит в кристалл, меняйте либо камень, либо код.

Приступим к практике
С теорией разобрались. Попробуем теперь применить полученные знания на практике. Еще раз напомню, что в нашем коде будет одна строчка, работающая на магии и пока что вам придется поверить мне на слово, что без этой строчки ничего не заработает(хотя скомпилируется без проблем). Так что мы просто вставим ее в код и на время забудем о ней(но вспомним в следующем уроке). Ну что, поехали.

Открываем кокос CoIDE и создаем новый проект:


Тут вводим имя проекта и выбираем директория, в которой он будет лежать(на картинке дефолтная, еще картинка сжата по высоте). Имя проекта обязательно английскими буквами и без пробелов, иначе могут возникнуть проблемы с периносимостью. Нажимаем Next


Нажимаем на Chip и опять Next


Выбираем наш установленный на F4-Discovery МК(STM32F407VG), жмем Finish.


Нам предложат добавить в проект библиотеки из репозитория. Добавляем: M4 CMSIS Core, CMSIS BOOT, RCC, GPIO отметив их галочками.


Ищем слева main.c и двойным кликом открываем.
Теперь разберемся, что же мы добавили из репозитория. Словом каждый пункт из списка «PERIPHERAL.ST» является частью очень удобной библиотеки StdPeriph_Lib от ST. Саму библиотеку мы скачивали в предыдущем уроке. Тогда я попросил вас оставить из скачанного архива лишь файл «stm32f4xx_dsp_stdperiph_lib_um.chm» с документацией на библиотеку и сказал, что остальные файлы из архива нам не нужны поскольку библиотеку будем подключать из репозитория кокоса. Как видим, это намного удобнее, чем переносить файлы библиотеки в директорию вручную. Из репозитория помимо необходимого нам GPIO мы потянули еще и RCC(та самая магия, которую в этом уроке мы не трогаем).
Что за два остальных компонента репозитория, те, что с именем CMSIS? Это стандартизированная для всех Cortex-M библиотека абстракции, которая позволяет при написании кода думать на более высоком уровне(архитектуры вцелом и имеющейся периферии). Помимо упрощения написания кода, библиотека очень упрощает перенесение кода между разными МК с Cortex-M на борту(да-да, не только STM). К слову библиотека распространяется самой компанией ARM. При желании можно зайти сюда и почитать про библиотеку и скачать спецификацию на нее, но это чисто почитать на горшке досуге: в данном уроке можно обойтись без рассмотрения особенностей этой библиотеки.

Замените код в main.c на следующий:
// Подключаем заголовки
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"

// Функция программной задержки
void Soft_Delay(volatile uint32_t number)
{
	while(number--);
}

int main(void)
{
	// Следующая строка для нас пока что магическая
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
	
	// Настраиваем порты
    	// ....
	
	// Бесконечный цикл	
    while(1)
    {
    	// Включаем светодиод
    	// ....
    	
    	// Делаем паузу
    	Soft_Delay(0x000FFFFF);
    	
    	// Теперь выключаем светодиод
    	// ....
    	
    	// Делаем паузу
    	Soft_Delay(0x000FFFFF);
    }
}

Как говорил наш препод по программированию: «Вот мы и написали основную часть кода». Эту основную часть будем по ходу дела дополнять всем недостающим.

С include'ами не должно быть никаких вопросов. Впрочем если есть, рекомендую немного порыться в соответствующих .c и .h файлах, так же можно заглянуть в справку к библиотеке от ST(.chm файл). Если не понятен тип uint32_t, почитать о нем и о других C99 типах можно тут.
Поскольку в отличии от компиляторов Си для большинства МК, в используемом компиляторе нет стандартной функции программной задержки, мы написали ее сами. Функция Soft_Delay просто отнимает по единице(декремент) от переданного ей аргумента в каждом цикле, на что уходит некоторое малое время. Модификатор volatile запрещает компилятору оптимизировать обращения к аргументу(подробнее можно почитать тут). Он необходим что бы в процессе оптимизации компилятор попросту не выкинул функцию. О разных граблях связанных с этим модификатором и его правильном использовании при желании можно почитать в этом топике. Важно помнить, что volatile не обеспечивает атомарность операций, и хрен знает сколько ассемблерных директив будет занимать один цикл Soft_Delay, это зависит от компилятора и выбранной агрессивности оптимизации, но это будет число около 4х.
Так что программные задержки в реальных проектах используются редко, во-первых потому, что вместо выполнения полезных операций ядро занято «подсчетом мусора», во-вторых такие задержки не точны и требуют калибровки(даже смена компилятора может потребовать перекалибровки), в-третьих есть более удобный метод организации задержек — использовать таймеры. С таймерами мы подробно познакомимся в следующих уроках.

Допишем недостающие части кода. Поскольку мигать мы будем светодиодом, хорошо бы знать на какую ногу МК он прицеплен. Посмотрите на плату F4-Discovery, по две стороны нижнего usb у нас 2 светодиода, а между кнопками у нас расположены еще 4. Со светодиодами определились, теперь посмотрем куда создатели Discovery решили их подключить. Откройте Руководство Discovery(мы скачали его с сайта ST в прошлом уроке) и найдите в описании подключенных устройств LEDs (страница 16, п. 4.4) и выбираем, например синий диод. Там же смотрим, что он имеет обозначение LD6 и подключен к PD15(порт D вывод 15) нашего МК, но как именно он подключен нам пока не известно. Посмотрим на скачанной(в пр. уроке) схеме Discovery, в самом конце на 6 стр. находим вот такой структурный блок:

Отсюда видно, для того что бы зажечь синий светодиод необходимо подключить вывод PD15 к питанию, т.е. подать на ножку в режиме push-pull(двухтактный выход) логическую 1. Но как мы уже говорили ранее сначала вывод нужно сконфигурировать.

Библиотека StdPeriph_Lib предлагает удобный метод конфигурации выводов МК посредством функции GPIO_Init. Я попрошу вас открыть скачанный нами .chm файл документации к библиотеке и найти в нем эту функцию.

Как видно из описания, первым параметром является "GPIOx", где символ «х» заменяется на букву порта. Поскольку наш синий светодиод подключен к порту D, получим "GPIOD". В качестве второго параметра(GPIO_InitStruct) функция принимает указатель на структуру типа "GPIO_InitTypeDef", нажав на него, перейдите по ссылке.

Тут мы видим поля структуры (Data Fields), а перейдя по ссылке «125»(на картинке внизу) мы перейдем прямиком к коду структуры. Здесь я приведу лишь какими могут быть поля структуры, а вас попрошу немного полазить по коду(это можно в том же.сhm) и еще раз, самим, во всем разобраться.

  • GPIO_Mode (рег. GPIOx_MODER) задает направление:
    GPIO_Mode_IN        Input Mode  
    GPIO_Mode_OUT       Output Mode  
    GPIO_Mode_AF        Alternate function Mode  
    GPIO_Mode_AN        Analog Mode 
    
  • GPIO_OType (рег. GPIOx_OTYPER) задает тип:
    GPIO_OType_PP       Push-pull (двухтактный)
    GPIO_OType_OD       Open drain (открытый сток)
    
  • GPIO_PuPd (рег. GPIOx_PUPDR) задает подтяжку:
    GPIO_PuPd_NOPULL    No pull-up and no pull-down   
    GPIO_PuPd_UP        Pull-up
    GPIO_PuPd_DOWN      Pull-down
    
  • GPIO_Speed (рег. GPIOx_OSPEEDR) задает максимальную скорость:
    GPIO_Speed_2MHz     Low speed (низкая скорость 2MHz)
    GPIO_Speed_25MHz    Medium speed (средняя скорость 25MHz)
    GPIO_Speed_50MHz    Fast speed (повышенная скорость 50MHz)
    GPIO_Speed_100MHz   High speed (высокая скорость 100MHz на 
                                    30 pF или 80 MHz на 15 pF)
    
  • GPIO_Pin задает какие выводы конфигурируются:
    GPIO_Pin_0          Вывод 0
    ....
    GPIO_Pin_15         Вывод 15
    GPIO_Pin_All        Все выводы
    
    Имеет тип uint32_t следовательно может быть и простым числом, 
    но описанные тут define'ы как по мне намного удобнее.
    

Теперь напишем код, отвечающий за конфигурацию:
// Настраиваем порты
GPIO_InitTypeDef  ledinit;  // создаем структуру

ledinit.GPIO_Mode = GPIO_Mode_OUT;  // направление - выход
ledinit.GPIO_OType = GPIO_OType_PP;  // Двухтактный выход
ledinit.GPIO_PuPd = GPIO_PuPd_NOPULL;  // Без подтяжки
ledinit.GPIO_Speed = GPIO_Speed_2MHz;  // Скорость низкая
ledinit.GPIO_Pin = GPIO_Pin_15; // Светодиод на 15м выводе

GPIO_Init(GPIOD, &ledinit);  // Функция, выполняющая настройку портов


Ну а для того, что бы зажечь/погасить светодиод в StdPeriph_Lib у нас есть функции GPIO_SetBits и GPIO_ResetBits, предоставляющие интерфейс к регистру GPIOx_BSRR. Пожалуйста, найдите ее в документации к библиотеке. Код включения и выключения светодиода будет выглядеть следующим образом:
// Включаем светодиод
GPIO_SetBits(GPIOD, GPIO_Pin_15);

...

// Теперь выключаем светодиод
GPIO_ResetBits(GPIOD, GPIO_Pin_15);


На этом написание кода завершено. В кокосе сверху выберите Project -> Rebuild и убедитесь что все скомпилировалось успешно.

Теперь подключим F4-Discovery и зальем скомпилированную прошивку. Для этого выбираем в кокосе Flash -> Program Download


Если все сделанно правильно, синий светодиод начнет мигать. Рекомендую теперь используя отладку поисследовать как все работает. Ну и для полного освоения работы с GPIO, посмотрите как работать с другими возможностями библиотеки в .chm файле(или прямо в исходнике stm32f4xx_gpio.h).

Заключение
Урок получился реально увесистым. В следующих уроках я не буду уделять так много времени простым мелочам и постараюсь уделить больше внимания ключевым аспектам работы с STM. Второй урок выложу примерно через неделю, в нем поговорим о тактовом генераторе.
Всем спасибо за внимание
  • +10
  • 13 января 2014, 19:48
  • thodnev

Комментарии (35)

RSS свернуть / развернуть
GPIO F4 полное = GPIO F2?
0
  • avatar
  • psv
  • 13 января 2014, 20:00
С F2 дела не имел, но посмотрев руководство к ним вижу 99% сходства, буквально пару слов поменяли.
0
Засуньте свое произведение под кат. Уроки — это хорошо, только не надо «вываливать» все на главную страницу.
0
А действительно, прошу прощения про кат совсем забыл
0
Спасибо! ждем продолжения
+1
Ух, сразу F4 ))
0
Каждый порт может контролировать до 15ти выводов МК
Не до 16 ли?

Планируется ли подробное рассмотрение альтернативных функций?
0
Да действительно, поправил.

Альтернативные функции будут рассматриваться по ходу курса, поскольку на данном этапе они только мешают пониманию. Думал завязать курс на устройстве которое будет разрабатываться и улучшаться с каждым уроком, но пока не придумал что это может быть. Скорее всего буду показывать на отдельных примерах как большинство других авторов
0
Да сделайте просто — настраиваем UART/PWM/SPI/I2C/ADC/DAC/DMA.
Хотя при большом желании можно уже и самому разобраться, но статья очень качественная.
0
Не до 16 ли?
Да не, всё правильно. От 0-го до 15-го. :))))
0
Input pull-up
Это вход с подтяжкой к питанию
Input-pull-down
По аналогии с предыдущим, этот вход — с подтяжкой к питанию
Исправьте.
0
Исплравил
0
Хорошее дело делаете. С нетерпением жду продолжения.
0
Уроки это всегда хорошо, но обычно все заканчивают после 2-3х уроков (((
+1
похоже, что Вы оказались правы.))
0
классика )
0
Для каждого порта можно выбрать свою скорость тактирования для каждой ножки МК
Это не скорость тактирования, а скорость переключения (точнее, управление скоростью нарастания напряжения на пине при переключении). Нужно для снижения создаваемых пинами при переключении помех. Желательно ставить на необходимый минимум, иначе могут возникнуть проблемы с наводками.

Ну и немного по форматированию.
Во первых, нежелательно использовать подчеркивание для выделения. Лучше заменить «заголовки» в списках на полужирный, а остальное на курсив.
Во вторых, желательно убрать обтекание текстом у картинки со схемой пина из даташита. Тем более, что в обтекающем тексте оказался и один из заголовков. У скрина из менеджера проекта — по желанию, но я бы его хотя бы перебросил направо.
+1
  • avatar
  • Vga
  • 14 января 2014, 06:20
Добрый день.
Вы писали
GPIO_Speed_100MHz High speed (высокая скорость 100MHz на
30 pF или 80 MHz на 15 pF)
Что за емкости и от чего они зависят?
0
Похоже на емкость нагрузки. Непонятно только, почему частота возрастает при большей емкости.
0
Возможно это емкость нагрузочного конденсатора, подключаемого внутри кристалла к пину для сглаживания фронтов.
0
Возможно это емкость нагрузочного конденсатора, подключаемого внутри кристалла к пину для сглаживания фронтов.
Никаких внутренних конденсаторов нет. Разработчики наоборот стремятся уменьшить паразитную емкость, чтоб не пришлось ставить более мощные драйверы для обеспкчения необходимой крутизны фронтов. Это необходимо для нормальной работы триггеров.
У STM32F417, например, внутренняя емкость пина = 5pF — заявлена в datasheet, в разделе Electrical characteristics. Максимальная частота в зависимости от емкости нагрузки (CL) по тому же документу составляет (таблица №46 «I/O AC characteristics»):
CL = 30 pF, VDD > 2.70 V = 100 MHz
CL = 30 pF, VDD > 1.8 V = 50 MHz
CL = 10 pF, VDD > 2.70 V = 200 MHz

Автор, похоже, что-то перепутал.
0
Спасибо за хорошие статьи! Очень жду статью про DMA, так как в этом не так просто разобраться и редко кто пишет об этом.
0
Автор, в КПИ такие статьи активно читают, пиши еще.
0
С одной стороны — прикольный туториал, с другой стороны — да сколько уже можно, божежтымой…
+1
Самая большая проблема большинства подобных статей — они частенько заканчиваются первой частью, ну или 2-3 частями. Посмотрим, дойдет ли автор до CAN, USB, FSMC и Ethernet MAC :) Многие даже до прерываний и таймеров не дошли :)
+1
Эту проблему можно было бы решить, если бы очередной автор не начинал курс с начала, а продолжил дропнутое предыдущим)
+1
надо назначить премию тому, кто действительно дойдет в своих объяснениях про STM32, как тут правильно заметили, до CAN, USB, FSMC и Ethernet MAC:))). Может хоть это поможет…
0
Хотя это и не совсем тема для первого урока, но про мультиплексирование и альтернативные функции выводов, по-моему, всё же есть смысл рассказать чуток подробнее… :)
0
Странное затишье.
Где продолжение?
0
Где продолжение?
Смотри несколькими постами выше. :)
0
Вопрос может быть и глупый, но меня поставил в тупик. Настраиваем порт на выход с открытым стоком и подтягивающий резистор к питанию. ничего не выводим(по умолчанию 0). судя по схеме в даташите если это будет любой из светодиодов на дискавери он должен гореть(очень тускло но гореть, сопротивление 40К+680). Почему этого не происходит? Он загорается только когда мы выводим 1.
0
получается что в режиме с открытым стоком у нас в «0» транзистор открыт?
0
Разумеется, на то он и открытый сток — при нуле тянет вниз, при единице — HiZ.
0
Жаль продолжения нету, уже как раз год прошёл. Может появится урок номер 2!!! :)
0
Видать энтузиазм у автора закончился. Написание такой статьи труд нелёгкий, и если человек не получает за него желаемого, он надоедает и пропадает интерес (хотя бы ЧСВ от мысли, что для кого-то являешься Учителем).
+2
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.