BÀI 02 : GPIO TRONG STM8S




  1. Lý thuyết về GPIO.
  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. Ở STM8S 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ó PortB mà lại không có PortA). Mỗi Port thường có 8 chân đánh số từ 0 -> 7 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 năng chínhGPIO của STM8S:

    • Có thể cấu hình riêng từng bit của PORT hoặc cả PORT là input hoặc Output.
    • Select các mode input: để nổi* hoặc gắn điện trở kéo lên**.
    • Select các mode output : push-pull*** hay open-drain****.
    • 5 V tolerant input : là những chân chịu được điện áp 5V đầu vào mà không làm chết chân VĐK đó(các chân bình thường có đầu vào là 3V3 nếu sử dụng mức 5V trong thời gian lâu dài sẽ gây chết chân VĐK đó – khái niệm này phổ biến hơn ở STM32 vì nó sử dụng điện áp vào là 3V3 còn ở STM8S thì có thể cấp nguồn 5V).
    • Có ngắt ngoài cho các chân riêng biệt.
    • Có chế độ input Schmitt trigger cho các chân analog để tiết kiệm năng lượng.
    • * Để nổi tức là mức logic của chân tín hiệu khi không tác động ở giữa mức 0 hay 1(vd khi cấp nguồn cho vi điều khiển là 3V3 thì mức 1 là 3,3V điện áp, mức 0 là 0V điện áp, để nổi tức là khi chúng ta lấy đồng hồ đo điện áp đo ở chân VĐK thì điện áp đo được ở giữa mức 0V và 3V3- vd: 2.2V, 1.0 V).

      ** Điện trở kéo lên có nghìa là bên trong chân VĐK đó(bên trong chip) có gắn 1 con điện trở nối thẳng lên nguồn hoạt động(vd : 3V3 với STM8S ) mục đích để xác định rõ mức tín hiệu chỉ là 0 hoặc 1. Trở kéo xuống cũng được sử dụng với mục đích như vậy.

      ***,**** : để hiểu rõ push-pull và open-drain thì các bạn quan sát hình sau.

      2 chỗ mình khoanh tròn chính là mấu chốt của push-pull và open-drain, đó chính là con P-MOS(ở trên) và N-MOS(ở dưới) được kết nối ở ngõ ra.

      • Ở chế độ push-pull thì mức “0” tức là N-MOS hoạt động, ngõ ra được nối GND, mức “1” thì P-MOS hoạt động ngõ ra được nối VDD.
      • Ở chế độ open-drain thì mức “0” N-MOS hoạt động, ngõ ra được nối GND trong khi mức 1 thì P-MOS không hoạt động. Ngõ ra ở trạng thái tự do(Không nối GND cũng không nối VDD).

    Chú ý: 2 chân PB4 và PB5 của STM8S003F3P6 được mặc định là open-drain nên khi thiết kế với LED thì cần thiết kế như sau. Nếu ngược lại sẽ không hoạt động.

    Cấu hình chân cho UART, SPI, I2C cũng tạm gọi là GPIO nhưng cách cấu hình sẽ được hướng dẫn ở các bài sau.

  3. Cách cấu hình sử dụng thư viện ST.
    1. Các mode cấu hình GPIO có trong thư viện ST:
      • GPIO_MODE_IN_FL_NO_IT : cấu hình là ngõ vào, để nổi, không có ngắt.
      • GPIO_MODE_IN_PU_NO_IT: cấu hình là ngõ vào, trở nối nguồn, không có ngắt.
      • GPIO_MODE_IN_FL_IT : cấu hình là ngõ vào, để nổi, có ngắt.
      • GPIO_MODE_IN_PU_IT : cấu hình là ngõ vào, trở nối nguồn, có ngắt.
      • GPIO_MODE_OUT_OD_LOW_FAST : cấu hình là ngõ ra, open-drain, ban đầu là mức 0, tốc độ tối đa là 10Mhz.
      • GPIO_MODE_OUT_PP_LOW_FAST: cấu hình là ngõ ra, push-pull, ban đầu là mức 0, tốc độ tối đa là 10Mhz.
      • GPIO_MODE_OUT_OD_LOW_SLOW: cấu hình là ngõ ra, open-drain, ban đầu là mức 0, tốc độ tối đa là 2Mhz.
      • GPIO_MODE_OUT_PP_LOW_SLOW: cấu hình là ngõ ra, push-pull, ban đầu là mức 0, tốc độ tối đa là 2Mhz.
      • GPIO_MODE_OUT_OD_HIZ_FAST: cấu hình là ngõ ra, open-drain, ban đầu là mức 1, tốc độ tối đa là 10Mhz.
      • GPIO_MODE_OUT_PP_HIGH_FAST: cấu hình là ngõ ra, push-pull, ban đầu là mức 1, tốc độ tối đa là 10Mhz.
      • GPIO_MODE_OUT_OD_HIZ_ SLOW : cấu hình là ngõ ra, open-drain, ban đầu là mức 1, tốc độ tối đa là 2Mhz.
      • GPIO_MODE_OUT_PP_HIGH_SLOW: cấu hình là ngõ ra, push-pull, ban đầu là mức 1, tốc độ tối đa là 2Mhz.
    2. Một số hàm xuất nhập chính trong thư viện ST:
      • GPIO_Init(x1,x2,x3) : hàm cấu hình chung cho bất kì chân nào với tham số truyền vào là x1,x2,x3.
      • GPIO_Write(x1,x2): hàm xuất giá trị cho 1 port với tham số vào là x1,x2.
      • GPIO_WriteHigh(x1,x2) : hàm xuất giá trị mức cao cho từng chân với tham số vào là x1, x2.
      • GPIO_WriteLow(x1,x2) : hàm xuất giá trị mức thấp cho từng chân với tham số vào là x1, x2.
      • GPIO_WriteReverse(x1,x2) : hàm đảo trạng thái của chân GPIO(1 chuyển thành 0 và ngược lại) với tham số vào là x1,x2.
      • GPIO_ReadOutputData(x1) : hàm đọc trạng thái của xuất ra 1 port với tham số truyền vào là x1.
      • GPIO_ReadInputData(x1) : hàm đọc tráng thái input của 1 port với tham số truyền vào là x1.
      • GPIO_ReadInputPin(x1,x2) : hàm đọc trạng thái input của 1 pin với tham số truyền vào là x1,x2.

      Ngoài ra còn 1 số hàm khác, các bạn có thể tham khảo trong file stm8s_gpio.c.

      Chú ý :

      • Kết quả đọc về của hàm GPIO_ReadInputPin(x1,x2) là giá trị 8bit nên tránh sử dụng GPIO_ReadInputPin(x1,x2) = 1. Trường hợp này chỉ đúng khi chân IO đó là Px0(ví dụ PA0…).
      • Tùy vào cách thiết kế phần cứng(button, led …) mà linh hoạt sử dụng các hàm GPIO input và output cho phù hợp
    3. Ví dụ tham khảo cấu hình GPIO trong STVD:
      • Thiết kế phần cứng của ví dụ này:
      • Cấu hình chân PD2,PD3 là chân Output, chân PA3 là input.
      • Đọc dữ liệu từ chân PA3, xuất tín hiệu ra chân PD2,PD3.
    4. Hàm Delay tương đối*
    5. * 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_delay--)”là 1ns, lặp lại lệnh đó 1000 lần chúng ta sẽ có được thời gian delay là 1uS- “time_delay” là tham số truyền vào.

  4. Thanh ghi GPIO thông dụng.
    1. Px_ODR – port x output data register.
    2. Thanh ghi này được sử dụng với mục đích ghi mức logic ra chân VĐK tương ứng với các bit và đọc trạng thái output(hàm GPIO_ReadOutputData(x1,x2)). Vd : ODR0 =1 chân tương ứng Px0 là mức cao và ngược lại.

    3. Px_IDR – Port X input data register.
    4. Thanh ghi này có chức năng đọc trạng thái input của chân VĐK. Vd IDR0 = 0 tức là chân Px0 đang ở mức logic thấp và ngược lại.

    5. Px_DDR – Port x data direction register.
    6. Thanh ghi này có chức năng cấu hình chân VĐK là chân input hoặc output. Vd: DDR0 = 0 chân Px0 là chân input và ngược lại.

    7. Px_CR1 – Port x control register 1.
    8. Thanh ghi này kết hợp với thanh ghi Px_DDR cấu hình mode floating, pull –up, push-pull…. Cho chân VĐK. Vd DDR0=0,CR1_0 =0 thì chân VĐK sẽ là mode input floating.

    9. Px_CR2 - Port x control register 2.
    10. Thanh ghi này kết hợp với thanh ghi Px_DDR cấu hình có ngắt hoặc không(với mode input) và tốc độ output(với mode output). Vd : DDR0=0, CR2_0 = 0 thì chân VĐK sẽ là chân input và không có ngắt đầu vào.

  5. Bài tập.
    1. Cấu hình STM8S để xuất trạng thái đảo giữa 2 chân PD2 và PD3 trong thời gian 1s. ví dụ: chân PD2 tắt thì chân PD3 on và ngược lại.
    2. Cấu hình STM8S để chớp tắt led trên chân PD2 3 lần chu kì 1s(3 lần sáng 3 lần tắt) sau đó chân PD3 sáng 1s, chân PD2 tắt. Sau 1s cả 2 đều tắt và lặp lại chu kì ban đầu.
    3. Đọc trạng thái nút nhấn PA3 để khi nhấn nút led ở PD2 vad PD3 sáng và giữ trạng thái 1s, sau khi thả nút 2 led ở PD2 vad PD3 tắt.


    DOWNLOAD CODE

Link tải giao tiếp với nút nhấn không dùng ngắt STVP Project DownloadIAR Project Download

Link tải nháy led đảo trạng thái ở PD2,PD3 STVP Project DownloadIAR Project Download