Bài 06: UART với STM32F303CC trong MXCUBE


Bài 06: UART với STM32F303CC trong MXCUBE

UART với STM32F303CC

  1. Giới thiệu sơ lược về UART.
  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). UART không phải là 1 chuẩn truyền thông, khi muốn nó là 1 chuẩn truyền thông hoặc 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....

    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…

    STM32F303CC có 3 bộ UART với nhiều mode hoạt động, với nhiều bộ UART ta có thể sử dụng được nhiều ứng dụng hơn so với 1 chip điều khiển so với STM8S. Một số tính năng nổi bật như sau:

    • Đầy đủ các tính năng của bộ giao tiếp không đồng bộ.
    • Điều chỉnh baud rate bằng lập trình và tốc độ tối đa lên đến 9Mb/s.
    • Cấu hình với nhiều mode hoạt động.
    • Có lựa chọn khi cấu hình với RS232 hoặc RS485.
    • Độ dài được lập trình là 7, 8 hoặc 9 bit.
    • Cấu hình bit stop hỗ trợ là 1 hoặc 2.
    • Có chân clock nếu muốn chuyển giao tiếp thành đồng bộ.
    • Cấu hình sử dụng 1 dây hoặc 2 dây.
    • Có bộ DMA nếu muốn giảm thời gian truyền nhận.
    • Bit cho phép truyền nhận riêng biệt.
    • Có cờ báo giao tiếp và cớ báo lỗi.
    • Cờ báo ngắt có thể lên đến 14 loại khác nhau.
  3. Cấu hình trên STM32 cubeMx.
  4. Vd: Viết chương trình VĐK nhận được kí tự nào từ máy tính thì gửi lại kí tự đó lên lại máy tính. Sử dụng phần mềm hescules để gửi và quan sát kí tự nhận được. Sử dụng UART2, tốc độ baud là 9600, sử dụng ngắt nhận UART. Led ở chân PB9 sẽ đảo trạng thái mỗi khi nhận được 1 kí tự mới.

    1. New project . Cửa sổ mới được mở ra. Chọn loại MCU theo tên hoặc theo họ, loại package… Ở đây mình nhớ tên luôn nên gõ vào cho nhanh STM32F303CC.

Bài 05: PWM với STM32F303CC trong MXCUBE


Bài 05: PWM với STM32F303CC trong MXCUBE

PWM với STM32F303CC

  1. Giới thiệu sơ lược về PWM.
  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ơ. Với động cơ, chúng ta có 3 loại điều khiển chính đó là : điều khiển vị trí, điều khiển vận tốc, điều khiển torque(moment). Khi dùng PWM để điều khiển động cơ chúng ta chú ý các khái niệm cần nắm rõ:

    • 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ái khái niệm về tần số, chu kì.

    Các timer có thể phát xung trên vi điều khiển này là :TIM1, TIM2, TIM3,TIM4, TIM8, TIM15, TIM16, TIM17. Mỗi timer có 1 hay nhiều kênh phát xung độc lập. Riêng TIM1 và TIM8 là 2 timer đặc biệt, nhà sản xuất đã ưu tiên nó với nhiều chế độ phát xung hơn, hỗ trợ hiệu quả tối đa cho việc phát xung, bảo vệ… 2 timer này có các kênh PWM đảo (vd: CH1 – CH1N) giúp tránh tình trạng trùng dẫn với nửa cầu H trên và nửa cầu H dưới của mạch driver điều khiển động cơ. Nó có chế độ one-pulse để xuất ra 1 xung hay nhiều xung với số xung đếm được, ngắt input để bảo vệ động cơ, có mode hỗ trợ encoder và cảm biến Hall…

    Sử dụng PWM chủ yếu là để điều khiển động cơ, khi điều khiển cần chú ý là mỗi loại động cơ đều có cơ cấu điều khiển khác nhau, tần số điều khiển cũng khác nhau. Cần chú ý về mục đích điều khiển là tốc độ, vị trí, moment… để xuất xung với số lượng xung, tần số và chu kì thích hợp.

    Trên STM32F303CC thì cần chú ý là sử dụng PWM của timer nào thì cần tra datasheet để biết ngõ ra của timer đó là chân nào, có Remap hay trùng với các chân đặc biệt, các chân timer khác không.

  3. Cấu hình trên STM32 cubeMx.
  4. Cấu hình TIM4 channel 4 với chu kì 1s, duty cycle là 30%.

    1. New project . Cửa sổ mới được mở ra. Chọn loại MCU theo tên hoặc theo họ, loại package… Ở đây mình nhớ tên luôn nên gõ vào cho nhanh STM32F303CC.

