BÀI 02: GPIO trong STM8S

BÀI 02 : GPIO TRONG STM8S




  1. Lý thuyết về GPIO.
  2. GPIO là từ viết tắt của General purpose I/O ports tạm hiểu là nơi giao tiếp chung giữa tín hiệu ra và tín hiệu vào. GPIO là bài cơ bản, cần nắm vững khi học bất kì một VĐK nào đó. Cần hiểu được các thuật ngữ, chế độ, cấu hình, số lượng… của các chân GPIO. Ở STM8S thì các chân GPIO chia ra làm nhiều Port vd: PortA, PortB….. Số lượng Port phụ thuộc vào số lượng chân(pin) và cách gọi phụ thuộc vào nhà sản xuất(ví dụ VĐK X có PortB mà lại không có PortA). Mỗi Port thường có 8 chân đánh số từ 0 -> 7 tương ứng với mỗi chân là 1bit. Mỗi chân có 1 chức năng khác nhau như analog input, external interrupt.. hay đơn thuần chỉ là xuất tín hiệu on/off ở mức 0,1. Chức năng của mỗi chân thì chúng ta cần tra datasheet của nhà sản xuất trước khi lập trình hoặc thiết kế mạch.

    Các tính năng chínhGPIO của STM8S:

    • Có thể cấu hình riêng từng bit của PORT hoặc cả PORT là input hoặc Output.
    • Select các mode input: để nổi* hoặc gắn điện trở kéo lên**.
    • Select các mode output : push-pull*** hay open-drain****.
    • 5 V tolerant input : là những chân chịu được điện áp 5V đầu vào mà không làm chết chân VĐK đó(các chân bình thường có đầu vào là 3V3 nếu sử dụng mức 5V trong thời gian lâu dài sẽ gây chết chân VĐK đó – khái niệm này phổ biến hơn ở STM32 vì nó sử dụng điện áp vào là 3V3 còn ở STM8S thì có thể cấp nguồn 5V).
    • Có ngắt ngoài cho các chân riêng biệt.
    • Có chế độ input Schmitt trigger cho các chân analog để tiết kiệm năng lượng.
    • * Để nổi tức là mức logic của chân tín hiệu khi không tác động ở giữa mức 0 hay 1(vd khi cấp nguồn cho vi điều khiển là 3V3 thì mức 1 là 3,3V điện áp, mức 0 là 0V điện áp, để nổi tức là khi chúng ta lấy đồng hồ đo điện áp đo ở chân VĐK thì điện áp đo được ở giữa mức 0V và 3V3- vd: 2.2V, 1.0 V).

      ** Điện trở kéo lên có nghìa là bên trong chân VĐK đó(bên trong chip) có gắn 1 con điện trở nối thẳng lên nguồn hoạt động(vd : 3V3 với STM8S ) mục đích để xác định rõ mức tín hiệu chỉ là 0 hoặc 1. Trở kéo xuống cũng được sử dụng với mục đích như vậy.

      ***,**** : để hiểu rõ push-pull và open-drain thì các bạn quan sát hình sau.

      2 chỗ mình khoanh tròn chính là mấu chốt của push-pull và open-drain, đó chính là con P-MOS(ở trên) và N-MOS(ở dưới) được kết nối ở ngõ ra.

      • Ở chế độ push-pull thì mức “0” tức là N-MOS hoạt động, ngõ ra được nối GND, mức “1” thì P-MOS hoạt động ngõ ra được nối VDD.
      • Ở 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).

    Chú ý: 2 chân PB4 và PB5 của STM8S003F3P6 được mặc định là open-drain nên khi thiết kế với LED thì cần thiết kế như sau. Nếu ngược lại sẽ không hoạt động.

    Cấu hình chân cho UART, SPI, I2C cũng tạm gọi là GPIO nhưng cách cấu hình sẽ được hướng dẫn ở các bài sau.

  3. Cách cấu hình sử dụng thư viện ST.
    1. Các mode cấu hình GPIO có trong thư viện ST:
      • GPIO_MODE_IN_FL_NO_IT : cấu hình là ngõ vào, để nổi, không có ngắt.
      • GPIO_MODE_IN_PU_NO_IT: cấu hình là ngõ vào, trở nối nguồn, không có ngắt.
      • GPIO_MODE_IN_FL_IT : cấu hình là ngõ vào, để nổi, có ngắt.
      • GPIO_MODE_IN_PU_IT : cấu hình là ngõ vào, trở nối nguồn, có ngắt.
      • GPIO_MODE_OUT_OD_LOW_FAST : cấu hình là ngõ ra, open-drain, ban đầu là mức 0, tốc độ tối đa là 10Mhz.
      • GPIO_MODE_OUT_PP_LOW_FAST: cấu hình là ngõ ra, push-pull, ban đầu là mức 0, tốc độ tối đa là 10Mhz.
      • GPIO_MODE_OUT_OD_LOW_SLOW: cấu hình là ngõ ra, open-drain, ban đầu là mức 0, tốc độ tối đa là 2Mhz.
      • GPIO_MODE_OUT_PP_LOW_SLOW: cấu hình là ngõ ra, push-pull, ban đầu là mức 0, tốc độ tối đa là 2Mhz.
      • GPIO_MODE_OUT_OD_HIZ_FAST: cấu hình là ngõ ra, open-drain, ban đầu là mức 1, tốc độ tối đa là 10Mhz.
      • GPIO_MODE_OUT_PP_HIGH_FAST: cấu hình là ngõ ra, push-pull, ban đầu là mức 1, tốc độ tối đa là 10Mhz.
      • GPIO_MODE_OUT_OD_HIZ_ SLOW : cấu hình là ngõ ra, open-drain, ban đầu là mức 1, tốc độ tối đa là 2Mhz.
      • GPIO_MODE_OUT_PP_HIGH_SLOW: cấu hình là ngõ ra, push-pull, ban đầu là mức 1, tốc độ tối đa là 2Mhz.
    2. Một số hàm xuất nhập chính trong thư viện ST:
      • GPIO_Init(x1,x2,x3) : hàm cấu hình chung cho bất kì chân nào với tham số truyền vào là x1,x2,x3.
      • GPIO_Write(x1,x2): hàm xuất giá trị cho 1 port với tham số vào là x1,x2.
      • GPIO_WriteHigh(x1,x2) : hàm xuất giá trị mức cao cho từng chân với tham số vào là x1, x2.
      • GPIO_WriteLow(x1,x2) : hàm xuất giá trị mức thấp cho từng chân với tham số vào là x1, x2.
      • GPIO_WriteReverse(x1,x2) : hàm đảo trạng thái của chân GPIO(1 chuyển thành 0 và ngược lại) với tham số vào là x1,x2.
      • GPIO_ReadOutputData(x1) : hàm đọc trạng thái của xuất ra 1 port với tham số truyền vào là x1.
      • GPIO_ReadInputData(x1) : hàm đọc tráng thái input của 1 port với tham số truyền vào là x1.
      • GPIO_ReadInputPin(x1,x2) : hàm đọc trạng thái input của 1 pin với tham số truyền vào là x1,x2.

      Ngoài ra còn 1 số hàm khác, các bạn có thể tham khảo trong file stm8s_gpio.c.

      Chú ý :

      • Kết quả đọc về của hàm GPIO_ReadInputPin(x1,x2) là giá trị 8bit nên tránh sử dụng GPIO_ReadInputPin(x1,x2) = 1. Trường hợp này chỉ đúng khi chân IO đó là Px0(ví dụ PA0…).
      • Tùy vào cách thiết kế phần cứng(button, led …) mà linh hoạt sử dụng các hàm GPIO input và output cho phù hợp
    3. Ví dụ tham khảo cấu hình GPIO trong STVD:
      • Thiết kế phần cứng của ví dụ này:
      • Cấu hình chân PD2,PD3 là chân Output, chân PA3 là input.
      • Đọc dữ liệu từ chân PA3, xuất tín hiệu ra chân PD2,PD3.
    4. Hàm Delay tương đối*
    5. * Delay tương đối có nghĩa là dựa vào thời gian thực hiện 1 lệnh của CPU để thực hiện delay. Vd : thời gian thực hiện câu lệnh lệnh “while(time_delay--)”là 1ns, lặp lại lệnh đó 1000 lần chúng ta sẽ có được thời gian delay là 1uS- “time_delay” là tham số truyền vào.

  4. Thanh ghi GPIO thông dụng.
    1. Px_ODR – port x output data register.
    2. Thanh ghi này được sử dụng với mục đích ghi mức logic ra chân VĐK tương ứng với các bit và đọc trạng thái output(hàm GPIO_ReadOutputData(x1,x2)). Vd : ODR0 =1 chân tương ứng Px0 là mức cao và ngược lại.

    3. Px_IDR – Port X input data register.
    4. Thanh ghi này có chức năng đọc trạng thái input của chân VĐK. Vd IDR0 = 0 tức là chân Px0 đang ở mức logic thấp và ngược lại.

    5. Px_DDR – Port x data direction register.
    6. Thanh ghi này có chức năng cấu hình chân VĐK là chân input hoặc output. Vd: DDR0 = 0 chân Px0 là chân input và ngược lại.

    7. Px_CR1 – Port x control register 1.
    8. Thanh ghi này kết hợp với thanh ghi Px_DDR cấu hình mode floating, pull –up, push-pull…. Cho chân VĐK. Vd DDR0=0,CR1_0 =0 thì chân VĐK sẽ là mode input floating.

    9. Px_CR2 - Port x control register 2.
    10. Thanh ghi này kết hợp với thanh ghi Px_DDR cấu hình có ngắt hoặc không(với mode input) và tốc độ output(với mode output). Vd : DDR0=0, CR2_0 = 0 thì chân VĐK sẽ là chân input và không có ngắt đầu vào.

  5. Bài tập.
    1. Cấu hình STM8S để xuất trạng thái đảo giữa 2 chân PD2 và PD3 trong thời gian 1s. ví dụ: chân PD2 tắt thì chân PD3 on và ngược lại.
    2. Cấu hình STM8S để chớp tắt led trên chân PD2 3 lần chu kì 1s(3 lần sáng 3 lần tắt) sau đó chân PD3 sáng 1s, chân PD2 tắt. Sau 1s cả 2 đều tắt và lặp lại chu kì ban đầu.
    3. Đọc trạng thái nút nhấn PA3 để khi nhấn nút led ở PD2 vad PD3 sáng và giữ trạng thái 1s, sau khi thả nút 2 led ở PD2 vad PD3 tắt.


    DOWNLOAD CODE

