[C20] Special Function Register - Thanh ghi chức năng đặc biệt

Ngô Văn Tuân

Gà con
Staff member
Chào các bạn,

Bài viết sẽ cung cấp cho các bạn một số kiến thức cơ bản về thanh ghi mà nếu các bạn không biết vẫn có thể code được VĐK như thường bằng ngôn ngữ lập trình C và SDK do nhà sản xuất cung cấp. Nhưng nếu các bạn không biết thì sẽ có những vấn đề mà bạn sẽ không thể giải quyết được. Điều này cũng giống như hồi học cấp 3, nếu bạn chỉ học tính tích phân bằng máy tính mà không học tính bằng tay để biết nguyên lý thì sẽ vẫn giải được các bài toán tính tích phân nhưng lại không thể giải được bài toán biện luận.

Để bắt đầu, ta ôn nhẹ qua về cấu trúc VĐK.
Vi điều khiển gồm có:
  • CPU (Central Processing Unit) có nhiệm vụ tính toán, điều khiển các modules.
  • Các modules cũng có thể gọi là peripheral (ngoại vi) ví dụ như Timer, I2C, SPI, Clock, ADC, DAC, …
Mỗi module sẽ được thiết kế (bằng phần cứng) để được điều khiển bởi một vùng nhớ trong RAM. Do đó, người ta không sử dụng vùng nhớ này trong RAM để lưu dữ liệu thông thường như biến trong ngôn ngữ lập trình C.

Các ô nhớ trong vùng nhớ này được gọi là các SFRs (Special Function Register hay thanh ghi chức năng đặc biệt).

Các SFR có thể có độ dài có thể là 8-bit, 16-bit, 32-bit tùy theo VĐK.

Để sử dụng một module, CPU có hai bước:
  • Config (cấu hình)
  • Control (điều khiển)
1. CPU config module bằng cách bật tắt các bit trong các SFRs.
Trong datasheet, user guide hay reference manual của vi điều khiển, ta sẽ tìm thấy ý nghĩa của việc bật tắt các bit này đối với module.
Ví dụ sau cho ta thấy cấu trúc của thanh ghi TIMx control register 1 (TIMx_CR1) dùng để cấu hình timer cho họ VĐK STM32F103xx.

SFR_config.PNG

Lấy ví dụ bit 7 có tên là ARPE (Auto-reload preload enable). Nếu ta cho bit này bằng 1, khi module timer chạy và xảy ra sự kiện bộ đếm overflow khi đếm lên (hoặc underflow khi đếm xuống) thì nội dung trong thanh ghi preload register được copy vào thanh ghi shadow register bởi module timer (không phải CPU). Nếu ta cho bit này bằng 0 thì khi sự kiện xảy ra, sẽ không có sự copy này. Việc copy này có ý nghĩa gì thì ta bỏ qua (các bạn có thể tự tìm hiểu thêm trong reference manual có link cuối bài).

2. CPU control ngoại vi cũng thông qua các SFR.

SFR_control.PNG


Trong ví dụ trên MMS[2:0] (Master mode selection) là một bộ 3-bit nằm ở các bit 6,5,4 của thanh ghi TIMx_CR2.
Nếu ta ghi vào MMS[2:0] giá trị 001 thì đó chính là tín hiệu để counter của timer bắt đầu đếm.

3. Trong điều khiển module, ta cũng cần truyền nhận dữ liệu với module:
  • Truyền dữ liệu cho module bằng cách ghi dữ liệu vào SFR
  • Nhận dữ liệu từ module bằng cách đọc SFR
SFR_GPIO.PNG
Trong ví dụ trên, ta thấy bit 0 (ODR0) của thanh ghi GPIOx_ODR là bit chỉ mức logic ở pin 0 của port x.
Nếu ta ghi giá trị 1 cho bit 0 của thanh ghi trên thì giá trị logic ở pin 0 của port x sẽ là 1.
Để lấy được mức tín hiệu ngõ vào ở pin 0 của port x, ta chỉ cần đọc bit ODR0 của port này.

Tài liệu tham khảo:
[RM0008 Reference manual]

Bài tiếp theo: Interrupt
 
Last edited:
Top