Bài 04: TIMER BASE VỚI MXCUBE SỬ DỤNG STM32F303CC

Bài 04: TIMER BASE VỚI MXCUBE SỬ DỤNG STM32F303CC

  1. Giới thiệu sơ lược về EXTI.
  2. STM32f303CC có tất cả 13 timer nhưng trong đó đã bao gồm 1 systick timer, 2 watchdog timer. Vậy có 10 timer dùng cho các chức năng như ngắt, timer base, PWM, Encoder, Input capture…. Trong đó TIM1 và TIM8 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, TIM2, TIM3, TIM4, TIM8 là các timer có đầy đủ 4 channel còn các timer còn lại là timer nội hoặc không đầy đủ các channel.

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

    • Timer clock.
    • Prescaler.
    • Auto Reload Value.

    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ị nạp vào 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à 32 bit tương ứng với giá trị nạp vào là 4294967295. Tuy nhiên chỉ có timer 2 có được giá trị này, các timer khác đều có tối đa là 16 bit tương ứng với giá trị nạp vào 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 tràn 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 đó.

  3. Tạo project với MXCUBE.
  4. Vd: chớp tắt led với chu kì 2s, 1 giây sáng, 1s tắt trên chân PB9, sử dụng ngắt tràn timer1.

    1. New project . Cửa sổ mới được mở ra. Chọn loại MCU theo tên hoặc theo họ, loại package… Ở đây mình nhớ tên luôn nên gõ vào cho nhanh STM32F303CC.

Bài 03 : EXTERNAL INTERRUPT với STM32F303CC

Untitled Document

EXTERNAL INTERRUPT với STM32F303CC

  1. Giới thiệu sơ lược về EXTI.
  2. GPIO_EXTI thực ra là ngắt ngoài trong thư viện chuẩn. Lưu ý là mỗi PORT(16 chân GPIO) chỉ có 6 vector:

    • Từ chân Px0 -> Px4 : mỗi chân 1 line ngắt.
    • Chân Px5 -> Px9 : chung 1 line ngắt.
    • Chân Px10 -> Px15 : chung 1 line ngắt.

    Mức ưu tiên ngắt được chia làm cấu hình bao gồm 2 thông số là PreemptionPriority và SubPriority với tổng số bit là 4. PreemptionPriority được ưu tiên số 1, càng nhỏ càng ưu tiên hơn, nếu PreemptionPriority bằng nhau thì xét đến SubPriority, SubPriority càng cao càng ưu tiên hơn.

BÀI 02: GPIO với STM32CubeMX trong STM32F303

BÀI 02: GPIO với STM32CubeMX trong STM32F303

