Lập trình STM32 thanh ghi cấu hình GPIO Output STM32F103RCT6

Bài viết này hướng dẫn chi tiết cách lập trình STM32 thanh ghi để cấu hình GPIO Output STM32F103RCT6, đồng thời thực hiện chương trình nhấp nháy LED (blink LED) sử dụng delay vòng lặp đơn giản. Đây là bước cơ bản trong lập trình bare-metal, giúp bạn hiểu sâu về thanh ghi GPIO mà không cần thư viện HAL.

Define struct thanh ghi GPIO cho lập trình STM32 thanh ghi cấu hình GPIO Output STM32F103

Dựa trên RM0008, Section 9.2 (trang 171-177):

Thanh ghi port configuration register low (GPIOx_CRL) (x=A..G)

Thanh ghi port configuration register low (GPIOx_CRL) (x=A..G) cho lập trình STM32 thanh ghi cấu hình GPIO output STM32F103RCT6
Thanh ghi port configuration register low (GPIOx_CRL) (x=A..G)

Thanh ghi port configuration register high (GPIO_x_CRH) (x=A..G)

Thanh ghi port configuration register high (GPIOx_CRH) (x=A..G) cho lập trình STM32 thanh ghi cấu hình Output
Thanh ghi port configuration register high (GPIOx_CRH) (x=A..G)

Thanh ghi port output data register (GPIOx_ODR) (x=A..G)

Thanh ghi port output data register (GPIOx_ODR) (x=A..G)
Thanh ghi port output data register (GPIOx_ODR) (x=A..G)

Thanh ghi port bit set/reset register (GPIOx_BSRR) (x=A..G)

Thanh ghi port bit set/reset register (GPIOx_BSRR) (x=A..G) cho hướng dẫn lập trình STM32 thanh ghi
Thanh ghi port bit set/reset register (GPIOx_BSRR) (x=A..G)

Những thanh ghi IDR, BRR, LCKR chưa được nghĩa struct. Bạn hãy định nghĩa nó.

Sơ đồ map thanh ghi GPIO

Địa chỉ GPIO port A, B, C, D, E, F, G STM32f103
Địa chỉ GPIO port A, B, C, D, E, F, G STM32f103

Define struct GPIO

Define địa chỉ cho GPIOA, GPIOB, GPIOC

Ý nghĩa thanh ghi GPIO

  • CRL/CRH: Cấu hình chế độ (MODE: 0=input, 1-3=output với tốc độ khác nhau) và cấu hình (CNF: 0=push-pull, 2=input pull-up/down; Section 9.2.1/9.2.2, trang 171–172).
  • ODR: Đặt trạng thái output (Section 9.2.4, trang 173). Các bit có thể đọc/viết, với set/reset nguyên tử qua BSRR.
  • BSRR: Set/reset bit một cách nguyên tử (Section 9.2.5, trang 173), tránh vấn đề read-modify-write trong môi trường đa luồng.

Cấu hình GPIO Output STM32F103RCT6 và lập trình LED bật/tắt với delay không chính xác

Thanh ghi GPIOx_CRL

Thanh ghi GPIO_CRL STM32F103 cho lập trình thanh ghi STM32
Thanh ghi GPIO_CRL STM32F103

Thanh ghi GPIOx_CRL dùng để cấu hình chân 0 đến chân 7 của các port từ A đến G.

Mỗi chân được cấu hình bởi hai trường bit:

  • MODE[1:0]
  • CNF[1:0]

Ví dụ: Cấu hình PC1 làm input pull-up

Thanh ghi GPIOx_CRH

Thanh ghi GPIO_CRH cho lập trình STM32 thanh ghi cấu hình Output STM32F103RCT6
Thanh ghi GPIO_CRH

Thanh ghi GPIOx_CRH dùng để cấu hình chân 8 đến chân 15 của các port từ A đến G.

Mỗi chân cũng được cấu hình bởi:

  • MODE[1:0]
  • CNF[1:0]

Ví dụ: Cấu hình PA8 làm output push-pull, tốc độ 2 MHz

Bảng ý nghĩa MODE và CNF

Chế độ Input

