Đọc Trạng Thái GPIO STM32 Libopencm3
Yêu cầu bài toán : Lập trình đọc nút nhấn, khi nhấn chân PA8, đèn led B9 sáng, khi hết nhấn thì Led nối chân B9 tắt.PC13 Luôn nhấp nháy.
Sơ đồ shematic như sau:
#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/gpio.h>
#include <stdint.h>
#define RCCLEDPORT (RCC_GPIOC)
#define LEDPORT (GPIOC)
#define LEDPIN (GPIO13)
#define GPIO_MODE_OUTPUT GPIO_MODE_OUTPUT_2_MHZ
#define GPIO_PUPD_NONE GPIO_CNF_OUTPUT_PUSHPULL
static void gpio_setup(void)
{
/* Enable GPIO clock. */
/* Using API functions: */
rcc_periph_clock_enable(RCCLEDPORT);
/* Set pin to 'output push-pull'. */
/* Using API functions: */
gpio_set_mode(LEDPORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LEDPIN);
rcc_periph_clock_enable(RCC_GPIOB);
gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO9);
}
static void button_setup(void)
{
/* Enable GPIOA clock. */
rcc_periph_clock_enable(RCC_GPIOA);
/* Set GPIO9 (in GPIO port A) to 'input with pull-up resistor'. */
gpio_set_mode(GPIOA, GPIO_MODE_INPUT,
GPIO_CNF_INPUT_PULL_UPDOWN, GPIO8);
}
int main(void)
{
int i;
gpio_setup();
button_setup();
/* Blink the LED on the board. */
while (1) {
/* Using API function gpio_toggle(): */
gpio_set(GPIOC,GPIO13);
for (i = 0; i < 1000000; i++) { /* Wait a bit. */
__asm__("nop");
}
gpio_clear(GPIOC,GPIO13);
for (i = 0; i < 1000000; i++) { /* Wait a bit. */
__asm__("nop");
}
if (gpio_get(GPIOA, GPIO8)) {
gpio_set(GPIOB,GPIO9);
}
else
{
gpio_clear(GPIOB,GPIO9);
}
}
return 0;
}
Giải thích code.
I.Hàm cấu hình OUTPUTS STM32-Libopencm3.
static void gpio_setup(void)
{
/* Enable GPIO clock. */
/* Using API functions: */
rcc_periph_clock_enable(RCCLEDPORT);
/* Set pin to 'output push-pull'. */
/* Using API functions: */
gpio_set_mode(LEDPORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LEDPIN);
rcc_periph_clock_enable(RCC_GPIOB);
gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO9);
}
Trong đó :
rcc_periph_clock_enable(RCC_GPIOB); // cấp Clock cho PORT B.
gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO9); // B9 OUTPUTS.
rcc_periph_clock_enable(RCCLEDPORT); // CẤP CLOCK PORT C
gpio_set_mode(LEDPORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LEDPIN); // PC_13 Là outputs
Chú ý :
#define RCCLEDPORT (RCC_GPIOC)
#define LEDPORT (GPIOC)
#define LEDPIN (GPIO13)
#define GPIO_MODE_OUTPUT GPIO_MODE_OUTPUT_2_MHZ
#define GPIO_PUPD_NONE GPIO_CNF_OUTPUT_PUSHPULL
II. Cấu Hình Đọc / READ GPIO STM32 Libopencm3.
static void button_setup(void)
{
/* Enable GPIOA clock. */
rcc_periph_clock_enable(RCC_GPIOA);
/* Set GPIO9 (in GPIO port A) to 'input with pull-up resistor'. */
gpio_set_mode(GPIOA, GPIO_MODE_INPUT,
GPIO_CNF_INPUT_PULL_UPDOWN, GPIO9);
}
Trong đó :
rcc_periph_clock_enable(RCC_GPIOA); // Cấp CLOCK PORT A.
gpio_set_mode(GPIOA, GPIO_MODE_INPUT, GPIO_CNF_INPUT_PULL_UPDOWN, GPIO8); // CẤU HÌNH INPUTS CHO A8.
Trong hàm main.
khởi tạo GPIO và BUTTON.
gpio_setup();
button_setup();
Blynk Led. ( Có thể dùng hàm như bài 1 Toggle).
gpio_set(GPIOC,GPIO13); // BẬT LED GPIOC_13
for (i = 0; i < 1000000; i++) { /* Wait a bit. */
__asm__("nop");
}
gpio_clear(GPIOC,GPIO13);// TẮT LED GPIOC_13
for (i = 0; i < 1000000; i++) { /* Wait a bit. */
__asm__("nop");
}
Đọc GPIO.
if (gpio_get(GPIOA, GPIO8)) { // NIẾU ĐỌC ĐƯỢC GPIO =1.
gpio_set(GPIOB,GPIO9); // BẬT LED B9
}
else
{
gpio_clear(GPIOB,GPIO9); // NGƯỢC LẠI THÌ TẮT
}