GPIO với STM32CubeMX trong STM32F303.

  1. Cấu hình trên STM32  cubeMx.
  2. Vd : Cấu hình chân PB8 là nút nhấn(input), PB9 là chân LED(output). Khi mỗi lần có có tác động nút nhấn ở chân PB8 thì Led ở chân PB9 sẽ đảo trạng thái. Trạng thái mặc định ban đầu là tắt.

    1. New project . Cửa sổ mới được mở ra. Chọn loại MCU theo tên hoặc theo họ, loại package… Ở đây mình nhớ tên luôn nên gõ vào cho nhanh STM32F303CCT6.
    2. Chọn loại MCU, Double click vào tên MCU được tìm thấy hoặc bấm vào Start project để bắt đầu quá trình cài đặt. Cấu hình thạch anh, chuẩn nạp trước tiên như bài 01. Bài này sử dụng 1 button(mình sử dụng chân PB8, cấu hình input) và 1 led (sử dụng chân PB9, output). Click chuột trái để chọn chức năng cho ngoại vi.Click chuột phải để tạo nhãn cho chân ngoại vi cho dễ nhìn.
    3. Cấu hình clock ở tab clock configuration. Tùy thuộc vào thạch anh sử dụng và các ứng dụng khác nhau mà chỉnh tốc độ clock ở các mode khác nhau. Ở đây mình đã sử dụng thạch anh 8Mhz nên có thể điều chỉnh tốc độ tối đa của HCLK là 72Mhz. Những chỗ nào mà thay đổi giá trị được thì chỗ đó được phép thay đổi clock. Chúng ta có thể quan sát được đầu ra của tất cả các ngoại vi. Khá rõ ràng đúng không.
    4. Tab configuration . Chúng ta chỉ sử dụng GPIO mà không có ngắt nên chỉ quan tâm đến tab GPIO trong mục System. Các thông số như sau:
        • LED –PB9 :
          • GPIO output level : chỉ trạng thái mặc định khi chưa tác động đến nó(trạng thái khởi tạo chương trình).
          • GPIO mode: có 2 mode lựa chọn là Push pull và open drain khi lựa chọn ngõ ra là output. 2 mode này mình đã giải thích trong phần STM8S.
          • GPIO pull up/ pull down: lựa chọn việc nội trở bên trong MCU nối nguồn hay nối đất.
          • Maximum output speed: chỉnh tốc độ tối đa của ngõ ra high, medium, low tương ứng với 50Mhz, 20Mhz, 10Mhz.
          • Fast mode: mode này chỉ áp dụng với một số chân có chức năng I2C.
        • BUTTON – PB8:
          • GPIO mode: chỉ có 1 mode duy nhất là input.
          • GPIO pull up/ pull down : lựa chọn việc có kéo trở nối nguồn hay nối đất.

          Các tab RCC và SYS để mặc định. Nhấn OK để đóng tab.

    5. Cài đặt file xuất ra cho project : vào Project -> settings.
      • Tab project :
        • Projetc name : chứa tên gọi của project.
        • Project location : chứa nơi lưa trữ project.
        • Toolchain /IDE : chọn trình biên dịch mà mình mong muốn.
      • Tab code generate :
        • STM32Cube firmware library package : chọn Copy only the nesscessary library files… để chỉ add những file thư viện cần thiết.
        • Các thư mục khác để mặc định chưa cần quan tâm đến.
      • Tab Advanced Settings : để các thông số mặc định.
    6. Sinh ra code bằng cách nhấn vào biểu tượng hoặc vào Project -> generate code. Chờ quá trình thực hiện xong và mở code lên.
  3. Chỉnh sửa code trên keil C.
  4. Để chạy được chương trình ở lần đầu tiên, cần chọn reset and run trong options of target.

BÀI 01: Hướng dẫn tạo project với STM32CubeMX

Hướng dẫn tạo project với STM32CubeMX.

