TỐI ƯU CODE TRONG STVD

TIP 03 : TỐI ƯU CODE TRONG STVD.


Cách sử lý khi các bạn gặp lỗi này trong STVD:

Khi gặp lỗi này chúng ta có thể tối ưu code thông qua khai báo +split. Cách làm : các bạn vào project -> setting -> tab C compiler -> mục user define options : điền thêm dòng +split.

Kết quả built sau khi thêm +split:

Các bạn có thể tham khảo thêm trong manual ST Visual Developr(RN0013)

Vậy là xong. Chúc tất cả thành công.


THIẾT KẾ LED VỚI 2 CHÂN PB4 VÀ PB5

TIP 02 : THIẾT KẾ LED VỚI 2 CHÂN PB4 VÀ PB5.


2 chân PB4 và PB5 trong STM8S003F3P6 được thiết kế mạch định là kiểu OPEN DRAIN. Để hiểu open drain là gì chúng ta quan sát hình sau:

2 chỗ mình khoanh tròn chính là mấu chốt của open-drain, đó chính là con P-MOS(ở trên) và N-MOS(ở dưới) được kết nối ở ngõ ra. Ở chế độ open-drain thì mức “0” N-MOS hoạt động, ngõ ra được nối GND trong khi mức 1 thì P-MOS không hoạt động. Ngõ ra ở trạng thái tự do(Không nối GND cũng không nối VDD).

Cách thiết kế Led với 2 chân này đó là thiết kế led ở chế độ kích âm. Tức là xuất mức 0 thì led sáng, mức 1 led tắt.

Vậy là xong. Chúc tất cả thành công.


NẠP CHƯƠNG TRÌNH VỚI CÁC CHÂN ALTERNATE FUNCTION(REMAP)TRONG STVP

TIP 01 : NẠP CHƯƠNG TRÌNH VỚI CÁC CHÂN ALTERNATE FUNCTION(REMAP)TRONG STVP .


  1. B1: Đầu tiên, các bạn mở STVP lên, cấu hình chip, mạch nạp….. mở file chương trình nạp
  2. B2: Tra cứu chức năng mà mình muốn remap(đương nhiên là đã code chức năng đó trong STVD) trong manual. Ở manual cột alternate function after remap[option bit]. Ví dụ chân PC5 sẽ có timer2 CH1 là chân remap.
  3. B3: mở qua Tab option byte: tab này chứa cấu hình các thanh ghi remap, bảo vệ đọc code trong chip….. Chọn tên phù hợp với chức năng remap. Ở đây là AFR0.
  4. B4: Load chương trình xuống VĐK bằng cách click vào biểu tượng “program all tabs” hoặc vào program -> program all tabs.

Vậy là xong. Chúc tất cả thành công.


BÀI 11 : I2C VỚI IC DS1307

