BÀI 07: PWM TRONG STM32F103

BÀI 07: PWM TRONG STM32F103.


  1. Sơ lược về lý thuyết.
  2. PWM(pulse- with modulation) hay còn gọi nôm na là “băm xung” hay “điều khiển độ rộng xung” là ứng dụng phổ biến và thường dùng trong lĩnh vực điều khiển động cơ. Một ví dụ đơn giản để hiểu về độ rộng xung là mức độ sáng tắt của LED, ở tần số mà mắt người có thể nhìn thấy thì nó là độ chênh lệch giữa mức sáng và tắt của 1 đèn khoảng thời gian lặp đi lặp lại(vd đèn sáng 5s, tắt 3s lặp đi lặp lại thì chu kì sẽ là 8 giây); với tần số cao mắt người không thể nhìn thấy thì ta sẽ thấy LED sáng mờ hay sáng rõ đó là do tổng thời gian sáng/ tổng thời gian tắt trong khoảng thời gian lớn hay nhỏ mà mắt người nhìn thấy(tính bằng đơn vị nhỏ như ms).

    Khi tìm hiểu về PWM chúng ta cần tìm hiểu kĩ một số khái niệm cơ bản như:

    • Duty cycle : tỷ lệ phần trăm xung ở mức cao.
    • Period : là chu kì xung(bao gồm tổng thời gian mức cao + mức thấp).
    • Pulse width là giá trị của mức cao so với period.
    • PTO là xung vuông có 50% thời gian cao, 50% thời gian thấp.
    • Biên độ xung: là giá trị điện áp của xung khi ở mức cao.
    • Các khái niệm về tần số, chu kì.

BÀI 06 : TIMER BASE trong STM32F103

BÀI 06 : TIMER BASE trong STM32F103.


  1. Sơ lược về lý thuyết.
  2. STM32f103C8 có tất cả 7 timer nhưng trong đó đã bao gồm 1 systick timer, 2 watchdog timer. Vậy chỉ còn lại 4 timer dùng cho các chức năng như ngắt, timer base, PWM, Encoder, Input capture…. Trong đó TIM1 là Timer đặc biệt, chuyên dụng cho việc xuất xung với các mode xuất xung, các mode bảo vệ đầy đủ hơn so với các timer khác. TIM1 thuộc khối clock APB2, còn các TIM2,TIM3,TIM4 thuộc nhóm APB1.

    Có 3 vấn đề cần phải tìm hiểu trong bài này đó là :

    • Timer clock.
    • Prescaler
    • Auto Reload Value.

    Khi không có cấu hình gì liên quan đến clock và đã gắn đúng thạch anh ngoài trên chân PD0(5) và PD1(6) thì clock tương ứng của TIM1,TIM2,TIM3,TIM4 đã là 72Mhz. Cần ghi nhớ là sử dụng timer nào thì cấp clock cho timer đó theo đúng nhánh clock.

    Prescaler là bộ chia tần số của timer. Bộ chia này có giá trị tối đa là 16 bit tương ứng với giá trị là 65535. Các giá trị này có thể được thay đổi và điều chỉnh bằng lập trình. Tần số sau bộ chia này sẽ được tính là:

    fCK_CNT = fCK_PSC/(PSC+1).

    • FCK_CNT: tần số sau bộ chia.
    • fCK_PSC: tần số clock đầu vào cấp cho timer.
    • PSC: chính là giá trị truyền vào được lập trình bằng phần mềm

    Auto Reload value là giá trị bộ đếm tối đa có thể được điều chỉnh để nạp vào cho timer. Giá trị bộ đếm này được cài đặt tối đa là 16bit tương ứng với giá trị là 65535.Từ các thông số trên ta rút ra công thức cần tính cuối cùng đó là:

    FTIMER= fSYSTEM/[(PSC+1)(Period+1)]

    • Ftimer : là giá trị cuối cùng của bài toán, đơn vị là hz.
    • F system : tần số clock hệ thống được chia cho timer sử dụng, đơn vị là hz.
    • PSC : giá trị nạp vào cho bộ chia tần số của timer. Tối đa là 65535.
    • Period : giá trị bộ đếm nạp vào cho timer. Tối đa là 65535.

    Ngắt timer: khi giá trị đếm của bộ đếm timer(thanh ghi CNT) vượt qua giá trị của Auto Reload Value thì cờ báo tràn sẽ được kích hoạt. Trình phục vụ ngắt tràn sẽ xảy ra nếu được cấu hình cho phép trước đó.

BÀI 05 : Ngắt ngoài với STM32F1