BÀI 01:
Hướng dẫn tạo project với STM32CubeMX.

  1. Giới thiệu sơ lược.
  2. STM32CubeMX là một phần mềm được cung cấp miễn phí giúp ích cho việc cấu hình ngoại vi, clock, tính toán dòng tiêu thụ, tạo project với nhiều dòng chip ARM STM32… Việc tạo project trở nên đơn giản bằng việc lựa chọn các ngoại vi cần thiết, cấp lock tùy chỉnh mà không cần liên quan đến code.

    Việc tạo project với thư viện chuẩn (standard library) là khá khó khăn vì cần nhiều bước để tạo ra project mới. STM32CubeMX ra đời như một lựa chọn để thay thế điều đó, với giao diện trực quan chúng ta sẽ dể dàng lập trình và có cái nhìn tổng quan hơn.

    Thư viện đi kèm với phần mềm này là STM32Cube HAL, gọi tắt là thư viện HAL, bộ thư viện này được chuẩn hóa, giúp đồng nhất giữa các dòng F0,F1,F2,F3,F4… Nhà sản xuất cũng cung cấp đầy đủ các ví dụ mẫu đi kèm với thư viện này. Cách tốt nhất để tự học là tự tìm hiểu các ví dụ mẫu này.

    Lưu ý: STM32CubeMX không phải là một trình biên dịch, nó chỉ là công cụ để sinh ra code, chúng ta vẫn phải dùng các trình biên dịch thông thường để quan sát, debug, lập trình, sửa lỗi…. Nếu bạn muốn tìm hiều sâu về vi điều khiển hãy bắt đầu nó bằng thư viện chuẩn(standard library) và ngược lai, nếu bạn muốn sử dụng một cách nhanh chóng hãy sử dụng thư viện HAL(STM32Cube HAL).

    Một số tính năng chính:

    • Dễ dàng quan sát các tính năng, thông số của IC.
    • Có cái nhìn tổng quan, bao quát hơn về lựa chọn, cấu hình chân, clock, ngoại vi.
    • Lựa chọn các board thí nghiệm của ST với các thông số cài đặt trước hoặc một MCU cụ thể.
    • Dễ dàng cấu hình ngoại vi, clock, các thông số và tự động sinh ra code.
    • Dễ dàng chuyển đổi giữa các loại MCU STM32 bằng cách tạo project mới một cách nhanh chóng.
    • Dễ dàng xuất file PDF các chân, tính năng… đã cấu hình.
    • Dễ dàng tạo ra project với nhiều trình biên dịch được lựa chọn.
    • Tính toán, quản lí năng lượng dễ dàng hơn.
    • Tự động cập nhật thư viện khi có bản cài đặt mới.
    • Thư viện được đồng nhất nên sẽ không có quá nhiều thay đổi khi chuyển đổi giữa các loại MCU. Ví dụ chuyển từ F1 qua F3, hay F4 và ngược lại.
  3. Cấu hình cơ bản GPIO.
  4. Dòng MCU mà mình sử dụng ở đây là  STM32F303CCT6 nên các ví dụ sẽ sử dụng loại MCU này luôn. Một vài thông số quan trọng mà dòng chip này có là  :

    • Thuộc dòng chip lập trình ARM cortex M4, 32 bit.
    • 48 chân, tốc độ lock tối đa là 72Mhz, bộ nhớ chương trình(flash) 256kbytes, SRAM 40kbytes.
    • Đầy đủ các chức năng như:
      • 4 bộ ADC 12 bit với nhiều channel, 2 kênh DAC 12 bit.
      • 13 timer :  2 watchdog timer, 1 systemtick timer, 10 timer thường với nhiều mode cấu hình.
      • Các giao tiếp : 1 CAN, 1 USB, 3 UART, 3 SPI, 2 I2C , 2 I2S.
      • 1 bộ RTC với đầy đủ chức năng.
      • Các cổng vào OPAMP, COMP.
      • Có touch sensing với 6 group với nhiều kiểu thiết kế để nâng cao hơn số nút nhấn có thể - cái này mình đã thử, khá ngon.
    1. B1 : mở STM32CubeMX, chọn new project để tạo project mới, load project để mở 1 project đã tạo.

BOARD STM8S003F3P6 - UART.










BOARD STM8S003F3P6 - UART.