BÀI 11 : I2C VỚI IC DS1307 .


  1. CƠ SỞ LÝ THUYẾT.
  2. I2C – Inter- Intergrated Circuit là chuẩn truyền thông 2 dây gồm 1 dây Clock và 1 dây Data dùng chung cho quá trình truyền nhận được phát minh bởi Philips. Chuẩn I2C cũng trở nên thông dụng với nhiều module, IC sử dụng như :IC nhớ(24LCxxx), cảm biến góc nghiêng(MPU6050), module giao tiếp LCD(dùng IC PCF8574), IC thời gian thực(DS1307)… So với UART tốc độ của I2C có vẻ nhỉnh hơn 1 chút, ở mức thông thường là 100Khz. Ở các mode còn lại thì tốc độ cao hơn. Khi giao tiếp I2C với 1 IC nào đó cần chú ý : địa chỉ của Ic đó để giao tiếp, giao tiếp với tốc độ bao nhiêu, bao nhiêu bit.

    Trên STM8S003F3P6 thì có 1 bộ giao tiếp I2C ở chân PB4,PB5. 2 chân này cũng được thiết kế đặc biệt chuyên dụng cho I2C nên khi output ở mức cao, Điện áp trên chân này đo được là =0V. Các tính năng chính của I2C trên STM8S003F3P6:

    • Có 2 tốc độ là 100Khz và 400khz.
    • Có 2 mode sử dụng là mode master và mode slave.
    • Có các cờ báo trạng thái và cờ báo lỗi.
    • Có 3 chế độ ngắt là ngắt giao tiếp, ngắt khi có lỗi xảy ra, ngắt từ chế độ ngủ/nghỉ.

    STM8S003F3P6 không có bộ thời gian thực(STM32 có bộ thời gian thực) nên chúng ta phải dùng thêm IC DS1307 để có được bộ thời gian thực. Một vài chức năng của DS1307:

    • Có các thanh ghi chứa giờ, phút, giây, thứ, ngày, tháng, năm và năm thừa.
    • 56 byte, có thể lưu dữ data trong RAM nên không sợ bị mất data khi mất nguồn(chân Vbat phải được gắn pin).
    • Giao tiếp I2C, có chế độ tự kiểm tra nguồn vào.
    • Dòng tiêu thụ thấp.
  3. Sơ đồ kết nối.
  4. SƠ ĐỒ KẾT NỐI:

    • Chân VCC của DS1307 nối chân +5V của vi điều khiển.
    • Chân GND của DS1307 nối chân GND của vi điều khiển.
    • Chân SDA của DS1307 nối chân PB5 của vi điều khiển.
    • Chân SCL của DS1307 nối chân PB4 của vi điều khiển.

    LƯU Ý PHẦN CỨNG:

    • Cần có thạch anh ngoài và pin ở chân VBAT(chắc chắn là còn sử dụng được).
    • Khi thiết kế cần có điện trở kéo nguồn ở 3 chân : SCL, SDA,OUT(nếu chân này sử dụng) nếu không sẽ không giao tiếp được - tham khảo thêm trong Datasheet.
    • Địa chỉ của IC này là 0xD0. Khi cấp nguồn thì VCC > 1.25xVbat thì IC mới hoạt động VD : pin ở chân VBAT = 3v thì VCC > 3.75V.
    • Kết nối trược tiếp SCL(PB4-VĐK) nối SCL(DS1307), SDA(PB5-VĐK) nối SDA(DS1307) – giao tiếp UART thì cần đấu chéo.
  5. Cấu hình dùng thư viện chuẩn của ST.
    1. Cấu hình chương trình con I2C với tốc độ chuẩn – nằm trong file ds1307.c.
    2. Cấu hình chương trình để set thời gian cho IC DS1307 – nằm trong file ds1307.c
    3. Thư viện này mình sưu tầm được trên mạng, đã test và chạy ổn đinh. Tóm tắt quá trình set thời gian cho IC DS1307 như sau:

      • Chuyển đổi tất cả các data cần ghi sang số BCD vì thời gian được lưu trên các thanh ghi của DS1307 là giá trị số BCD.
      • Chờ cho giao thức I2C trên IC được sẵn sang. MCU sẽ gửi tín hiệu để bắt đầu giao tiếp.
      • MCU gửi địa chỉ để giao tiếp với IC DS1307 ở đây là 0xD0, và chờ các cờ thông báo, cờ trạng thái báo là đã truyền xong và không có lỗi xảy ra.
      • MCU gửi địa chỉ bắt đầu để ghi giá trị: bắt đầu từ địa chỉ của thanh ghi giây(seconds = 0x00) và chờ cờ báo là đã ghi xong.
      • MCU gửi giá trị giây cần set và chờ cờ báo đã gửi xong.
      • Tiếp theo tương tự cho các giá trị set phút, giờ… cho đến hết giá trị cần ghi.
      • MCU sẽ gửi tín hiệu thông báo là sẽ kết thúc ghi dữ liệu và xóa các cờ báo rỗi.
    4. Cấu hình chương trình con để đọc thời gian về – nằm trong file ds1307.c.
    5. Tóm tắt quá trình đọc dữ liệu trả về như sau:

      • Chờ cho giao thức I2C trên IC được sẵn sàng. MCU sẽ gửi tín hiệu để bắt đầu giao tiếp.
      • MCU gửi địa chỉ để giao tiếp với IC DS1307 ở đây là 0xD0, và chờ các cờ thông báo, cờ trạng thái báo là đã truyền xong và không có lỗi xảy ra.
      • MCU gửi địa chỉ của thanh ghi cần đọc giá trị và chờ chờ báo là đã xong.
      • Bộ I2C của MCU restart và gửi tín hiệu bắt đầu mới và gửi địa chỉ của DS1307 = 0xD0 để bắt đầu quá trình đọc. Lúc này SDA sẽ là dữ liệu được trả về từ DS1307. Chương trình sẽ lưu lại giá trị thanh ghi giây.
      • Các cờ sẽ được thiết lập lại để chuẩn bị cho lần đọc tiếp theo.
      • Sau khi đọc được data trả về, thì ta data sẽ chuyển đổi từ BCD về nhị phân để hiển thị.

      Ở đây, mình dùng UART để hiển thị giá trị thời gian nên cần phải chuyển đổi về giá trị nhị phân. Bạn nào sử dụng LED 7 đoạn để hiển thị thời gian thì không cần chuyển đổi về số nhị phân, để nguyên số BCD. Các bạn cần include file ds1307.h vào file main để chương trình có thể gọi được các hàm thực thi trong file ds1307.c. Ví dụ mẫu mình đã để link ở dưới, các bạn có thể chỉnh sửa để hiểu thêm về I2C.

      Chúc các bạn thành công.

