Скачать презентацию Есть ли у вас вопросы Краткое предыдущей Скачать презентацию Есть ли у вас вопросы Краткое предыдущей

11 - Семинар.pptx

  • Количество слайдов: 20

Есть ли у вас вопросы? Есть ли у вас вопросы?

Краткое предыдущей серии • Как можно подключить светодиод к микроконтроллеру? • А кнопку? • Краткое предыдущей серии • Как можно подключить светодиод к микроконтроллеру? • А кнопку? • Какие параметры у контактов МК мы можем менять? • А как? • Что такое «регистры периферийных устройств» ? • Как зажечь светодиод?

Цели на сегодня (те же, что и в прошлый раз): 1. Зажечь светодиод 2. Цели на сегодня (те же, что и в прошлый раз): 1. Зажечь светодиод 2. Погасить светодиод 3. Помигать светодиодом 4. Помигать по нажатию кнопки (bonus level)

Контакты микроконтроллера (они же «пины» , «ноги» , «выводы» ) Тип: • цифровой • Контакты микроконтроллера (они же «пины» , «ноги» , «выводы» ) Тип: • цифровой • аналоговый Режим входа: • С подтяжкой (вверх/вниз) • Без подтяжки (floating) Направление: • вход • выход Режим выхода: • Комплементарный (Push pull) • Открытый сток (Open drain) Режим: • Ввод/вывод общего назначения (GPIO) • Альтернативный Текущее состояние: • входа (только чтение) • выхода (чтение/запись)

Что из этого нам сегодня нужно? Чтобы зажечь светодиод на плате discovery, нам нужна Что из этого нам сегодня нужно? Чтобы зажечь светодиод на плате discovery, нам нужна ножка в режиме комплементарного выхода (output push-pull). Чтобы считать состояние кнопки – вход без подтяжки (input floating).

STM 32 f 103 RBT 6 На плате discovery не доступны: PA 13, PA STM 32 f 103 RBT 6 На плате discovery не доступны: PA 13, PA 14, PA 15; PB 3, PB 4; PC 14, PC 15; PD 0, PD 1

STM 32 VL Discovery Два светодиода, подключенные к земле и МК: • PC. 8 STM 32 VL Discovery Два светодиода, подключенные к земле и МК: • PC. 8 • PC. 9 Две кнопки: • Черная – это reset • Синяя – PA. 0 – просто кнопка с внешней подтяжкой к земле

Как же зажечь светодиод 1. Подать питание на нужный порт – через регистр RCC->APB Как же зажечь светодиод 1. Подать питание на нужный порт – через регистр RCC->APB 2 ENR 2. Настроить режим нужного контакта в нужном порту (нужен режим output push pull) – через регистр GPIOx->CRH или CRL 3. Вывести на контакт высокий уровень – через регистр GPIOx->ODR

Как считать состояние кнопки? 1. Подать питание на нужный порт – через регистр RCC->APB Как считать состояние кнопки? 1. Подать питание на нужный порт – через регистр RCC->APB 2 ENR 2. Настроить режим нужного контакта в нужном порту (нужен режим input floating) – через регистр GPIOx->CRH или CRL 3. Проверить уровень на нужном контакте – через регистр GPIOx->IDR

Подвох При записи и чтении регистров нас, как правило, волнуют состояния отдельных бит. • Подвох При записи и чтении регистров нас, как правило, волнуют состояния отдельных бит. • При чтении нужно читать ТОЛЬКО отдельные биты • При записи нужно менять ТОЛЬКО отдельные биты Почему? Потому что состояние других бит может отражать чтонибудь еще.

Пример Мы хотим зажечь светодиод на ножке РС 8. Для этого нужно установить восьмой Пример Мы хотим зажечь светодиод на ножке РС 8. Для этого нужно установить восьмой бит в регистре GPIOC->ODR. Например вот так: GPIOC->ODR = 256; Но ведь так мы не только установим восьмой бит! Мы еще и сбросим все остальные биты!

А при чтении? Мы хотим проверить, нажата ли кнопка на РА 0. Нужно проверить А при чтении? Мы хотим проверить, нажата ли кнопка на РА 0. Нужно проверить нулевой бит в регистре IDR: GPIOA->IDR == 1; Но ведь это проверяет не только первый бит на равенство единице! Это проверяет и равенство всех остальных битов нулю.

Что же делать? Битовые операции языка С! Что же делать? Битовые операции языка С!

Запись одного бита • Установка одного бита: – a |= 1<<7; // установить седьмой Запись одного бита • Установка одного бита: – a |= 1<<7; // установить седьмой бит • Сброс одного бита: – a &= ~(1<<3); // сбросить третий бит • Инверсия одного бита: – a ^= 1<<5; // инверсия пятого бита

Чтение одного бита if( a & (1<<7) ) – это условие истинно, если седьмой Чтение одного бита if( a & (1<<7) ) – это условие истинно, если седьмой бит равен единице. Писать if( a & (1<<7) == 1<<7) можно, но бессмысленно. Скобки лучше ставить. Серьезно.

Запись нескольких бит • Объединение через ИЛИ: – a |= (1<<7) | (1<<8); // Запись нескольких бит • Объединение через ИЛИ: – a |= (1<<7) | (1<<8); // установить седьмой и восьмой биты • Три волшебных числа: – a |= 0 x 3<<7; // установить седьмой и восьмой биты – a |= 0 x 7<<7; // установить седьмой, восьмой и девятый биты – a |= 0 x. F<<7; // установить 7, 8, 9 и 10 й биты • Шестнадцатеричный код без сдвигов: – 016 === 00002. Т. е. 10016 == 1 00002 – a |= 0 x 180; // == a |= (1<<7) | (1<<8)

Чтение нескольких бит (аналогично) • Объединение через ИЛИ: – a & (1<<7 | 1<<8) Чтение нескольких бит (аналогично) • Объединение через ИЛИ: – a & (1<<7 | 1<<8) • Три волшебных числа: – a & (3<<7) • Шестнадцатеричный код без сдвигов: – a & 0 x 180

Как помигать светодиодом? Что такое мигание? Это когда какое-то время светодиод горит, а потом Как помигать светодиодом? Что такое мигание? Это когда какое-то время светодиод горит, а потом какое-то время не горит! Значит, нужно: 1. Зажечь светодиод 2. Подождать 3. Погасить светодиод 4. Подождать 5. Повторить 1 -4

Как подождать? С помощью функции delay? Но как она работает? Самый простой способ – Как подождать? С помощью функции delay? Но как она работает? Самый простой способ – пустой цикл for: for(uint 32_t i=0; i<1000; i++) {; } Ничего не делать 1000 раз подряд. Количество итераций выбирается либо на глаз, либо исходя из частоты процессора (у нас – 72 МГц)

А можно ли чуть попроще помигать? Можно: 1. Подождать 2. Инвертировать состояние ножки 3. А можно ли чуть попроще помигать? Можно: 1. Подождать 2. Инвертировать состояние ножки 3. Повторить 1 -2