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

Trong quá trình lập trình STM32 thanh ghi, việc cấu hình clock STM32F103 là bước nền tảng và bắt buộc nếu bạn muốn làm chủ vi điều khiển ở mức bare-metal (không HAL, không CubeMX). Bài viết này hướng dẫn chi tiết cách cấu hình RCC, HSE, PLL để đưa STM32F103 chạy ở 72MHz, đồng thời giải thích cách tính toán xung clock và kiểm tra thanh ghi trực tiếp trong Keil.

Mục tiêu bài lập trình STM32 thanh ghi cấu hình clock

  • Hiểu rõ clock tree STM32F103
  • Tự cấu hình HSE 8MHz + PLL x9 = 72MHz bằng thanh ghi
  • Cấu hình đúng AHB, APB1, APB2 theo RM0008
  • Biết cách kiểm tra RCC register trong Keil uVision

Define struct thanh ghi cho lập trình thanh ghi cấu hình clock stm32f103rct6

Thanh ghi RCC (Reset and Clock Control)

Thanh ghi clock control register (RCC_CR)

Dựa trên RM0008, Section 7.3 (trang 99-122):

Define struct RCC_CR cho lập trình stm32 thanh ghi Cấu hình Clock stm32f103rct6
Define struct RCC_CR cho lập trình stm32 thanh ghi Cấu hình Clock stm32f103rct6

Thanh ghi Clock Configuration Register (RCC_CFGR)

Define thanh ghi RCC_CFGR: Clock configuration register cho lập trình stm32 thanh ghi cấu hính Clock stm32f103rct6
Define thanh ghi RCC_CFGR: Clock configuration register cho lập trình stm32

Thanh ghi APB2 Peripheral Clock Enable Register (RCC_APB2ENR)

Define thanh ghi APB2ENR cho lập trình STM32 thanh ghi Cấu hình Clock stm32f103
Thanh ghi APB2ENR – Thanh ghi Bật Clock cho ngoại vi APB2

Thanh ghi APB1 Peripheral Clock Enable Register (RCC_APB1ENR)

Define struct thanh ghi APB1ENR cho lập trình stm32 thanh ghi Cấu hình Clock STM32F103RC
Thanh ghi APB1ENR – Thanh ghi bật tắt clock cho ngoại vi APB1

Những thanh ghi khác như CIR,  APB2RSTR, APB1RSTR, AHBENR, BDCR, CSR không được tạo thay struct ở đây. Bạn có thể tự mình định nghĩa nếu cần dùng.

Bản đồ thanh ghi RCC (RCC register map)

Boundary address reset and clock control RCC register
Boundary address RCC register

Giải thích:

  • CR: Điều khiển các dao động (HSION, HSEON, PLLON). Bit HSIRDY cho biết dao động nội bộ đã ổn định, PLLRDY cho biết PLL đã khóa.
  • CFGR: Cấu hình nguồn clock, các hệ số chia tần, và nhân PLL. Bit SWS hiển thị nguồn clock hiện tại.
  • APB2ENR, APB1ENR: Bật clock cho các ngoại vi (ví dụ: GPIOA, USART1). Các bit như IOPDEN và IOPEEN hỗ trợ phiên bản high-density.

Tạo file system cho cấu hình clock STM32F103

Tạo file system.h

Tạo file system.c

Chỉnh sửa startup để dùng clock tự cấu hình

Mở file startup_stm32f10x_hd.s

Hướng dẫn ghi bỏ tick read only file startup để cho phép chỉnh sửa trên Keil C
Bỏ tick read-only file startup_stm32f10x_hd.s
  • Chuột phải → Properties
  • Bỏ chọn Read-only

Ghi đè hàm SystemInit

Thay thế function SystemInit bằng SystemClock_Config cho file startup_stm32f10x_hd
Thay thế function SystemInit bằng SystemClock_Config cho file startup_stm32f10x_hd

Sửa function SystemInit thành function mà chúng ta đã định nghĩa lại (SystemClock_Config)

👉 Mục đích: thay thế clock mặc định của CMSIS bằng clock do người dùng cấu hình.

Cấu hình RCC và ngoại vi STM32F103 bằng thanh ghi

Bật clock cho GPIOA

Bật clock: RCC->APB2ENR.IOPAEN = 1 cho GPIOA (RM0008, Section 7.3.7, trang 112).

 Reset ngoại vi nếu cần