Link tải chương trình sử dụng ds1307

BÀI 10 : SRF05 VỚI STM8S

BÀI 10 : SRF05 VỚI STM8S .


  1. Khái niệm về lý thuyết.
  2. Cảm biến siêu âm srf05 dùng để đo khoảng cách từ cảm biến đến đối tượng, giới hạn đo trong khoảng từ 2cm -> 300cm. Đây là loại cảm biến giá rẻ, thông dụng với các bạn sinh viên dùng để làm đồ án hoặc với những ứng dụng trung bình và nhỏ.

    Cấu tạo gồm 5 chân :

    • VCC: cấp nguồn 5V.
    • Trig : đây là chn kích hoạt cảm biến – kích hoạt tạo xung phát đi.
    • Echo: chân này là chân thu tín hiệu của cảm biến.
    • OUT:chân chọn chế đọ hoạt động (chỉ sử dụng 1 chân Trig để thu - phát, hoặc sử dụng cả 2 chân Trig và Echo).
    • GND : chân nối MASS(GND).

    Nguyên tắc hoạt động dựa vào việc đo khoảng thời gian giữa khi phát sóng siêu âm để truyền đi và nhận lại nên ta thấy cảm biến có 2 con mắt. Các bạn cần hiểu được nguyên lí hoạt động để lập trình được với bất kì 1 loại vi điều khiển nào mà không cần thư viện có sẵn. Ở đây mình chỉ giới thiệu mode hoạt động 1 và cách lập trình. Có nhiều cách lập trình khác nhau. Việc lập trình cũng dựa theo nguyên lí hình sau:

    • B1: phát 1 tín hiệu có độ rộng xung tối thiểu 10uS ở trên chân Trig để kích hoạt bộ phát xung siêu âm đồng thời cho phép timer hoạt động để tính thời gian phát đi và nhận lại - Ở trong code của mình là ở chân PC6 trong ngắt timer2.
    • B2 : đợi tín hiệu trả về , dùng timer để tính thời gian nhận xung trả về - ở đây của mình là timer2.
    • B3: Nếu có xung trả về thì lưu giá trị thời gian, reset timer để cho lần phát tiếp theo quay trở lại bước B1 – xung nhận về ngắt ngoài ở chân PC7. Nếu sau 25ms mà không có xung trả về tức là không có vật cản, reset timer quay trở lại B1(trong code là ở chỗ reset khi biến đếm =5000 trong ngắt timer 2 - ở đây mình tăng giá trị 25ms thành 50ms).

    Sau khi có khoảng thời gian giữa truyền đi và nhận lại chúng ta sẽ tính khoảng cách theo công thức sau:

    S = V*T/2.

    • S: là khoảng cách từ cảm biến đến đối tượng.
    • V: là vận tốc của sóng âm trong không khí 343.2m/s mình thường lấy 334 cho chẵn.
    • T/2 : giá trị T là thời gian đo được trong khoảng thời gian phát và thu, khoảng thời gian đó gấp đôi khoảng thời gian từ cảm biến đến vật nên chúng ta phải chia 2.

    Tùy theo đơn vị tính mà chúng ta sẽ có các khoảng cách được hiển thị theo m, cm, dm, mm. Tuy nhiên, trong quá trình đo cũng sẽ xảy ra sai số do vi điều khiển, do cảm biến nên chúng ta tính toán công thức(hiệu chỉnh hệ số bù sai số) sao cho phù hợp với thực tế(cái này mình gọi là scale sai số).

  3. Cấu hình trong thư viện chuẩn ST.
    1. Cấu hình phần cứng và giải thích nguyên lí của code:
    2. Phần cứng:

      • Chân VCC của SRF05 nối chân +5V của vi điều khiển.
      • Chân GND của SRF05 nối chân GND của vi điều khiển.
      • Chân Trig của SRF05 nối chân PC6 của vi điều khiển.
      • Chân Echo của SRF05 nối chân PC7 của vi điều khiển.
      • Chân OUT của SRF05 để trống.

      Nguyên lí hoạt động: Đầu tiên mình sẽ cấu hình chương trình con để timer2 ngắt mỗi 12.5us(trong code do có nhiều lệnh được thực thi trong ngắt nên thời gian xảy ra ngắt thực tế lên đến 25us – mình kiểm tra bằng cách đo xung trên chân PD2- chân này đảo trạng thái mỗi khi xảy ra ngắt). Tiếp theo mình cấu hình ngắt ngoài để khi có xung trả về trên chân Echo sẽ nhảy vào ngắt ngoài để tính thời gian.

    3. Cấu hình chương trình con ngắt mỗi 12.5us:
    4. Cấu hình chương trình con ngắt ngoài khi có tín hiệu xung trên chân Echo:
    5. Cấu hình ưu tiên ngắt.
    6. Vì có 2 ngắt xảy ra là ngắt ngoài và ngắt tràn timer. Ngắt ngoài có mức ưu tiên cao hơn nên phải cấu hình ưu tiên ngắt.

    7. Chương trình thực thi ngắt timer2:
    8. Trên thực tế khoảng thời gian ngắt của timer2 là trên 12.5us(khoảng 25us) vì trong ngắt có thực thi 1 số lệnh làm trễ ngắt. Mình đã đo và kiểm tra bằng Oscillosope trên chân PD2.Nếu bỏ đoạn code xử lý thì ngắt sẽ đúng 12.5us.

    9. Chương trình thực thi ngắt ngoài trên chân PC7:
    10. Công thức trên mình đã bù thêm sai số để chính xác so với thực tế. tùy vào ứng dụng(do chính xác ở phạm vi gần hoặc xa mà chúng ta chỉnh lại các thông số này cho phù hợp).

    11. Hiển thị khoảng cách lên máy tính qua UART.
    12. Ở đây mình sử dụng hàm printf để hiển thị lên máy tính thông qua UART, phần hướng dẫn sử dụng UART bằng lệnh printf mình đã hướng dẫn trong bài UART.

    LƯU Ý:

    • Khi nối dây với VĐK cần chú ý cắm đúng chân, đảm bảo các chân đã được kết nối. Tránh tình trạng cắm nhầm nguồn hoặc nhầm chân VCC và GND. Điều này có thể là cảm biến chết hoặc hoạt động không bình thường.
    • Thời gian VĐK nhận được tín hiệu trả về ở chân trigger sau khi phát tín hiệu ở chân Echo = T*n. Trong đó T là thời gian xảy ra ngắt tràn timer, n là giá trị của biến đếm(n được tăng khi nhảy vào ngắt timer2). VD: khi n=10 mà ngắt tràn timer2 là 12.5us -> time = 12.5*10 =125us.
