QC

Đọc Trạng Thái GPIO STM32 Libopencm3

 Đọ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(LEDPORTGPIO_MODE_OUTPUTGPIO_PUPD_NONELEDPIN);

     rcc_periph_clock_enable(RCC_GPIOB);
    gpio_set_mode(GPIOBGPIO_MODE_OUTPUTGPIO_PUPD_NONEGPIO9);

}
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(GPIOAGPIO_MODE_INPUT,
              GPIO_CNF_INPUT_PULL_UPDOWNGPIO8);
    
}
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 = 0i < 1000000i++) { /* Wait a bit. */
            __asm__("nop");
        }
        gpio_clear(GPIOC,GPIO13);
        for (i = 0i < 1000000i++) { /* Wait a bit. */
            __asm__("nop");
        }

        if (gpio_get(GPIOAGPIO8)) {
            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(LEDPORTGPIO_MODE_OUTPUTGPIO_PUPD_NONELEDPIN);


     rcc_periph_clock_enable(RCC_GPIOB);
     gpio_set_mode(GPIOBGPIO_MODE_OUTPUTGPIO_PUPD_NONEGPIO9);


}

Trong đó : 

 rcc_periph_clock_enable(RCC_GPIOB); // cấp Clock cho PORT B.

gpio_set_mode(GPIOBGPIO_MODE_OUTPUTGPIO_PUPD_NONEGPIO9); // B9 OUTPUTS.

 

rcc_periph_clock_enable(RCCLEDPORT); // CẤP CLOCK PORT C

 gpio_set_mode(LEDPORTGPIO_MODE_OUTPUTGPIO_PUPD_NONELEDPIN); // 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(GPIOAGPIO_MODE_INPUT,
              GPIO_CNF_INPUT_PULL_UPDOWNGPIO9);
    

}

Trong đó : 

rcc_periph_clock_enable(RCC_GPIOA); // Cấp CLOCK PORT A.

gpio_set_mode(GPIOAGPIO_MODE_INPUTGPIO_CNF_INPUT_PULL_UPDOWNGPIO8); // 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 = 0i < 1000000i++) { /* Wait a bit. */
            __asm__("nop");
      }
    gpio_clear(GPIOC,GPIO13);// TẮT LED GPIOC_13
        for (i = 0i < 1000000i++) { /* Wait a bit. */
            __asm__("nop");

        }

Đọc GPIO.

       if (gpio_get(GPIOAGPIO8)) { // 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
            

        }






Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...