[Tự Học STM8] Bài 3 - Thiết lập tốc độ xung cho STM8

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
    Trong STM8 có nhiều thanh ghi liên quan tới CLOCK nhưng chúng ta chỉ cần quan tâm tới thanh ghi CLK_CKDIVR
    [​IMG]

    Trong này có 2 phần cần chú ý là HSIDIVCPUDIV
    HSIDIV là chọ hệ số chia cho Fmaster từ HSI ( Hight Speed Internal - Là tần số dao động cao bên trong chip - dao động nội 16MHz )
    Trong STM8 nó có 2 bộ dao động nội là HSILSI ( LSI nó chỉ nó 128KHz )
    HSIDIV là chọ hệ số chia tần cho Fmaster với nguồn tần số lấy từ HSI
    Fmater nó là tần số dao động chủ. Từ Fmaster nó sẽ đi vào CPU và ra các ngoại vi khác củaSTM8 như TIMER, UART, SPI, I2C ...
    CPUDIV là chọn hệ số chia tần cho FCPU với tần số nguồn vào lấy từ Fmaster
    [​IMG]

    Như đã thấy FCPU = Fmaster / CPUDIV.
    Giá trị của CLK_CKDIVR khi mới cấp nguồn là 0x18, có nghĩa là
    HSIDIV đang nhận giá trị là 11 ( nhị phân ) => hệ số chia là 8.
    Còn CPUDIV000 (nhị phân) => Hệ số chia là 1.
    Khi đó Fmaster = 16MHz / 8 = 2MHz
    Còn FCPU = Fmaster / 1 = 2MHz.
    Hay khi mới cấp nguồn chíp chạy ở tần số 2MHz.
    Vậy để chíp chạy Max tốc độ thì chỉ cần cho 2 cái hệ số chia này là nhỏ nhất =>CLK_CKDIVR = 0x00.
    Áp dụng vào Code của Bài 2, các bạn thử thay CLK_CKDIVR = 0x18CLK_CKDIVR = 0x00 xem khác nhau như nào
    * Lưu ý : Lệnh thiết lập tốc độ xung nhịp nên để ngay sau hàm main() như sau
    PHP:
    void main(){
      
    CLK_CKDIVR 0x00// Tốc độ tối đa 16Mhz
      
    ......
      ......
      while(
    1){
       ..........
      }
    }
    Cập nhật thiết lập Clock sử dụng thạch anh ngoài - by Thanh Tùng
    PHP:
    void clock_config(){
      
    CLK_CKDIVR 0x00;
      
    CLK_ECKR 0x01;              // Enable HSE
      
    while(!(CLK_ECKR 0x01));    // Wait HSE Ready
      
    CLK_SWCR_SWEN 1;
      
    CLK_SWR 0xB4;
      while(
    CLK_CMSR != 0xB4);
      while(!
    CLK_SWCR_SWIF);
      
    CLK_SWCR_SWIF 0;
    }
     

Chia sẻ trang này