Link tải giao tiếp với nút nhấn không dùng ngắt STVP Project DownloadIAR Project Download

Link tải nháy led đảo trạng thái ở PD2,PD3 STVP Project DownloadIAR Project Download





BÀI 01 : Tạo project trong STM8S với STVD

BÀI 01 : HƯỚNG DẪN TẠO PROJECT TRONG STM8S VỚI STVD



  1. PHẦN MỀM CẦN THIẾT
    • Các bạn đã cài phần mềm CXSTM8_idea_sim_evalsttoolset_pack39 trên máy tính.
    • Tải thư viện chuẩn của ST : en.stsw-stm8069.
    • Các bước cài đặt phần mềm khá đơn giản, các bạn chỉ cần mở file cài và để chọn mặc định, Next…
    • Link tải mình đã để ở dưới.

  2. CÁC BƯỚC CÀI ĐẶT
    1. Tạo thư mục riêng chứa 2 thư mục con, ở đây là GPIO và 2 thư mục con(tên tùy ý) là lib(chứa các file thư viện chuẩn) và project(chứa các file sử dụng để viết code).
    2. Copy thư 2 thư mục incsrc trong en.stsw-stm8069\STM8S_StdPeriph_Lib\Libraries vào thư mục lib đã tạo ở phần 1; các file main.c, stm8s_conf, stm8s_it.c, stm8s_it.h trong thư mục en.stsw-stm8069\STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Template và file stm8_interrupt_vector trong thư mục en.stsw-stm8069\STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Template\STVD\Cosmic vào thư mục proiect đã tạo ở phần 1
    3. Mở ST Visual Develop bắt đầu tạo project mới
      1. File -> new workspace -> create workspace and project -> double click vào create workspace…
      2. Điền tên workspace(tùy ý) ở đây mình chọn là GPIO và địa chỉ lưu project là thư mục con GPIO/project mà mình đã tạo ở bước 1. -> OK -> OK
      3. Điền tên project(tùy ý) ở đây mình chọn luôn là GPIO. Toolchain chọn là STM8 Comic, Toolchain root sẽ tự động được chọn(Nếu bạn nào chưa cài CXSTM8_idea_sim_eval ở mục I thì nó sẽ không xuất hiện) -> click OK.
      4. Chọn MCU mà mình sử dụng, ở đây mình sử dụng chip STM8S003F3P6 thì mình sẽ chọn STM8S003F3P ->bấm Seclect(lưu ý nhớ bấm nút này trước khi OK) -> click OK. Nếu là chip STM8S003K3 thì chọn STM8S003K3.
      5. Chương trình sẽ tự động sinh ra 2 file main.cstm8_interrupt_vector -> bạn xóa 2 file đó đi bằng cách chuột phải -> delete(hoặc bấm phím delete sau khi chọn). Và chuyển mode debug sang release.
      6. Ở thư mục Source files các bạn tạo 2 thư mục mới(chuột phải-> new folder) là user(chứa các file cần thiết ) và lib(chứa các file thư viện). Add( chuột phải -> add file to folder) các file đã copy ở phần II.2 như trong hình. Trong thư mục lib. 2 file stm8s_gpio.c và stm8s_clk.c là bắt buộc còn các file khác như uart, exti thì tùy từng mục đích mà thêm vào sau.
    4. Vào Project -> setting để thiết lập các thông số cho project vừa tạo ra.
      1. Thẻ general check mục project specific toolset path.
      2. Thẻ C compiler -> tab Category chọn preprocessor ở mục additional include directories dẫn tới 2 đường link chứa thư viện là GPIO\lib\inc và GPIO\project.
      3. Thẻ C compiler -> tab Category chọn preprocessor ở mục processor definitions điền tên MCU mà mình lập trình ở đây là STM8S003 -> OK.
    5. Build project và bảng thông báo lỗi xuất hiện 0 lỗi là ok(mình khoanh ở 2 chỗ trong hình)
    6. Chúc các bạn thành công.

  3. NẠP FILE MỚI TẠO TỪ CHƯƠNG TRÌNH MỚI TẠO CHO MẠCH NẠP
    1. Ở đây mình sử dụng ST link V2(mạch nạp này rẻ nhất) để nạp cho chip STM8S. Kiểm tra các thông số sau:
      • Kiểm tra đã cấp nguồn cho board mạch chưa.
      • Kết nối chân SWIM của STlink V2 với chân PD1/SWIM. Nếu bạn đã sử dụng chân này với chức năng GPIO hoặc nạp mà vẫn báo lỗi thì cần kết nối thêm chân Reset của STlink V2 với chân Reset của MCU.
      • Đã cài đặt driver cho mạch nạp Stlink-V2- để xem đã nhận mạch nạp chưa các bạn vào computer management để xem.
    2. Mở ST Visual Programmer để load file và nạp cho chip.
      • Vào tab Configuration để cấu hình chip nạp và mạch nạp.
      • Ở đây mình chọn là ST link, Swim, STM8S003F3P. Nếu là chip STM8S003K3 thì chọn STM8S003K3 -> nhấn OK.
      • Vào Open để mở file, trỏ đến file mà chương trình ST Visual Develop đã tạo ra file(GPIO\project\Release) và nhấn nút nạp(program current tab) đối với các chương trình không sử dụng chức năng remap. Các bạn chú ý những chỗ mà mình đã khoanh. Chương trình nạp thành công sẽ xuất hiện dòng Program memory successtully verified.
      • Rút chân Reset ra. Mạch đã hoàn toàn chạy. Chúc các bạn thành công.
      • Link tải STVD,STVP,datasheet, driver stlink V2 Link tải ví dụ mẫu mình đã tạo Link youtube mình đã làm