Link tải chương trình sử dụng srf05

BÀI 09 : ENCODER TRONG STM8S

BÀI 09 : ENCODER TRONG STM8S .


  1. Sơ lược về lý thuyết.
  2. Để xác định được góc quay, vận tốc quay hay vị trí quay một cách chính xác thì sử dụng encoder là một biện hưu hiệu nhất. Từ các thông số mà encoder đưa về chúng ta phải xử lý và đưa ra các phương pháp điều khiển phù hợp. Thông thường các động cơ như AC Servo hay Dc Servo điều có encoder đi kèm để dễ dàng điều khiển vận tốc cũng như vị trí. Đa số các encoder đều phải cấp nguồn riêng(khác với nguồn cấp cho động cơ). Điều cơ bản cần biết về 1 encoder là độ phân giải bao nhiêu(bao nhiêu xung – càng cao càng tốt), điện áp cấp là bao nhiêu, số dây in-out.

    2 loại cấu tạo thông dụng nhất của encoder là encoder quang(bao gồm một thiết bị phát quang, 1 đĩa chia rãnh hoặc khe, 1 thiết bị thu quang) hoặc dùng cảm biến từ Hall. Người ta chia encoder ra làm 2 loại encoder tuyệt đối(độ chính xác cao, hoạt động ổn định tuy nhiên giá thành cao và tín hiệu ngõ ra phức tạp) và encoder tương đối(độ chính xác ở mức vừa, giá rẻ, dễ sử dụng).

    Encoder có nhiều loại nên cấu tạo, cách sử dụng, số dây ra, điện áp cấp là khác nhau. Tuy nhiên về cơ bản thì thường sẽ có 5 dây chính: 2 dây cấp nguồn cho encoder hoạt đông, 2 dây A,B để xác định chiều quay, 1 dây Z để xác định số vòng quay.

    Ở STM8S003F3P6 thì chỉ có TIM1 tương thích với thư viện đọc encoder. Counter của timer là 16bit đủ để đọc encoder, chúng ta có thể sử dụng ngắt timer4 tạo thời gian để tính vận tốc, sử dụng timer2 để tạo xung điều khiển động cơ. Để tính được vận tốc quay của động cơ thì chúng ta áp dụng công thức:

    V= S/T.

    • V: là vận tốc của động cơ.
    • S là quãng đường được tính bằng số xung đọc được/độ phân giải của encoder.
    • T: là thời gian để đọc được quãng đường S(ngắt timer4 được sử dụng cho mục đích này).
  3. Cấu hình đọc encoder bằng thư viện chuẩn của ST.
    1. Cấu hình chương trình con TIMER1 để sử dụng mode encoder.
    2. Cấu hình ngắt timer4.
    3. Cấu hình chương trình ưu tiên ngắt khi có 2 ngắt xảy ra.
    4. Sự kiện trong ngắt tràn của timer encoder- tim1.
    5. Sự kiện trong ngắt của timer tính thời gian – timer4.
    6. Chương trình thực thi trong main:.

    LƯU Ý :

    • Ở đây 2 chân của timer 1 tương ứng với 2 phase A,B của encoder. Giá trị đọc được là số xung đọc về trong vòng 1s. 2 chân timer enocder là 2 chân Remap nên cần sử dụng chức năng remap khi nạp(xem thêm ở bài timer).
    • Mình quan sát số xung đọc về được hiển thị lên máy tính qua UART bằng phần mềm Hercules(xem thêm ở bài UART).
    • Sử dụng khai báo +slpit để tối ưu code trong STVD(xem thêm bài ADC).
    • File cấu hình ưu tiên ngắt là stm8s_itc.c cần được add vào khi có nhiều ngắt xảy ra và cần mức ưu tiên cao hoặc thấp.