BÀI 05 : Ngắt ngoài với STM32F1.


  1. Sơ lược về lý thuyết.
  2. NVIC - Nested vectored interrupt controller là bộ vector ngắt lồng nhau. Nghĩa là chúng ta có thể sử dụng kết hợp nhiều ngắt trong một chương trình. Ngắt là một phần quan trọng và thiết yếu của chương trình. Nếu không có ngắt thì chương trình sẽ thực hiện theo 1 trình tự từ trên xuống dưới mà không có bất kì sự can thiệp nào. Điều đó là bất lợi khi có 1 tác động ngoài xảy ra, chương trình sẽ không xử lí kịp thời dẫn đến việc bỏ qua tác động đó. Ngắt ra đời để phục vụ cho các sự cố đó.

    Một số thông số ngắt chính của STM32F103:

    • 16 mức ưu tiên có thể lập trình được.
    • Độ trễ thấp (xảy ra ngắt cực kì nhanh).
    • Có quản lí năng lượng cho vector ngắt.
    • Có các thanh ghi điều khiển quá trình ngắt.
    • 68 vector ngắt(xem thêm trong reference manual).

    Ngắt ngoài nằm trong 1 phần của ngắt NVIC. Mỗi EXTI – interrupt/event controller có thể được lập trình chọn loại sự kiện/ ngắt, chọn cạnh lên, cạnh xuống hoặc cả 2, mức ưu tiên ngắt.

    Một số tính năng chính của ngắt ngoài:

    • Kích hoạt độc lập và mặt nạ cho mỗi line sự kiện/ngắt.
    • Có bit trạng thái riêng cho mỗi line ngắt.
    • Có thể có tối đa 20 sự kiện/ ngắt, tham khảo thêm trong reference manual.
    • Kiểm tra tín hiệu ngoài có độ rộng xung nhỏ hơn clock trên APB2.

    Sơ đồ khối của các khối điều khiển ngắt ngoài:

BÀI 03 : CLOCK HỆ THỐNG VỚI STM32F1

BÀI 03 : CLOCK HỆ THỐNG VỚI STM32F1.


  1. Sơ lược về lý thuyết.
  2. Clock là một phần quan trọng của vi điều khiển. Bất kì 1 ngoại vi nào cũng cần clock để hoạt động. Trước khi tìm hiểu về một loại vi điều khiển nào đó chúng ta cần tìm hiểu trước tiên về một số đặc điểm chung về cấu hình của nó, điều đó là khá quan trọng. VĐK đó bao nhiêu bit?? bộ nhớ ra sao?? Ngoại vi như thế nào?? Phần mềm lập trình cũng như mạch nạp có thông dụng, dễ sử dụng, giá cả ra sao…... Một phần quan trọng nữa đó clock của hệ thống, clock hệ thống quan trọng cũng như nguồn nuôi của mạch điện, không có clock hệ thống vi xử lí sẽ không hoạt động được. Clock hệ thống quyết định tốc độ xử lí của vi điều khiển. Vi điều khiển có clock hệ thống càng lớn(tính theo Hz) thì tốc độ xử càng nhanh. Ví dụ: Khi các bạn thay đổi clock thì tốc độ delay của hàm delay tương đối sẽ thay đổi theo. Clock tối đa của STM32F103C8 là 72Mhz.

    Khi có thạch anh ngoài thì tốc độ tối đa sẽ là 72Mhz(thường thạch anh có giá trị 8Mhz) và đó cũng chính là tốc độ mặc định khi chưa cấu hình gì. Khi không có thạch anh ngoài thì tốc độ tối đa sẽ là 64Mhz nếu được cấu hình và tốc độ mặc định sẽ là 8Mhz nếu không cấu hình gì

BÀI 04 : SYSTEM TICK TIMER VỚI STM32F1

BÀI 04 : SYSTEM TICK TIMER VỚI STM32F1.


  1. Sơ lược về lý thuyết.
  2. System Tick Timer là bộ timer 24 bit độc lập nằm trong lõi cortex. Bộ timer này là timer đếm xuống, xảy ra ngắt ở mức ưu tiên cao khi giá trị đếm bằng 0 và tự nạp lại giá trị đếm ban đầu.

    System Tick Timer thường được được dùng để tạo hàm delay với độ chính xác cao, thay thế cho các hàm delay với độ chính xác tương đối dùng vòng lặp for hay while.

BÀI 02 : GPIO VỚI STM32F1

