🌱 STM32 - 4. Tổng quan ngoại vi GPIO Vi Điều Khiển STM32
Trong vi điều khiển STM32, GPIO (General Purpose Input/Output) là một trong những ngoại vi cơ bản và được sử dụng nhiều nhất. Nó cho phép vi điều khiển giao tiếp trực tiếp với thế giới bên ngoài thông qua các chân (pin) vật lý trên chip. Mỗi chân GPIO có thể được cấu hình linh hoạt để thực hiện nhiều chức năng khác nhau như đọc tín hiệu từ nút bấm, điều khiển LED, tạo tín hiệu PWM, hoặc thậm chí giao tiếp với các giao thức như I2C, SPI khi cần. Trong bài này, chúng ta sẽ khám phá các chế độ hoạt động chính của GPIO và cách chúng được ứng dụng trong thực tế.
Trước khi đi vào chi tiết, chúng ta sẽ cùng tìm hiểu về các đặc điểm, chức năng và chế độ hoạt động của ngoại vi GPIO trong vi điều khiển STM32.
Cấu trúc của GPIO trong STM32
Trong STM32 (ví dụ STM32F401), GPIO được tổ chức thành các port (cổng), thường được ký hiệu là GPIOA, GPIOB, GPIOC,... Mỗi port chứa 16 chân (pin) từ 0 đến 15, và mỗi chân có thể được cấu hình độc lập. Các port này được kết nối với bus AHB1, do đó cần được cấp clock từ module RCC (xem bài trước) trước khi sử dụng. Số lượng port phụ thuộc vào dòng STM32, ví dụ STM32F401 có 5 port từ GPIOA đến GPIOE.
Để sử dụng GPIO, bạn cần:
- Enable clock cho port tương ứng trong RCC (RCC_AHB1ENR).
- Cấu hình chế độ hoạt động của từng chân qua các thanh ghi GPIO.
GPIO Input
Hai chức năng cơ bản nhất của GPIO là Input (đầu vào) và Output (đầu ra). Với Input, có nhiều mode khác nhau trong vi điều khiển STM32, bao gồm: Floating (thả nổi), Input Pull-up, và Input Pull-down.
👀 Floating - thả nổi
Là kiểu đầu vào mà ở trạng thái mặc định nó có trở kháng cao (không cho dòng điện đi ra), giá trị pin đọc được phụ thuộc giá trị đầu vào tác động từ bên ngoài.
Ví dụ: Trong hình 2, khi không kích hoạt số 1 và 2 (pull-up/pull-down) thì Input ở chế độ Floating.
Mode này tiêu thụ năng lượng điện của mạch rất nhỏ, chúng cực kỳ hữu ích cho việc đọc một cảm biến (Analog Input).
👀 Input Pull-up & Input Pull-down
Chế độ Floating khá bất tiện khi đọc một nút bấm chẳng hạn. Ta cần một mode mà có trạng thái mặc định là '1' hoặc '0' logic, để việc thiết kế mạch điện tử bên ngoài ít phức tạp hơn!
Mode Input Pull-up dùng điện trở kéo lên nguồn (số 1 trong hình 2) nên mặc định nó đọc về mức '1'. Khi đọc nút bấm, ta chỉ cần nối nút bấm với mức '0' (GND).
Tương tự, Input Pull-down dùng điện trở kéo xuống đất (số 2 trong hình 2) nên mặc định là mức '0'.
Ngoài duy trì mức logic mặc định, 2 mode này còn có chức năng bảo vệ vi điều khiển.
GPIO Output
Có 2 mode Output điển hình trong STM32: Push-pull và Open-drain.
👀 Open-drain
Hãy nhìn hình 5, ở chế độ Open-drain, P-MOS luôn ngưng dẫn.
- Đặt vào một logic '0' thì N-MOS sẽ dẫn, đầu ra của pin = '0'.
- Đặt vào một logic '1' thì N-MOS sẽ ngưng dẫn, đầu ra của pin sẽ ở mức trở kháng cao Hi-Z.
👀 Push-pull
Ở chế độ Push-pull, cả P-MOS và N-MOS đều được dùng (hình 5).
- Đặt vào một logic '0' thì N-MOS dẫn và P-MOS ngưng dẫn, đầu ra của pin = '0'.
- Đặt vào một logic '1' thì N-MOS ngưng dẫn và P-MOS dẫn, đầu ra của pin = '1'.
Push-pull thường được sử dụng hơn với on/off, PWM,... Open-drain được sử dụng trong trường hợp muốn điều khiển nhiều thiết bị tiêu thụ dòng với chỉ 1 vi điều khiển, kèm thiết kế trở treo bên ngoài. Open-drain hay xuất hiện trong các ứng dụng yêu cầu mạch drives, tiêu biểu nhất là bus I2C.
Chế độ Alternate Function (AF)
Ngoài Input và Output, GPIO trong STM32 còn hỗ trợ chế độ Alternate Function (AF - Chức năng thay thế). Ở chế độ này, một chân GPIO có thể được kết nối với các ngoại vi bên trong như UART, SPI, I2C, PWM, ADC,... Mỗi chân có thể hỗ trợ nhiều chức năng AF khác nhau, được chọn qua thanh ghi GPIOx_AFRL/AFRH. Ví dụ:
- PA2 có thể được cấu hình làm TX của USART2.
- PB6 có thể làm SDA của I2C1.
Ví dụ thực tế với GPIO
Ví dụ 1: Đọc nút bấm với Input Pull-up
Giả sử bạn kết nối một nút bấm vào chân PA0, với chế độ Input Pull-up:
- Khi không nhấn nút: PA0 = '1' (do pull-up).
- Khi nhấn nút (nối xuống GND): PA0 = '0'.
Ví dụ 2: Điều khiển LED với Output Push-pull
Kết nối LED vào chân PB0, chế độ Push-pull:
- Đặt PB0 = '1': LED sáng (nối với VCC qua điện trở).
- Đặt PB0 = '0': LED tắt.
Ưu nhược điểm của các chế độ GPIO
Input Floating:
- Ưu: Tiêu thụ ít năng lượng, phù hợp với cảm biến analog.
- Nhược: Dễ bị nhiễu, không có mức logic mặc định.
- Ưu: Có mức logic mặc định, bảo vệ pin, dễ dùng với nút bấm.
- Nhược: Tiêu thụ dòng nhỏ qua điện trở trong.
- Ưu: Dòng ra mạnh, phù hợp với LED, PWM.
- Nhược: Không dùng được khi cần nhiều thiết bị chung 1 đường tín hiệu.
- Ưu: Hỗ trợ nhiều thiết bị (như I2C), tiết kiệm chân điều khiển.
- Nhược: Cần điện trở ngoài, dòng ra yếu hơn Push-pull.
Để sử dụng các chế độ trên, chúng ta cần cấu hình GPIO thông qua các thanh ghi như GPIOx_MODER (chọn chế độ), GPIOx_PUPDR (pull-up/pull-down), GPIOx_OTYPER (output type),... Trong bài tiếp theo, chúng ta sẽ đi sâu vào cách lập trình trực tiếp các thanh ghi này để điều khiển GPIO theo ý muốn.
>>>>>> Follow ngay <<<<<<
Để nhận được những bài học miễn phí mới nhất nhé 😊
Chúc các bạn học tập tốt 😊
Bài viết rất hay, em cảm ơn ạ
Trả lờiXóaCảm ơn bạn đã ủng hộ :D
Xóa