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.