Board STM8S003F3P6 được phát triển dựa trên dòng Vi điều khiểm STM8 rẻ của ST. Với tính năng không hề thua kém các dòng vi điều khiển 8 bit trên thị trường, Board này dùng cho các nghiên cứu, ứng dụng với quy mô vừa và nhỏ.
Các tính năng:

  • Vi điều khiển trung tâm : STM8S003F3P6.
  • Tích hợp cổng USB cấp nguồn từ máy tính chuyển đổi từ 5V -> 3V3 cung cấp cho mạch điều khiển.
  • Tích hợp IC chuyển đổi UART giúp dễ dàng hiển thị lên máy tính.
  • Có chân UART rời(tháo bỏ jump), dùng cho các ứng dụng giao tiếp với máy tính khác.
  • Có chân ra đầy đủ dành cho các chức năng.
  • Có các chân nguồn ra 5V, 3V3, GND.
  • Có 1 nút nhấn USER, 1 nút nhấn Reset.
  • 3 led hiển thị: Led nguồn, 2 led User.
  • Các ứng dụng ngoại vi: SPI, I2C, ADC, UART, TIM.
  • Kích thước nhỏ gọn : 65mm – 19mm.


Hình ảnh 3D của board:

BOARD STM32F103C8T6 - STLINK.










BOARD STM32F103C8T6 - STLINK.



Board thí nghiệm STM32F103C8T6 với thiết kế nhỏ gọn, thích hợp dành cho các bạn mới tìm hiểu về lập trình ARM 32 bit của ST. Board đã thiết kế kèm theo mạch nạp giúp việc debug và nạp code trở nên dễ dàng hơn.
Các tính năng:

  • Vi điều khiển trung tâm : STM32F103C8T6.
  • Tích hợp cổng USB cấp nguồn từ máy tính chuyển đổi từ 5V -> 3V3 cung cấp cho board mạch nạp nạp và mạch điều khiển.
  • Led hiển thị trạng thái hoạt động của mạch nạp.
  • Tách mạch nạp với MCU bằng cách tháo jump để sử dụng cho các mạch khác.
  • Sử dụng MCU 32 bit của ST.
  • Thạch anh 32.768Khz trên MCU chính dùng cho RTC hoặc backup data.
  • Button Reset và 2 Led hiển thị nguồn và GPIO(PB9).
  • Chân nguồn 3V3, 5V, GND output.
  • Tất cả các chân được output ở dạng chân cắm, dể dàng cắm dây test hoặc cắm vào các mạch ngoại vi.
  • Jump để chuyển đổi nạp boot loader hoặc nạp bằng Stlink.
  • Mạch được thiết kế nhỏ gọn và test đầy đủ, dễ dàng debug lỗi, có thể update firmware phiên bản mới nhất của nhà sản xuất.
  • Linh kiện bố trí chỉ trên 1 mặt.
  • IC này bao gồm các ngoại vi : ADC, CAN, I2C, RTC, SPI, TIM, USART, USB, DMA.
  • Tốc độ clock tối đa 72Mhz.
  • Kích thước : 70mm – 25.4mm.


Hình ảnh 3D của board:

BÀI 14: ENCODER VỚI STM32F103










BÀI 14: ENCODER VỚI STM32F103.



  1. Một số khái niệm 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 pháp 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.

BÀI 13: RTC VỚI STM32F103.










BÀI 13: RTC VỚI STM32F1.



  1. Một số khái niệm về lý thuyết.
  2. RTC(Real time clock ) là bộ thời gian thực được tích hợp sẵn trong STM32F103. Thay vì phải gắn thêm IC thời gian thực để đọc được ngày tháng năm, giờ phút giây thì không phải dùng nó khi dùng STM32F103. Một số ứng dụng chính như làm đồng hồ, mạch kiểm soát thời gian, báo thức, bộ đếm thời gian…
    Bộ RTC này sử dụng timer độc lập, tách biệt với các timer khác. Việc cài đặt thời gian, đọc thời gian cũng trở nên dễ dàng hơn bằng cách tác động trực tiếp vào các thanh ghi thời gian của MCU.

BÀI 12: I2C VỚI STM32F1.










BÀI 12: I2C VỚI STM32F1.



  1. Một số khái niệm về 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), IC chuyển đổi tín hiệu số, tương tự… 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. Ở 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.

BÀI 11: SPI VỚI STM32F1










