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

Thảo luận trong 'STM8'

Đang xem chủ đề này ( Thành viên: 0, Khách: 0)

  1. maingochoc

    maingochoc Học sinh phổ thông

    Tham gia ngày:
    23/8/16
    Bài viết:
    9
    Đã được thích:
    1
    Điểm thành tích:
    1
    Giới tính:
    Nam
    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
    [​IMG]
    Port x pin input register (Px_IDR) : Thanh ghi Input
    [​IMG]

    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
    [​IMG]
    Port x control register 1 (Px_CR1)
    [​IMG]
    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)
    [​IMG]
    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
    [​IMG]

    Lắp trên Board Test
    [​IMG]

    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
     

Chia sẻ trang này