[Tự Học STM8] Bài 2 - Điều khiển LED đơn với GPIO

maingochoc

Học sinh phổ thông
#1
Tham khảo Datasheet của STM8 tại đây http://shink.in/1Io2O
Trong GPIO của STM8 gồm 5 thanh ghi chúng ta cần quan tâm như sau
Port x output data register (Px_ODR) : Thanh ghi Output

Port x pin input register (Px_IDR) : Thanh ghi Input


Port x data direction register (Px_DDR) : Thanh ghi định nghĩa chiều dữ liệu
Với giá trị :
1 : Chế độ Output
0 : Chế độ Input

Port x control register 1 (Px_CR1)

Nếu ở chế độ Input thì CR1 nó sẽ quyết định có treo trở nội hay không
Còn ở chế độ Output nó là hở cực máng hay kéo đẩy
Ở Output CR1 = 0 thì Port của nó sẽ chỉ kéo được xuống Logic 0 còn khi lên Logic 1 thì nó sẽ ở trạng thái cao trở
Port x control register 2 (Px_CR2)

Nếu ở Input thì CR2 nó quyết định có cho phép ngắt ngoài tại chấn được Set tương ứng hay không
Ở STM8 mọi chân IO của nó đều có thể được sử dụng làm ngắt ngoài
Còn ở Output nó chỉ quyết định tần số hoạt động của Port
Nó có 2 mức là cao và thấp
0 là mức thấp với 2MHz
1 là mức cao 10MHz

Tóm tắt :
* Chế độ Output Port riêng lẻ ( ví dụ PD7 )
Ta phải chọn chiều ra cho PD7 : PD_DDR_DDR7 = 1
Chọn chế độ hở cực máng hay kéo đẩy : PD_CR1_C17 = 0 hoặc PD_CR1_C17 = 1
Tần số của Port 2Mhz hay 10Mhz : PD_CR2_C27 = 0 hoặc PD_CR2_C27 = 1
Xuất dữ liệu mong muốn ra Port : PD_ODR_ODR7 = 0 hoặc PD_ODR_ODR7 = 0
* Chế độ Output cả Port ( ví dụ PD )
Cho cả PD là Port Output PD_DDR = 0xff;
Chọn chế độ kéo đẩy PD_CR1 = 0xff;
Tần số hoạt động là 10Mhz PD_CR2 = 0xff;
Xuất giá trị ra PD PD_ODR = 0x40;

* Chế độ Input ( ví dụ PD7 )
Ta phải chọn chiều vào cho PD7 : PD_DDR_DDR7 = 0
Chọn chế độ có treo trở hay không : PD_CR1_C17 = 1 hoặc PD_CR1_C17= 0
Chọn ngắt ngoài hay không : PD_CR2_C27 = 1 hoặc PD_CR2_C27 = 0
Đọc dữ liệu từ PD7 : doc = PD_IDR_IDR7

Ví dụ : Nhấp nháy LED gắn với PD7 với chu kì 250us
Sơ đồ kết nối như sau


Lắp trên Board Test


Code

PHP:
#include "iostm8s103k3.h"
#include "intrinsics.h"
#define LED PD_ODR_ODR7   // LED được gắn với PD3

void delay_us(int time){  // Hàm delay
  while(time--){
   __no_operation(); //NOP
   __no_operation(); //NOP
   __no_operation(); //NOP
   __no_operation(); //NOP
   __no_operation(); //NOP
   __no_operation(); //NOP
   __no_operation(); //NOP
   __no_operation(); //NOP
  }
}

void delay_ms(int time){
  while(time--){
   delay_us(1000);
  }
}

void main(){
  CLK_CKDIVR = 0x00;   // Tốc độ 16Mhz
  PD_DDR_DDR7 = 1;     // PD3 chế độ Output
  PD_CR1_C17 = 1;      // CR1 ở trạng thái cao trở, cách viết khác PD_CR1 = 0x08
  PD_CR2_C27 = 1;      // CR2 ở trạng thái Output tần số 10Mhz
  while(1){
   LED ^= 1;          // Đảo bit 1 ~ 0
   delay_ms(250);     // trễ 250us
  }
}

Tải Full Project & Code tại đây : shink.in URL Shortener
Hướng Dẫn Nạp Code Cho STM8

Kết quả :

Chúc các bạn thành công với chương trình đầu tiên !
Nguồn : Bài 2 : Điều Khiển LED Đơn Với GPIO
 

Quảng cáo Google