MODEyCNFyÝ nghĩa
0000Analog input: Chân được dùng làm ngõ vào tương tự (analog input) – thường dùng cho ADC, DAC. Không có điện trở kéo lên/kéo xuống.
0001Floating input (mặc định sau reset): Chân ở chế độ ngõ vào số nhưng không có điện trở kéo lên/kéo xuống. Trạng thái chân có thể dao động không ổn định nếu để hở.
0010Input pull-up / pull-down: Khi ở chế độ này, bạn có thể cấu hình điện trở nội kéo lên hoặc kéo xuống. Bit trong ODR sẽ quyết định kéo lên (ODR=1) hay kéo xuống (ODR=0).
0011Reserved: Không sử dụng

Ở chế độ pull-up / pull-down, bit ODR quyết định kéo lên (ODR=1) hay kéo xuống (ODR=0).

Chế độ Output – MODE

MODEÝ nghĩa
01Output 10 MHz: Dùng cho tín hiệu chậm.
10Output 2 MHz: Dùng cho ứng dụng không cần tốc độ cao, tiết kiệm điện.
11Output 50 MHz: Dùng cho tín hiệu nhanh (SPI, PWM, UART…).

Chế độ Output – CNF

CNFÝ nghĩa
00General purpose output push-pull: Chân output có thể kéo lên 3.3V hoặc kéo xuống GND. Đây là kiểu phổ biến nhất khi điều khiển LED, relay, IC logic.
01General purpose output open-drain: Chân chỉ có thể kéo xuống GND, khi thả ra thì ở trạng thái hở (high-Z). Cần điện trở kéo lên bên ngoài.
10Alternate function output push-pull: Dùng khi chân đảm nhận chức năng ngoại vi (ví dụ UART TX, SPI SCK, PWM…)
11Alternate function output open-drain: Dùng cho ngoại vi nhưng chỉ kéo xuống GND, không kéo lên (ví dụ I²C).

Hướng dẫn cấu hình GPIO Output STM32F103RCT6 (PA8)

  • Cấu hình PA8 (LED0) làm output
  • Bật/tắt LED bằng thanh ghi
  • Tạo delay bằng vòng lặp (không chính xác ~1s)

Cấu hình GPIO Output

  • Bật clock GPIOA:
    RCC->APB2ENR.IOPAEN = 1
  • PA8:
    • MODE8 = 2 (Output 2 MHz)
    • CNF8 = 0 (Push-pull, Section 9.2.2, trang 172)

Code cấu hình GPIO PA8 Output

Hàm delay (không chính xác)


Trong bài viết hướng dẫn lập trình STM32 thanh ghi cấu hình GPIO Ouput, chúng ta sẽ dùng hàm Delay_Approx như một delay không chính xác. Những bài viết sau, tôi sẽ hướng dẫn bạn dùng timer, systick timer để viết hàm delay.

Cấu hình GPIO cho LED

Điều khiển LED bằng BSRR

Hàm main

Github link: Download code cấu hình GPIO Output Bật Tắt LED0 (PA08)

Giải thích

  • BSRR cho phép set/reset (Section 9.2.5, trang 173) bit GPIO atomic, an toàn hơn so với ghi trực tiếp ODR
  • Delay bằng vòng lặp không chính xác, phụ thuộc:
    • Tần số hệ thống
    • Compiler optimization

Tham chiếu

  • RM0008 – Reference Manual
    • Section 9.2 GPIO (trang 171–175)
    • Section 9.2.5 BSRR Register

Kết luận

Qua bài viết này, bạn đã nắm được cách lập trình STM32 thanh ghi để cấu hình output STM32F103RCT6, từ việc sử dụng các thanh ghi GPIOx_CRL, GPIOx_CRH cho đến điều khiển chân GPIO bằng BSRR. Việc cấu hình đúng MODECNF giúp chân GPIO hoạt động chính xác theo yêu cầu, đặc biệt trong các ứng dụng điều khiển LED.

Bên cạnh đó, ví dụ bật/tắt LED với hàm delay vòng lặp cho thấy hạn chế của phương pháp delay không chính xác, do phụ thuộc vào tần số hệ thống và tối ưu của compiler. Đây là điểm cần lưu ý khi lập trình STM32 bằng thanh ghi, nhất là trong các ứng dụng yêu cầu thời gian chính xác.

Tóm lại, việc hiểu rõ cách cấu hình output STM32F103RCT6 ở mức thanh ghi là nền tảng quan trọng, giúp bạn chủ động hơn trong việc tối ưu hiệu năng, kiểm soát phần cứng và phát triển các ứng dụng nhúng trên STM32 một cách hiệu quả và ổn định.

Viết một bình luận

This site uses Akismet to reduce spam. Learn how your comment data is processed.