Речь пойдёт о программе на МК STM32 которая позволит нам зажигать диоды при нажатии кнопки.
Я пользуюсь отладочной платой STM32F4 discovery. Очёнь удобно и быстро. + не дорого
Приступим.
Я пользуюсь Eclipse + ST utility + gdb
Первым делом подключаем заголовочный файл для работы с контроллерами stm32f4 :
#include <stm32f4xx.h>
Как подключать либы рассказывать не буду.
Обзовём константу для управления портом D (там наши диоды) новым именем:
#define LED_PORT GPIOD
Также создадим константы для каждого пина порта с диодом:
#define LED_GREEN (1 << 12) /* port D, pin 12 */ #define LED_ORANGE (1 << 13) /* port D, pin 13 */ #define LED_RED (1 << 14) /* port D, pin 14 */ #define LED_BLUE (1 << 15) /* port D, pin 15 */
Теперь добавим функцию для инициализации необходимой переферии:
static inline void setup_leds(void){ RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // разрешаем тактирование порта D (диоды) RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // и порта A (кнопка) GPIOA->MODER &= ~GPIO_MODER_MODER0; // укажем что пин кнопки - вход LED_PORT->MODER |= GPIO_MODER_MODER12_0 | GPIO_MODER_MODER13_0 | GPIO_MODER_MODER14_0 | GPIO_MODER_MODER15_0; /// на диоды - выход }
Также укажем функцию которая гасит все диоды:
static inline void switch_leds_off(void){ LED_PORT->ODR = 0; }
Для разнообразия включать диоды будем прямо из функции main.
А вот и она:
void main(void){ setup_leds(); // инициализация while (1) { if (GPIOA->IDR & GPIO_IDR_IDR_0) { // если кнопка нажата (на нулевом пине есть потенциал) LED_PORT->ODR = LED_BLUE | LED_ORANGE | LED_RED | LED_GREEN; // включаем диоды } else { switch_leds_off(); //гасим } } }
Теперь при нажатии по кнопке все диоды загорятся, а когда отпустите — потухнут.
Скачать проект.