Link tải chương trình sử dụng encoder

BÀI 08 : ADC TRONG STM8S

BÀI 08 : ADC TRONG STM8S.


  1. Một số khái niệm về lý thuyết.
  2. ADC – Analog to digital Converter là bộ chuyển đổi tín hiệu tương tự sang tín hiệu số. ADC được ứng dụng rất nhiều như đo nhiệt độ, đọc giá trị điện áp, cường độ dòng điện, đọc phím nhấn, đọc giá trị biến trở…. Khi tìm hiểu về ADC chúng ta cần tìm hiểu bộ ADC đó là bao nhiêu bit, các phương pháp chuyển đổi. ADC có số bit càng cao tức là độ phân giải của bộ ADC càng lớn.

    ADC trong STM8S là bộ ADC có 10 bit tức là giá trị đọc về nằm trong khoảng 0 ->2^10= 1024. Giá trị điện áp maximum của chân đầu vào bộ ADC bằng giá trị cung cấp cho đầu vào(VDD) – ví dụ VDD=5V -> điện áp đo được chân đầu vào của chân VĐK(chân cấu hình ADC) là 5V -> giá trị ADC đọc về lúc đó là 1024. STM8S003F3P6 có 5 chân ADC vào với 2 mode cấu hình là mode single và continuous conversion mode với nhiều chế độ như ngắt khi kết thúc chuyển đổi, điều khiển bằng xung trigger từ timer, ngắt với giới hạn trên và giới hạn dưới của ADC( Analog watchdog)…

    Sơ đồ khối bộ ADC bên trong VĐK:

  3. Cấu hình bằng thư viện ST.
    1. Cấu hình không sử dụng ngắt và đọc 1 kênh ADC về.
    2. Ở đây mình sử dụng UARTđể truyền giá trị đọc về lên máy tính để quan sát thông qua phần mềm hercules. Ở bài 7 mình đã hướng dẫn sử dụng lênh printf nên bài này mình chỉ cấu hình ADC.

      • Cấu hình chương trình con ADC channel 2:
      • Chương trình thực thi trong main.

      LƯU Ý:

      • Để đọc giá trị ADC với mức độ tin cây cao hơn ta cần lấy trung bình n mẫu ADC rồi chia cho số mẫu để lấy giá trị trung bình. Số mẫu càng cao thì độ tin cậy càng lớn nhưng thời gian thực thi sẽ lâu hơn. Tùy vào từng ứng dụng mà số mẫu lấy sẽ khác nhau.
      • Khi sử dụng ADC và UART(hàm printf) 1 số chương trình sẽ báo lỗi bộ nhớ chương trình bị tràn, đây là nhược điểm lớn nhất mà STVD mắc phải so với IAR. Mình chỉ đưa ra 1 cách để chương trình biên dịch tối ưu hơn, còn nếu viết thêm code thì tùy thuộc vào độ dài của mỗi chương trình mà có thể báo lại lỗi cũ. Lỗi trước khi sửa chữa:

      CÁCH SỬA CHỮA :các bạn vào setting -> C compiler -> user define opptions thêm dòng chữ +split.

    3. Khi sử dụng nhiều kênh ADC.
      • Chương trình con cấu hình channel 2:
      • Chương trình con cấu hình channel 4:
      • Chương trình thực thi trong hàm main:

      Cấu hình nhiều kênh ADC thực ra là thay phiên sử dụng 1 bộ ADC ở các chân khác nhau. Sau khi sử dụng ở chân này thì disnable chân đó và chuyển sang sử dụng chân khác. Vì thời gian thực thi của VĐK là rất nhanh nên ta có thể sử dụng nhiều channel khác nhau. Khi cấu hình nhiều kênh khác bạn cũng có thể sử dụng cách trên.

  4. Một vài thanh ghi thông dụng.
    1. ADC_DRH /ADC_DRL – ADC data register High/Low.
    2. 2 thanh ghi này mỗi thanh ghi 8 bit chứa dữ liệu ADC đọc về và sẽ có 2 mode tương ứng cài đặt kiểu dữ liệu là ADC1_ALIGN_LEFT và ADC1_ALIGN_RIGHT:

      • ADC1_ALIGN_LEFT : bit data D9 -> D2 nằm trong thanh ghi DH[7...0] và D1,D0 nằm trong DL[1,0].
      • ADC1_ALIGN_RIGHT : bit data D7 -> D0 nằm trong thanh ghi DL[7...0] và D9,D8 nằm trong DH[1,0].
    3. ADC_CSR – ADC control/ status register.
    4. Thanh ghi này cung cấp một số bit điều khiển và hiển thị trạng thái của ADC.

      • EOC : bit thông báo đã kết thúc quá trình chuyển đổi ADC(1) hay chưa(0).
      • AWD: thông báo Analog watchdog: không có Analog watchdog event(0) và có Analog watchdog event(1).
      • EOCIE: cho phép ngắt khi kết thúc quá trình hoàn tất chuyển đổi ADC(1) hay không(0).
      • AWDIE : cho phép ngắt analog watchdog(1) hay không(0).
      • CH3[3:0]: lựa chọn kênh ADC sử dụng vd: kênh 2 thì CH3[3:0]= 0x02.
    5. ADC_CR1 – ADC configuration register 1.
      • SPSEL[2:0] : cấu hình chia clock hệ thống cho bộ Adc hoạt động.
      • CONT: cấu hình mode ADC là single hoặc Continouns mode.
      • ADON: cho phép bắt đầu chuyển đổi(1) hay không(0).
  5. Bài tập.
    1. Cấu hình kênh AI3 để đọc giá trị ADC có sử dụng ngắt khi kết thúc quá trình chuyển đổi hiển thị lênh máy tính sử dụng UART.
    2. Cấu hình để đọc 2 biến trở ở 2 kênh AI3,AI4 không sử dụng ngắt, kết quả hiển thị lên máy tính sử dụng UART.
    3. Cấu hình kênh AI3 để đọc ADC từ biến trở có sử dụng ngắt để đọc giá trị ADC trong khoảng 500< ADC_VALUE< 800. Led ở chân PA3 sáng khi ADC_VALUE nằm trong khoảng giá trị cho phép đó.









