BÀI 02 : GPIO VỚI STM32F1.


  1. Sơ lược về lý thuyết.
  2. GPIO là từ viết tắt của General purpose I/O ports tạm hiểu là nơi giao tiếp chung giữa tín hiệu ra và tín hiệu vào. GPIO là bài cơ bản, cần nắm vững khi học bất kì một VĐK nào đó. Cần hiểu được các thuật ngữ, chế độ, cấu hình, số lượng… của các chân GPIO. Ở STM32 thì các chân GPIO chia ra làm nhiều Port vd: PortA, PortB….. Số lượng Port phụ thuộc vào số lượng chân(pin) và cách gọi phụ thuộc vào nhà sản xuất(ví dụ VĐK X có PortA mà lại không có PortD). Mỗi Port thường có 16 chân đánh số từ 0 -> 15 tương ứng với mỗi chân là 1bit. Mỗi chân có 1 chức năng khác nhau như analog input, external interrupt.. hay đơn thuần chỉ là xuất tín hiệu on/off ở mức 0,1. Chức năng của mỗi chân thì chúng ta cần tra datasheet của nhà sản xuất trước khi lập trình hoặc thiết kế mạch.

    Các tính mode GPIO của STM32:

    • Input floating : cấu hình chân I/O là ngõ vào và để nổi.
    • Input pull-up : cấu hình chân I/O là ngõ vào, có trở kéo lên nguồn.
    • Input-pull-down: cấu hình chân I/O là ngõ vào, có trở kéo xuống GND.
    • Analog : cấu hình chân I/O là Analog, dùng cho các mode có sử dụng ADC hoặc DAC.
    • Output open-drain: cấu hình chân I/O là ngõ ra, khi output control = 0 thì N-MOS sẽ dẫn, chân I/O sẽ nối VSS, còn khi output control = 1 thì P-MOS và N-MOS đều không dẫn, chân I/O được để nổi.
    • Output push-pull: cấu hình chân I/O là ngõ ra, khi output control = 0 thì N-MOS sẽ dẫn, chân I/O sẽ nối VSS, còn khi output control = 1 thì P-MOS dẫn, chân I/O được nối VDD.
    • Alternate function push-pull : sử dụng chân I/O vừa là ngõ ra và vừa là ngõ vào, tuy nhiên sẽ không có trở kéo lên và kéo xuống ở input, chức năng output giống Output push-pull. Ngoài ra nó còn để sử dụng cho chức năng remap.
    • Alternate function push-pull : : sử dụng chân I/O vừa là ngõ ra và vừa là ngõ vào, tuy nhiên sẽ không có trở kéo lên và kéo xuống ở input, chức năng output giống Output open-drain. Ngoài ra nó còn để sử dụng cho chức năng remap.

    Để xem cấu hình chức năng như thế nào cho chân I/O ví dụ USART là Alternate function push-pull hay là cái gì khác thì cần xem phần 9.1.11 GPIO configurations for device peripherals.

  3. Cấu hình với thư viện chuẩn của ST.
  4. Khi lập trình C++ với các loại vi điều khiển nói riêng thì chúng ta nên viết chương trình bằng cách dùng các chương trình con như vậy thì chương trình sẽ mạch lạc hơn, dễ kiểm soát hơn cũng như chuyên nghiệp hơn…

    1. Thiết kế phần cứng với LED.
    2. Có 2 cách thiết kế Led với STM32 hay nôm na còn gọi là kích âm hoặc kích dương, khi thiết kế cần chú ý tránh sử dụng các chân nạp, chân đặc biệt trên STM32. Dưới đây là 2 cách thiết kế thường hay sử dụng nhất.

      Tương tự cũng có 2 cách cấu hình với nút nhấn:

    3. Chương trình con cấu hình led.
    4. Cấp clock cho ngoại vi là việc quan trọng và thiết yếu khi lập trình STM32. Cần nhớ là phải cấp clock trước tiên khi cấu hình.

    5. Hàm delay tương đối.
    6. Delay tương đối có nghĩa là dựa vào thời gian thực hiện 1 lệnh của CPU để thực hiện delay. Vd : thời gian thực hiện câu lệnh lệnh “while(time_n!=0){time_n--;}”là 1ns, lặp lại lệnh đó 1000 lần chúng ta sẽ có được thời gian delay là 1uS- “time_n” là tham số truyền vào được nhân lên 12000.

    7. Chương trình thưc thi trong main.
    8. Cấu hình chân PC13 là Mode input.
    9. Chúng ta có để sử dụng hàm GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13)=x; trong đó x= 0 hoặc 1 để đọc giá trị nút nhấn về.

      Các bạn vào view -> functions window để hiển thị các hàm có sẵn trong thư viện chuẩn.

  5. Một số thanh ghi quan trọng.
    1. GPIOx_CRx - Port configuration register.
    2. Mỗi pin có 2 cặp bit để cài đặt. CNF quyết định là mode analog, floating, pull-up… còn MODE quyết định là input hay output. Output với tốc độ bao nhiêu.

      Thanh ghi mode:

      • 00: Input mode (reset state).
      • 01: Output mode, max speed 10 MHz.
      • 10: Output mode, max speed 2 MHz.
      • 11: Output mode, max speed 50 MHz.

      Thanh ghi CNF:

      • Khi là input:
        • 00: Analog mode.
        • 01: Floating input (reset state).
        • 10: Input with pull-up / pull-down.
        • 11: Reserved.
      • Khi là output:
        • 00: General purpose output push-pull.
        • 01: General purpose output Open-drain.
        • 10: Alternate function output Push-pull .
        • 11: Alternate function output Open-drain.
    3. GPIOx_IDR - Port input data register.
    4. Đây là thanh ghi đọc giá trị đầu vào của từng chân. Khi đầu vào ở chân nào đó có mức logic là 1 thì bit tương ứng với chân đó sẽ có giá trị là 1. Và ngược lại là 0.

    5. GPIOx_ODR - Port output data register
    6. Đây là thanh ghi quyết định mức logic của đầu ra trên chân STM32 tương ứng với mode output. Giá trị của bit nào ở mức cao thì output của nó sẽ ở mức cao nếu sử dụng mode output push pull và ngược lại. Riêng mode output open drain thì có chút khác biệt.

  6. Bài tập.
    1. Chỉ sử dụng lệnh GPIO_WriteBit để chớp tắt led trên chân PB9 kết hợp với hàm delay tương đối với giá trị delay là 1000.
    2. Sử dụng button trên chân PC13 để điều khiển led. Nhấn lần 1 led sáng, nhấn lần 2 led tắt. Cứ lặp đi lặp lại như vậy.
    3. Chỉ sử dụng 1 lệnh GPIO_WriteBit để chớp tắt led trên chân PB9
Link tải chương trình mẫu