BÀI 02 : GPIO VỚI STM32F1.


  1. Sơ lược về lý thuyết.
  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. Ở STM32 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ó PortA mà lại không có PortD). Mỗi Port thường có 16 chân đánh số từ 0 -> 15 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 mode GPIO của STM32:

    • Input floating : cấu hình chân I/O là ngõ vào và để nổi.
    • Input pull-up : cấu hình chân I/O là ngõ vào, có trở kéo lên nguồn.
    • Input-pull-down: cấu hình chân I/O là ngõ vào, có trở kéo xuống GND.
    • Analog : cấu hình chân I/O là Analog, dùng cho các mode có sử dụng ADC hoặc DAC.
    • Output open-drain: cấu hình chân I/O là ngõ ra, khi output control = 0 thì N-MOS sẽ dẫn, chân I/O sẽ nối VSS, còn khi output control = 1 thì P-MOS và N-MOS đều không dẫn, chân I/O được để nổi.
    • Output push-pull: cấu hình chân I/O là ngõ ra, khi output control = 0 thì N-MOS sẽ dẫn, chân I/O sẽ nối VSS, còn khi output control = 1 thì P-MOS dẫn, chân I/O được nối VDD.

BÀI 00 : GIỚI THIỆU VỀ STM32F103C8T6

BÀI 00 : GIỚI THIỆU VỀ STM32F103C8T6.


  1. Giới thiệu sơ lược
  2. STM32 là một trong những dòng chip phổ biến của ST với nhiều họ thông dụng như F0,F1,F2,F3,F4….. Stm32f103 thuộc họ F1 với lõi là ARM COTEX M3. STM32F103 là vi điều khiển 32 bit, tốc độ tối đa là 72Mhz. Giá thành cũng khá rẻ so với các loại vi điều khiển có chức năng tương tự. Mạch nạp cũng như công cụ lập trình khá đa dạng và dễ sử dụng.

    Một số ứng dụng chính: dùng cho driver để điều khiển ứng dụng, điều khiển ứng dụng thông thường, thiết bị cầm tay và thuốc, máy tính và thiết bị ngoại vi chơi game, GPS cơ bản, các ứng dụng trong công nghiệp, thiết bị lập trình PLC, biến tần, máy in, máy quét, hệ thống cảnh báo, thiết bị liên lạc nội bộ…

    Phần mềm lập trình: có khá nhiều trình biên dịch cho STM32 như IAR Embedded Workbench, Keil C… Ở đây mình sử dụng Keil C nên các bài viết sau mình chỉ đề cập đến Keil C.

    Thư viện lập trình: có nhiều loại thư viện lập trình cho STM32 như: STM32snippets, STM32Cube LL, STM32Cube HAL, Standard Peripheral Libraries, Mbed core. Mỗi thư viện đều có ưu và khuyết điểm riêng, ở đây mình xin phép sử dụng Standard Peripheral Libraries vì nó ra đời khá lâu và khá thông dụng, hỗ trợ nhiều ngoại vi và cũng dễ hiểu rõ bản chất của lập trình.

    Mạch nạp: có khá nhiều loại mạch nạp như : ULINK, J-LINK , CMSIS-DAP, STLINK… ở đây mình sử dụng Stlink vì giá thành khá rả và debug lỗi cũng tốt.

    Board để lập trình: các bạn có thể mua sẵn 1 số kit ra chân đã có sẵn trên thị trường hoặc thiết kế 1 cái board dành riêng cho bản thân mình. Ở đây mình đã thiết kế 1 board đã tích hợp sẵn mạch nạp, mình cũng đã test và chạy khá ổn, debug bằng Keil C khá giống với phiên bản STlink V2 trên thị trường. Nói chung là sử dụng đồ tự làm khá thú vị. Đây là board của mình:

    Sơ lược về Board trên:

BÀI 01 : HƯỚNG DẪN TẠO PROJETC STM32 VỚI KEIL V5.

BÀI 01 : HƯỚNG DẪN TẠO PROJETC STM32 VỚI KEIL V5.


  1. Những phần mềm cần thiết cần cài đặt:
    • Đã cài Keil V5 trên máy tính và crack.
    • Đã cài đặt đầy đủ thư viện chuẩn họ MCU sử dụng.
    • Đã cài đặt driver cho stlink(Nếu sử dụng stlink).
    • Đã tải datasheet liên quan của MCU sử dụng.

    Các phần mềm này mình đã để link ở dưới.

  2. Tạo thư mục tên GPIO(tên này tùy ý) và 2 thư mục con trong thư mục GPIO với tên như sau :

    • Lib: chứa thư viện chuẩn của nhà sản xuất.
    • Project: chứa file viết code, ngắt và các file tạo ra khi chạy chương trình. Tạo thư mục con keil trong thư mục project(thư mục này sẽ chứa các file sinh ra khi biên dịch chương trình).