Link tải chương trình sử dụng 1 kênh ADC Link tải chương trình sử dụng 2 kênh ADC

BÀI 07 : UART TRONG STM8S

BÀI 07 : UART TRONG STM8S.


  1. Khái niệm lý thuyết liên quan.
  2. UART - Universal synchronous asynchronous receiver transmitter là một ngoại vi cơ bản và thường dùng trong các quá trình giao tiếp với các module như : Xbee, Wifi, Blutooth…. Khi giao tiếp UART kết hợp với các IC giao tiếp như MAX232CP, SP485EEN…. thì sẽ tạo thành các chuẩn giao tiếp RS232, RS485. Đây là các chuẩn giao tiếp thông dụng và phổ biến trong công nghiệp từ trước đến nay.

    Khi ta sử dụng chân UART_CLK thì giao tiếp UART sẽ trở thành giao tiếp đồng bộ và không dùng sẽ là chuẩn giao tiếp không đồng bộ. Các bạn để ý là với bất cứ 1 chuẩn truyền thông nào, khi có sử dụng 1 chân tín hiệu làm chân CLK thì chuẩn giao tiếp đó sẽ là chuẩn giao tiếp đồng bộ và ngược lại. Ở đây mình chỉ đề cập đến giao tiếp UART không đồng bộ.

    Ưu điểm của giao tiếp UART không đồng bộ: tiết kiệm chân vi điều khiển(2 chân), là ngoại vi mà bất kì 1 VĐK nào cũng có, có khá nhiều module, cảm biến dùng UART để truyền nhận data với VĐK. Nhược điểm của loại ngoại vi này là tốc độ khá chậm, tốc độ tối đa tùy thuộc vào từng dòng; quá trình truyền nhận dễ xảy ra lỗi nên trong quá trình truyền nhận cần có các phương pháp để kiểm tra(thông thường là truyền thêm bit hoặc byte kiểm tra lỗi). Khi muốn truyền data đi xa, chúng ta cần phải sử dụng các IC thông dụng để tạo thành các chuẩn giao tiếp đáng tin cậy như RS485 hay RS232.

    STM8S003F3P6 chỉ có duy nhất 1 cổng UART đó là UART1, các loại STM8S khác thì sẽ có UART1, UART2, UART3,UART4 tùy thuộc theo từng dòng và nhận biết thông qua datasheet của vi điều khiển đó - VD STM8S105C6T6 trên board discovery sẽ có UART2.

    Thông thường chúng ta sẽ dùng ngắt nhận UART để nhận dữ liệu vì sử dụng ngắt sẽ tiện lợi, không tốn thời gian chờ cũng như mất dữ liệu.Các tốc độ thường dùng để giao tiếp với máy tính: 600,1200,2400,4800,9600,14400,19200,38400,56000,57600,115200.

    Một số phần mềm giao tiếp với máy tính: hercules_3-2-5,teraterm, Serial-Oscilloscope-v1.5...Một số modulde dùng để giao tiếp với máy tính: CP2102 USB 2.0, USB ra UART dùng PL2303, USB to UART dùng TTL FT232RL, USB ra UART dùng CH340G…

  3. Cấu hình sử dụng thư viện ST.
    1. Cấu hình chương trình con không sử dụng ngắt.
    2. Hàm thực thi: các bạn có thể dùng hàm UART1_SendData8(uint8_t Data) và uint8_t UART1_ReceiveData8(void) để truyền và nhận data
    3. Ví dụ 1 : chương trình gửi kí tự “A” lên máy tính – tra cứu bảng mã ASCII thì kí tự “A” có giá trị là 65

      Ví dụ 2 : nhận data trong vòng lặp while :

      CHÚ Ý :

      • Trong ví dụ 1 khi gửi data trong vòng lặp while nên có hàm Delay một khoảng thời gian nhỏ để quan sát khi giao tiếp với máy tính(ở đây mình Delay khá lớn để dễ quan sát) Nếu bạn không để hàm Delay: khi giao tiếp với máy tính ở tốc độ baud cao và lặp lại liên tục trong vòng lặp while máy tính có thể bị treo khi nhận liên tục data với tốc độ lớn.
      • ở ví dụ 2 :chương trình sẽ bị dừng ở vòng lặp while khi chờ cờ RXNE nhận xong data. Khi máy tính gửi 1 kí tự bất kì thì chương trình sẽ thoát khỏi vòng lặp while đó.
      • Các hàm UART1_SendData8(uint8_t Data) và uint8_t UART1_ReceiveData8(void) có dữ liệu là 8 byte nên khi khai báo nên khai báo dữ liệu ở kiểu 8 btye(uint8_t, char, int…) để tránh lãng phí thanh ghi trong bộ nhớ chương trình cũng như hạn chế lỗi.
    4. Chương trình truyền nhiều kí tự bằng UART.
      • Chương trình con truyền chuỗi kí tự kiều char
      • Hàm thực thi:

      CHÚ Ý : mình để hàm delay để cho dễ quan sát, dòng lệnh truyền kí tự xuống hàng có thể để trong chương trình con UARTPrintf ở ngoài vòng lặp while(*char) , cuối chương trình.

    5. Dùng hàm printf của thư viện stdio.h.
    6. Hàm printf nằm trong thư viện stdio.h nên cần phải add vào ở đầu chương trình.

      • Cấu hình để sử dụng hàm printf:
      • In chuỗi lên màn hình không có tham số đi kèm.
      • In chuỗi lên màn hình có tham số đi kèm.

      CHÚ Ý : kiểu các kiểu dữ liệu %d,%f,%c các bạn có thể tham khảo trên mạng với từ khóa “ Printf trong c++”. Với kiểu dữ liệu thì hàm printf không thể in các số đằng sau dấu “.” Ví dụ 4.596 thì chỉ in được 4.

    7. Cấu hình với ngắt nhận UART.
      • Chương trình con cấu hình:
      • Chương trình thực thi trong file stm8s_it.c : nhận được 1 kí tự nào từ máy tính gửi lên kí tự đó.
  4. Một số thanh ghi quan trọng trong STM8S:
    1. UART_SR - Status register.
      • TXE : bit thông báo trạng thái data đã truyền xong (TXE=1) hay chưa(TXE=0).
      • TC: bit thông báo quá trình truyền hoàn tất(TC=1) hay không(TC=0).
      • RXNE: bit thông báo đã nhận data(RXNE=1) hay chưa(RXNE=0).
    2. UART_BRR – Baud rate register.
    3. Bao gồm 2 thanh ghi là BRR1 chứa 8 bit ở giữa quy định tốc độ baud và BRR2 chứa 4 bit đầu và 4 bit cuối của thanh ghi tốc độ baund. Giá trị của thanh ghi = Clock cấp UART/baud.Vd lock cấp cho UART là 16Mhz, tốc đọ baud là 19200 -> val = 16*10^6/19200= 0x0341.UART_BRR1= 0x34 và UART_BRR2=0x01.

    4. UART_DR – Data register.
    5. Thanh ghi này chứa giá trị truyền và nhận của UART, nó gồm 8 bit nên giá trị max 255.

    6. UART_CR – control register.
    7. Bao gồm 6 thanh ghi để điều khiển quá trình UART, mình chỉ nói qua 1 số bit và thanh ghi cấu hình chính.

      • UART_CR1.
      • M : số bit data truyền nhận (8 hoặc 9 bit) tương ứng ở trong code là UART1_WORDLENGTH_8D. PCEN: cho phép bit chẵn lẻ hoặc không tương ứng ở trong code là UART1_PARITY_NO.

      • UART_CR2.
      • TEN : cho phép truyền(TEN = 1) hoặc không(TEN = 0). REN : cho phép nhận(REN=1) hoặc không(REN=0).Ở trong code UART1_MODE_TXRX_ENABLE vừa cho phép truyền và vừa cho phép nhận.

      • UART_CR3.
      • STOP: số bit STOP sử dụng tương ứng ở trong code là UART1_STOPBITS_1. o CLKEN : có cho phép chân CLK hoạt động hay không(ở STM8S003F3P6 là chân PD4). Nếu là giao tiếp không đồng bộ thì không cho phép tương ứng với UART1_SYNCMODE_CLOCK_DISABLE trong code.

  5. Bài tập.
    1. Cấu hình sử dụng uart 1 với tốc độ baund 119200 nhận kí tự từ máy tính. Nhận được kí tự nào truyền lên lại kí tự đó. Dùng ngắt UART để nhận kí tự từ máy tính và mềm Hercules để xem quá trình truyền nhận.
    2. Dùng hàm printf của thư viện stdio để truyền dòng chữ “Hello word” lên máy tính. Sử dụng phần mềm Hercules để xem quá trình truyền.
Link tải chương trình gửi nhiều kí tự lên máy tính
Link tải chương trình ngắt nhận uart và gửi lại lên máy tính
Link tải chương trình truyền kí tự lên máy tính dùng hàm printf