Lập trình STM32 – Bit Banding
1. Lý thuyết Bit-banding
Bit banding là một tính năng của vi xử lý ARM Cortext.
Có khả năng ánh xạ mỗi bit riêng lẻ trong vùng nhớ bit band tới một word ở vùng alias bit band trong bộ nhớ. Nghĩa là mỗi bit ở vùng nhớ bit band sẽ có 1 word tương ứng ở vùng alias bit band. Do vậy chúng ta có thể truy xuất vào các bit ở vùng nhớ bit band bằng cách truy xuất vào các word tương ứng ở vùng nhớ alias bit band thông qua địa chỉ của các word này.
2. Nguyên lý hoạt động

Trên hình chúng ta có thể thấy cách mà vi xử lý ánh xạ bộ nhớ với vùng bit band region có địa chỉ 0x20000000 tới vùng alias bit band có địa chỉ 0x22000000 tới địa chỉ 0x22000084
Ví dụ chúng ta muốn thay đổi giá trị bit 2 của vùng bit band (0x20000000) thì chúng ta chỉ cần tác động vào bit [0] địa chỉ vùng nhớ 0x22000008 là được.
Giá trị của bit [0] của các Word tại vùng alias bit band sẽ xác định giá trị bit mục tiêu tương ứng tại vùng bit band.
Nếu giạ trị bit [0] của các Word tại vùng alias bit band = 0 thì giá trị bit mục tiêu tại vùng bit band cũng = 0.
Và ngược lại, nếu giạ trị bit [0] của các Word tại vùng alias bit band = 1 thì giá trị bit mục tiêu tại vùng bit band cũng = 1.
Các bit còn lại từ bit 1-31 tại vùng alias bit band này không có ý nghĩa gì và nó không ảnh hưởng đến các bit tại vùng bit band.
3. Bit-banding trong vi xử lý ARM Cortex

Không gian bộ nhớ của vi xử lý ARM Cortex M3/ M4 bao gồm 2 vùng bit band có kích thước 1MB tại địa chỉ thất nhất của vùng nhớ SRAM và Peripheral.
Mỗi bit ở vùng nhớ bit band region tương ứng với 1 WORD ở vùng nhớ bit band alias.
- Trong vùng nhớ SRAM, vùng nhớ của bit band region bắt đầu từ 0x20000000 và kết thúc tại địa chỉ 0x200FFFFF, vùng bit band alias bắt đầu từ 0x22000000 và kết thúc tại địa chỉ 0x23FFFFFF
- Trong vùng nhớ Peripheral, vùng nhớ của bit band region bắt đầu từ 0x40000000 và kết thúc tại địa chỉ 0x400FFFFF, vùng bit band alias bắt đầu từ 0x42000000 và kết thúc tại địa chỉ 0x43FFFFFF
Xác định được địa chỉ của các word ở vùng bit band alias tương ứng với các bit mà chúng ta muốn làm việc ở vùng bit band region
Công thức tính địa chỉ:
bit_word_addr = bit_band_base + (byte_offset x 32) + (bit_number × 4)
Trong đó:
- bit_word_addr: là địa chỉ của word ở vùng nhớ bit band alias tương ứng với bit band region
- bit_band_base: là địa chỉ bắt đầu của vùng bit band alias
- byte_offset: là số thứ tự của byte chứa bit cần làm việc tại bit band region
- bit_number: là vị trí của bit mà các bạn muốn làm việc, có giá trị từ 0-7

Ví dụ:
Chúng ta cần tính địa chỉ của word tương ứng (bit band alias) với bit [0] (bit band region) tại địa chỉ 0x200FFFF.
- bit_band_base: 0x22000000
- byte_offset: 0x000FFFF x 32
- bit_number: 0 x 4
vây: bit_word_addr = 0x22000000 + (0x000FFFF x 32) + (0 x 4) = 0x23FFFFE0
Làm việc với các bit ở vùng bit band region bằng cách làm việc trực tiếp với vùng nhớ bit band region (1)
- Hoạt động ghi 1 bit: read -> modify -> write (vi xử lý thực hiện 1 chuỗi các hoạt động)
- Hoạt động đọc 1 bit: đọc word chứa bit -> lấy giá trị bit
Làm việc với các bit ở vùng bit band region bằng cách làm việc với word ở vùng nhớ bit band alias
- Hoạt động ghi 1 word vào bit band alias: chỉ cần thực hiện 1 hoạt động ở word này tương ứng với hoạt động (1)
- Hoạt động đọc 1 word vào bit band alias: thì giá trị trả về là 1 hoặc 0
Do vậy nếu làm việc với bit banding thì hiệu suất của vi xử lý sẽ tối ưu hơn cho cả hoạt động ghi và hoạt động đọc.
Đảm bảo sự chính xác tốt hơn so với bit masking