Bit Band trên STM32

bitband

Thông thường, để truy cập vào 1 bit trên 1 thanh ghi, chúng ta sử dụng các thao tác Setbit, clear bit thông qua toán tử AND hoặc OR

Ví dụ, để set bit 2 trên PORTA ta thao tác vào thanh ghi ODR ( được ánh xạ tới ngõ ra)

Hoặc để xóa bit

Trong ngôn ngữ C, có 1 cách khác nữa để thao tác lên bit đó là sử dụng bit fields tuy nhiên bit fields cần khai báo trong struct và tốc độ truy cập của nó cũng rất chậm

Ở bài này, mình sẽ giới thiệu với các bạn 1 phương pháp khác để can thiệp vào 1 bit trên thanh ghi của vi điều khiển STM32 thông qua bit banding

Trong STM32 lõi M3, có hẳn 1MB bộ nhớ được gọi là bit-band region. Trong vùng này mỗi bit đều được truy cập riêng lẻ. Để truy cập vào mỗi bit trong vùng này, chúng ta cần thao tác thông qua 1 vùng được gọi là aliased region.

Để ánh xa tới 1 bit trong bit-band region chúng ta cần tới 4 byte trong vùng aliased region, như vậy vùng aliased region sẽ có kích thước là 32MB

Vùng bit-band dành riêng cho ngoại vi có địa chỉ bit-band region là 0x40000000 và địa chỉ bắt đầu của aliased region là 0x42000000

Phỏng theo: Sổ tay Tham khảo Kỹ thuật Cortex-M3

Với bit band, chúng ta có thể thao tác lên 1 bit duy nhất trong thanh ghi ngoại vi do vậy khi làm việc với gpio và các biến cờ ( true/flase) sẽ dễ dàng hơn rất nhiều

Cách tính địa chỉ aliased region cho từng bít cho vùng ngoại vi

bit_address = 0x42000000 + byte_offset  * 32 + bit_offset * 4;

Trong đó:

  • bit_offset là vị trí của bit trong thanh ghi mà ta muốn truy cập
  • byte_offset là địa chỉ của thanh ghi ta muốn truy cập
  • bit_address là địa chỉ của bit đó

Tạo thư viện GPIO bit band

Trong STM32 thư viện HAL, để thao tác lên 1 chân, ta cần khai báo cả PORT lẫn PIN. Điều này làm mình thấy khá khó chịu, bây giờ mình sẽ sử dụng bitband để tạo thư viện GPIO có cách sử dụng giống như trên các dòng 8051,AVR

Ví dụ, muốn thao tác lên chân A6

Ta tính địa chỉ của bit A6 = 0x42000000 + (unsigned int)(&GPIOA->ODR)  * 32 + 6 * 4;

Kết quả là 0x42210198

Chú ý: Câu lệnh (unsigned int)(&GPIOA->ODR) dùng để lấy ra địa chỉ của thanh ghi GPIOA->ODR

Bây giờ chúng ta truy cập vào địa chỉ 0x42210198 thông qua ép kiểu con trỏ. Ví dụ để set bit A6 lên 1

Rất đơn giản phải không , bây giờ mình sẽ tính sẵn tất cả địa chỉ của các chân GPIO rồi định nghĩa thêm tên chân để tạo thành thư viện GPIO

Ví dụ:

Và giờ chỉ việc gọi PIN_A0 = 1; để set chân A0 lên mức 1

Với các cổng khác tương tự nhé !

 

Từ tác giả:

Nếu có bất kì thắc mắc nào trong bài viết, vui lòng để lại comment dưới mỗi bài ! Mình sẽ không trả lời thắc mắc của các bạn ở facebook hay email !

Nếu trong phần code bạn nhìn thấy nhưng thứ kiểu như &amp; thì đó là lỗi hiển thị, cụ thể 3 kí tự < > & bị biến đổi thành như thế
&amp; là &
&lt;  là <
&gt; là >

Giới thiệu Đào Nguyện 71 bài viết
DIY,chế cháo, viết blog chia sẽ kiến thức về lập trình,điện tử - IoT. Rất mong được giao lưu, kết bạn với các bạn cùng đam mê. Địa chỉ Facebook: https://www.facebook.com/nguyendao207

2 bình luận

Để lại bình luận