BÀI 11: SPI VỚI STM32F1.



  1. Một số khái niệm về lý thuyết.
  2. SPI(Serial Peripheral Interface ) là chuẩn giao tiếp đồng bộ 4 dây do hãng Motorola phát triển. Chuẩn giao tiếp này bao gồm 1 thiết bị Master, 1 hay nhiều thiết bị Slave. Tốc độ giao tiếp SPI cũng là khá cao nên nó được dùng nhiều trong các ứng dụng như: module SIM, module Btultooth, Module wifi, IC nhớ, thẻ nhớ, IC RFID, IC chuyển đổi ADC, đọc tín hiệu vị trí từ IC màn hình, IC dịch bit….
    4 dây của chuẩn giao tiếp SPI bao gồm:
    • SCK: chân này là chân clock, duy trì xung nhịp cho mọi hoạt động truyền nhận. Nhờ có chân này nên SPI là chuẩn giao tiếp đồng bộ và data trong quá trình truyền nhận cũng ít sai sót hơn nhờ sự đồng bộ này. Xung nhịp chỉ do thiết bị Master phát ra.
    • MOSI(Master output slave input) : khi thiết bị được cấu hình là Master thì nó sẽ là chân xuất dữ liệu và khi là Slave thì sẽ là chân nhận dữ liệu.
    • MISO(Master input Slave output) : khi thiết bị được cấu hình là Master thì nó sẽ là chân nhập dữ liệu và khi là Slave thì sẽ là chân xuất dữ liệu.
    • CS – NSS : là chân chọn thiết bị, khi có nhiều thiết bị Slave, chân này sẽ là chân quyết định thiết bị nào sẵn sàng được giao tiếp. Ở 1 số IC nhớ, chân này sẽ là chân cho phép có được giao tiếp(enable) với IC đó hay không.
    STM32f103C8T6 có 2 cổng giao tiếp SPI tốc độ tối đa lên đến 18Mbs/s với nhiều mode cấu hình. Một số tính năng chính của giao tiếp SPI trên MCU này là:
    • Truyền đồng bộ full –duplex trên 3 dây chính, half – duplex, chỉ truyền, chỉ nhận.
    • Cấu hình bằng phần mềm là master hay Slave.
    • Khung truyền cấu hình là 8 hay 16 bit.
    • Cấu hình data truyền theo kiểu MSB hoặc LSB đi trước.
    • Có các cờ báo lỗi, tính năng CRC, cờ ngắt.
    • Có hỗ trợ DMA(bộ truyền tốc độ cao).
  3. Cấu hình sử dụng thư viện chuẩn.
  4. Vd: cấu hình SPI1(Master) và truyền dữ liệu cho SPI2(Slave), khi SP2(Slave) nhận được đúng dữ liệu gửi đi từ SPI1(Master) thì đèn led ở chân PB9 sẽ sáng, dùng ngắt nhận trên cổng SPI2. Khung truyền dữ liệu là 32 byte data.
    Đấu nối dây: thực tế khi chỉ có 1 Master và 1 Slave thì chỉ cần đấu 3 dây CLK, MOSI,MISO là đủ, tuy nhiên khi có nhiều thiết bị Slave thì cần có thêm dây CS, Ở đây mình thêm chân CS cho những trường hợp sau.
    1. Chương trình con cấu hình SPI1 làm Master:
    2. Chân nào nhận dữ liệu từ thiết bị khác thì cấu hình GPIO_Mode_AF_PP và chân truyền thì cấu hình GPIO_Mode_AF_PP, cấu hình mode là Master, truyền 8 bit, 2 bit 1 cạnh xung, tốc độ baud chia 8(tính ra được 9Mbs/s), bit thấp đi trước.
    3. Chương trình con cấu hình SPI2 làm Slave.
    4. Cấu hình tương tự như Master nhưng khác biệt là : Slave, tốc độ baud chia 4(tính ra vẫn được 9Mbs/s độ chia khác nhau nhưng 2 cổng SPI ở 2 nhánh clock hệ thống nhỏ khác nhau).
    5. Chương trình con thực thi ngắt SPI2.
    6. Khi nhảy vào ngắt, chương trình sẽ kiểm tra lại là có nhận data hay chưa và sau đó kiểm tra byte nhận đầu là kí tự ban đầu của chuỗi gửi hay không, tương tự với kí tự cuối cùng. Sau khi xử lý xong quá trình ngắt, cờ báo ngắt nhận sẽ được xóa để phục vụ cho lần ngắt tiếp theo.
    7. Chương trình thực thi trong main.
    8. Nút nhấn PC13 được nhấn thì SP1(Master) sẽ bắt đầu cho phép ngắt nhận ở SPI2(Slave), reset các trạng thái ban đầu và đợi cờ truyền trống, khi cờ truyền trống sẽ thực hiện việc truyền 32 kí tự.
      Flag_end =1 thông báo quá trình xử lí ngắt(trong file it.c) đã thực hiện thành công và không có sai sót. Led ở chân PB9 được bật để hiển thị kết quả. Các data nhận có thể được xem khi debug chương trình.
  5. Một vài thanh ghi quan trọng.
    1. SPI_CR1 - SPI control register.
    2. Thanh ghi này điều khiển chính quá trình truyền nhận data.
      • BIDI MODE: chọn lựa chế độ sử dụng cả 2 dây MOSI và MISO hay chỉ 1 dây.
      • BIDI OE: chọn lựa hướng của data là nhận hoặc truyền.
      • CRCEN: cho phép tính toán CRC(quá trình kiểm tra lỗi ) xảy ra hay không.
      • CRCNEXT : liên quan đến việc thiết lập truyền CRC.
      • DFF: lựa chọn kiểu data là 8 bit hay 16 bit.
      • RXONLY : thiết lập SPI ở chế độ chỉ cho phép nhận hoặc cả truyền và nhận.
      • SSM: liên quan đến việc sử dụng phần mềm để quản lí thiết bị Slave.
      • SSI : liên quan đến việc sử dụng chân CS hay không.
      • LSSBFIRST : cài đặt bit đi đầu là bit cao hay bit thấp của data.
      • SPE: cho phép hoặc không cho phép bộ SPI hoạt động.
      • BR[2:0]: cài đặt baud rate, liên quan đến tốc độ truyền data của cổng SPI.
      • MSTR : cài đặt cổng là Master hay Slave.
      • CPOL, CPHA: liên quan đến việc thiết lập data dich chuyển là cạnh lên hay cạnh xuống của clock.
    3. SPI_SR - SPI status register.