Reset nếu cần: RCC->APB2RSTR.IOPAEN = 1 rồi clear (Section 7.3.4, trang 106).

Ví dụ cấu hình GPIO Output

Clock Tree STM32F103 và tính toán xung clock

Cấu trúc clock tree

Clock tree (RM0008, Figure 11, trang 126):

Clock tree STM32F103
Clock tree STM32F103
  • HSE: 8MHz (Section 7.2.1, trang 95).
  • PLL: HSE x9 = 72MHz (PLLMUL = 7, Section 7.3.2, trang 101).
  • HCLK: SYSCLK / HPRE = 72MHz / 1 = 72MHz.
  • PCLK1: HCLK / PPRE1 = 72MHz / 2 = 36MHz.
  • PCLK2: HCLK / PPRE2 = 72MHz / 1 = 72MHz.

Tính toán xung Timer

Các khối cần quan tâm khi cấu hình Clock trong Stm32F103
Các khối cần quan tâm khi cấu hình Clock trong Stm32F103

 

Tính toán Clock
Tính toán Clock STM32F103

– Timer clock (APB1): PPRE1 > 1 nên TIMCLK = 2 x PCLK1 = 72MHz (Section 7.2, trang 93). – Ví dụ: Timer 1ms tại 72MHz, PSC = 71, ARR = 999 (72MHz / 72 / 1000 = 1kHz).

Cấu hình thanh ghi RCC

  • Enable HSE: Set bit HSEON to 1
Enable HSE: Set bit HSEON to 1 trong lập trình stm32f103
Enable HSE
  • Enable PLL: Set bit PLLON to 1
Enable PLL: Set bit PLLON to 1
Enable PLL
  • Configure PLL:

PLL HSE source: Set bit PLLSRC to 1

PLL HSE source: Set bit PLLSRC to 1
Select PLL HSE source: Set bit PLLSRC to 1

PLL MUL: Set PLL input clock x9, set PLLMUL to 7 (b0111)

PLL MUL: Set PLL input clock x9, set PLLMUL to 7 (b0111)
Set-PLLMUL-x9
  • Set prescalers:

AHB prescaler: HCLCK/1 = SYSCLK, set HPRE to 0

AHB prescaler: HCLCK/1 = SYSCLK, set HPRE to 0
AHB prescaler: HPRE

APB low-speed prescaler (APB1): PLCK1 = HCLK/2 = SYSCLK/2, set PPRE1 to 4 (100)

APB low-speed prescaler (APB1): PLCK1 = HCLK/2 = SYSCLK/2, set PPRE1 to 4 (100)
PPRE1: APB low-speed prescaler (APB1)

APB high-speed prescaler (APB2): PLCK2 = HCLK = SYSCLK, set PPRE2 to 0

APB high-speed prescaler (APB2): PLCK2 = HCLK = SYSCLK, set PPRE2 to 0
PPRE2: APB high-speed prescaler (APB2)

Chọn system clock: Set PLL như system clock

Chọn system clock: Set PLL như system clock
Chọn system clock: Set PLL

6. Hàm main trong lập trình STM32 thanh ghi

Link Github: Download code chương trình cấu hình Clock STM32F103 thanh ghi

7. Kiểm tra cấu hình clock STM32F103 trong Keil

Bật cửa sổ trạng thái thanh ghi RCC trong Keil C
Bật cửa sổ trạng thái thanh ghi RCC trong Keil C
  1. Debug → Start Debug Session
  2. Peripherals → System Viewer → RCC
  3. Kiểm tra:
    • HSEON = 1
    • PLLON = 1
    • PLLSRC = HSE
    • PLLMUL = x9
    • SW = PLL
    • HPRE = /1
    • PPRE1 = /2
    • PPRE2 = /1
Kiểm tra RCC register configuration trong cửa sổ Keil C
Kiểm tra RCC register configuration trong cửa sổ Keil C

Tham chiếu: RM0008, Section 7.2 (trang 92-98), Table 19 (trang 157).

8. Tổng kết

Bài viết đã hướng dẫn đầy đủ lập trình STM32 thanh ghi cấu hình clock STM32F103, giúp bạn hiểu bản chất RCC, clock tree và cách tính toán xung. Đây là nền tảng quan trọng để tiếp tục các bài GPIO, Timer, UART theo hướng bare-metal chuyên sâu.

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

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