Есть ли у вас вопросы?
Краткое предыдущей серии
Цели на сегодня (те же, что и в прошлый раз):
Контакты микроконтроллера
Что из этого нам сегодня нужно?
STM32f103RBT6
STM32 VL Discovery
Как же зажечь светодиод
Как считать состояние кнопки?
Подвох
Пример
А при чтении?
Что же делать?
Запись одного бита
Чтение одного бита
Запись нескольких бит
Чтение нескольких бит (аналогично)
Как помигать светодиодом?
Как подождать?
А можно ли чуть попроще помигать?
493.77K
Category: programmingprogramming

Контакты микроконтроллера

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

2. Краткое предыдущей серии

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

3. Цели на сегодня (те же, что и в прошлый раз):

1. Зажечь светодиод
2. Погасить светодиод
3. Помигать светодиодом
4. Помигать по нажатию кнопки (bonus level)

4. Контакты микроконтроллера

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

5. Что из этого нам сегодня нужно?

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

6. STM32f103RBT6

На плате discovery не доступны:
PA13, PA14, PA15; PB3,PB4; PC14, PC15; PD0, PD1

7. STM32 VL Discovery

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

8. Как же зажечь светодиод

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

9. Как считать состояние кнопки?

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

10. Подвох

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

11. Пример

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

12. А при чтении?

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

13. Что же делать?

Битовые операции языка С!

14. Запись одного бита

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

15. Чтение одного бита

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

16. Запись нескольких бит

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

17. Чтение нескольких бит (аналогично)

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

18. Как помигать светодиодом?

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

19. Как подождать?

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

20. А можно ли чуть попроще помигать?

Можно:
1. Подождать
2. Инвертировать состояние ножки
3. Повторить 1-2
English     Русский Rules