BÀI 10: DMA VỚI STM32F103






BÀI 10: DMA VỚI STM32F1.



  1. Giới thiệu sơ lược về DMA.

NẠP CODE CHO STM32 BẰNG BOOT LOADER










NẠP CODE VỚI BOOT LOADER STM32



  1. Boot loader là gì

BÀI 09: ADC TRONG STM32F103

BÀI 09: ADC TRONG STM32F103.


  1. Sơ lược 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ở, bảo vệ động cơ…. 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 STM32F103 là bộ ADC có 12 bit tức là giá trị đọc về nằm trong khoảng 0 ->2^12= 4096. Giá trị điện áp đầu vào bộ ADC được cung cấp trên chân VDDA và thường lấy bằng giá trị cấp nguồn cho vi điều khiển VDD(+3V3). STM32F103C8 có 2 kênh ADC đó là ADC1 và ADC2, mỗi kênh có tối đa là 9 channel với nhiều mode hoạt động như: single, continuous,scan hoặc discontinuous. Kết quả chuyển đổi được lưu trữ trong thanh ghi 16 bit. Đọc biến trở là ví dụ đơn giản nhất của chức năng ADC:

BÀI 08: UART TRONG STM32F103

BÀI 08: UART TRONG STM32F103.


  1. Sơ lược về lý thuyết.
  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). UART không phải là 1 chuẩn truyền thông, Khi muốn nó là 1 chuẩn truyền thông hoặc 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....

    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…

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).

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