Hướng dẫn download source code datasheet từ www.st.com năm 2024

Linux offers various tools to interface with serial COM port, it uses ttySx for a serial port device name. For example, COM1 (DOS/Windows name) is ttyS0, COM2 is ttyS1 and so on.

1. Display Detected System’s Serial Support

Simply run dmesg command

$ dmesg | grep tty

2. Linux serial console programs

Once serial ports identified you can configure Linux box using various utilities:

  1. minicom

The best friendly serial communication program for controlling modems and connecting to dump devices

Minicom installation

Install the program with:

sudo apt-get install minicom

Alternatively, you can get Minicom via the Synaptic Package Manager.

If it is a direct serial connection, the output will be something like this:

[ 22.587279] console [tty0] enabled [ 24.186230] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A [ 24.186860] 00:08: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A [ 51.598012] audit(1243322582.732:2): type=1503 operation="inode_permission" requested_mask="a::" denied_mask="a::" name="/dev/tty" pid=5705 profile="/usr/sbin/cupsd" namespace="default"

For a USB-to-Serial adapter, one may see:

[ 0.000000] console [tty0] enabled [ 5.065029] usb 4-3: pl2303 converter now attached to ttyUSB0

Then try to run minicom with sudo minicom -s. An terminal application box appears, and now you should tickle around some time to learn how to use it. For eg try to configure COM port select, Baud rate, Stop bit ,….

Below is an example using Serial COM Port to access Raspberry Pi 3 terminal:

Hướng dẫn download source code datasheet từ www.st.com năm 2024

To exit Minicom when in terminal mode press ‘Ctrl-A’ to get a message bar at the bottom of the terminal window and then press ‘X’.

Don’t forget to save config as default with “Save setup as dfl”

  • excerpt from stackoverflow:

is a PL2303 and from everything I’ve read no additional drivers are required. The device is recognised as a PL2303. So you won’t need first install PL2303 driver as you have to in Windows

OK now I can ssh Rasp Pi 3 with Terminal in Ubuntu

You won’t see what you’ve sent only get what you receive via UART. You can see by joining RX-TX of PL2303

  1. cutecom

Users can also choose GUI version of Serial COM Port utility on Linux. Similar to famous GUI software on Windows like: Terminal, Hercules…

I found the most advantage of using GUI software rather than Terminal ones is the ability to separate Tx and Rx windows, in some applications (eg: your debug program), this could be very helpful.

  • Install from source code (CLI GUI on Linux. Using QT5. This is latested updated repo for cutecom):

https://gitlab.com/cutecom/cutecom

Preferences:

https://www.cyberciti.biz/faq/find-out-linux-serial-ports-with-setserial/

https://stackoverflow.com/questions/5347962/how-to-connect-to-a-terminal-to-serial-usb-device-on-ubuntu-10-10

https://help.ubuntu.com/community/Minicom

https://askubuntu.com/questions/631601/how-to-find-serial-port

In this article, I’m going to instruct most common ways to connect with the target MCU, for flashing program or debugging. First, you need to follow several steps:

Part A. Strategy

1. Reading the documents

To understand what communication protocol you will need and what’s available in your target MCU.

Figure out the debug/flash pins on your target

2. Choose your setup

After step 1, you must then select one best suited option for your case.

3. Prepare off the hardware

+ Programmer/Debugger

+ Connection wires

+ Target MCU interface

Part B. Traditional debug protocols

1. SWD protocol

In most cases we only need 4 wires: 2 power wires and 2 wires for CLK and IO.

a. Utilize onboard ST-Link from STM32F407VG Discovery

First remove the jumpers on STM32F407VG Discovery to download the firmware to another STM32 board supports SWD. From top to bottom the pin is specified as the following image:

Kit STMF4 Discovery Kit ARM design Comment 3V VCC No connect SWCLK/JTCK/Pin2 JTCK GND/Pin3 GND SWDIO/JTMS/pin 4 JTMS JTDI No connect TRACESWO/JTDO/pin 6 JSWO NRST pin JNRST/NRST

Connect to external STM32Discovery board:

Connect JTCK to PA14 on your target STM32F407. Connect JTMS to PA13 on your target STM32F407. Finally GND and VCC.

Hướng dẫn download source code datasheet từ www.st.com năm 2024

(UM1472 User manual Discovery kit with STM32F407VG Discovery board)

Pin6 SWO: SWD trace data line (optional and therefore not subject to this post). Thử xem cái này có phải dùng để chạy STMStudio hay ko, nếu có vẫn để thôi

2. JTAG protocol

Normally you’ll use SEGGER J-LINK (V8, V9), with pinout as follow:

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Note that: PB4 = nTRST = JNRST.

  • You can convert ST-Link to J-Link using SEGGER’s tool (in order to be used with other open-source tools like MCU on Eclipse)

https://www.segger.com/products/debug-probes/j-link/models/other-j-links/st-link-on-board/

Hướng dẫn download source code datasheet từ www.st.com năm 2024

3. SWIM protocol

Used for programming STM8S MCUs

C. Using bootloader

Flashing the code using bootloader

Besides the official methods mentioned above, with ST’s MCUs such as STM32Fx…, users have the options for flashing the firmware to the MCU.

One must know the difference between chip default bootloader (by the manufacturer) and user bootloader. User bootloader is a piece of program that can be changed by user that will be put at the start of executing Flash address (as any normal program), like: Arduino bootloader or Ardupilot bootloader…

1. Using ST’s bootloader via UART

This is useful when you don’t have any SWD, JTAG tool. Or when you don’t want to implement JTAG/SWD in your circuit.

Tie the BOOT0 to VDD, then reset the chip to go to the manufacturer’s bootloader (This bootloader program is designed by the chip manufacturer (ST) and can’t be changed). Now you can program the target using one of available UART ports (the bootloader program will scan for used UART port, so any 2-pin-1-UART-port will work).

Below are the related links:

Program STM32F4 with UART

AN3155 – Application note – USART protocol used in the STM32 bootloader

https://www.st.com/en/development-tools/flasher-stm32.html

2. ST’s USB DFU bootloader

Similar idea to UART bootloader, but DFU mode uses USB communication. This is useful if you don’t have USB-UART converter.

https://hocarm.org/usb-dfu-bootloader-trong-stm32/

3. User custom bootloader

You can make use of available open source projects for bootloader program (on Github…) and write or customize your own bootloader that suits your application

C. Other advanced methods

Links:

+ https://www.segger.com/products/debug-probes/j-link/tools/j-link-remote-server/

+ https://mcuoneclipse.com/2017/02/05/remote-board-debugging-j-link-remote-server-with-eclipse/

Hướng dẫn download source code datasheet từ www.st.com năm 2024

References:

  1. ST’s UM1472 ->6.1 Embedded ST-LINK (flasher and debug)

2. http://www.st.com/en/development-tools/seg-jlink.html

3. C:\Program Files (x86)\SEGGER\JLink_V622e\Doc\Manuals

5. Another product from SEGGER: J-Trace (it has full J-Link’s features)

6. https://www.segger.com/products/debug-probes/j-trace/

7. http://www.keil.com/support/man/docs/jlink/jlink_conf_interface.htm

8. https://docplayer.net/87930309-Can-bus-bootloader-for-the-stm32f407vg-page-1.html

Update March 4, 2020

it’s possible to use ST-Link programmer to program via ST-Link Utility and use STMStudio with only 4 pins.

Vcc, Gnd, SWD, SCK

The main question now is it’s necessary for pull-up resistors?

The SWD trace data line is only necessary if

http://survivalengineer.blogspot.com/2013/01/turning-stm32-evaluation-board-into.html

Stores my explanation or learning notes, can be developed to a complete post

I. Encryption, hash

Thuật toán encode/decode dữ liệu.

UID

Base64 encoding/decoding

Encryption

Mã hóa thông tin, cần key và loại mã hóa, dùng để đảm bảo dữ liệu chỉ được trao đổi giữa bên truyền và bên nhận.

DES: Data Encryption Standard

AES Advanced Encryption Standard

Hash/checksum

Một ví dụ đơn giản khi nói về cái này đó là,

Bạn muốn chia sẻ một file trên máy tính cho một người bạn qua mạng, tuy nhiên vì một lý do nào đó nên bạn buộc phải sử dụng Google Drive để lưu trữ file đó và chia sẻ qua đường link, và người khác muốn download phần mềm, trước khi chạy ứng dụng đó thì để đảm bảo rằng file được tải về đã không bị chỉnh sửa (có thể để chèn virus).

Đưa file đó qua thuật toán, có thể là MD5, SHA-1, SHA-256, hay SHA-512, output của nó sẽ là một chuỗi bao gồm cả ký tự và số với độ dài xác định.

Một số ứng dụng phổ biến của checksum/hash: đảm bảo data lưu trữ trên ổ đĩa nó không bị hư hỏng,

Cách tính Checksum của một file trên Linux:

Hàm một chiều: Input -> Hash Function -> Output.

Và để tính các trường hợp Input mà cho ra cùng một loại Output (hàm ngược của Hash Function) trên là điều rất khó có thể thực hiện và tiêu tốn rất nhiều thời gian.

CRC

Nó được được coi là một hàm băm, và thường được sử dụng để kiểm tra tính vẹn toàn của dữ liệu trên một đường truyền nào đó, ưu điểm của nó là đơn giản, và chú ý là nó không bằng các hash function khác về tính bảo mật và hiệu quả.

References:

https://www.howtogeek.com/363735/what-is-a-checksum-and-why-should-you-care/

https://www.digistar.vn/su-khac-biet-giua-hashing-va-encryption/

https://anhhangxomonline.net/2009/08/26/hash-la-gi-va-co-tac-dung-gi/

III. Dùng digital multimeter Pro’skit MT 1706

Live Wire Test:

kiểm tra dây nóng/nguội của mạng điện. Chỉ cần cắm 1 đầu que đồ màu đỏ và thử từng dây, nếu là dây nóng ( Live Wire ) thì nó sẽ phát ra tiếng kêu.

Khi dùng chức năng này cần để ý đến mức độ tiếng kêu của nó khi chạm vào dây Live. Nếu đúng là dây nóng thì nó sẽ kêu full vạch có hiển thị thêm led đỏ ( ngoài xanh ).

Ví dụ đơn giản nhất là cắm điện vào, dò thử xem trên thiết bị có chỗ nào dòng bị rò hay không để mà biết sử dụng cho an toàn

Non Contact Voltage:

Kiểm tra có điện áp trong đường dây một cách không tiếp xúc, để ý thì sẽ thấy ở trên đầu có cái đầu như núm vặn NCV ( nhưng không vặn được ), bật qua chế độ NCV, đưa lại gần các loại dây thì nếu có điện áp trên 2 đầu dây đó nó sẽ phát ra tiếng kêu.

2 cái lõm nhỏ 2 bên ở mặt sau của DVOM này là nơi để đầu que đo, bạn có thể gắn cố định 1 đầu và cầm 1 đầu còn lại cắm vào chân đo.

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Đo dòng điện và điện áp chỉ cần chủ ý đến thang đo: đo ra số âm dương A, V

Đo thông mạch và đo diode:

quay đến kí hiệu đo 2 cái này, đọc datasheet nó sẽ chỉ rõ trong trường hợp thông mạch, điện trở ở mức nào thì nó sẽ kêu.

Để chuyển qua mode đo diode, bấm nút SEL ( màu đỏ ), nếu khi đó đúng cực âm dương của diode nó sẽ hiển thị điện áp ~1.7V

IV. Tự cấp nguồn cho USB Hub giá rẻ

Bài hướng dẫn chi tiết và dễ hiểu:

https://www.instructables.com/id/Adding-an-external-power-supply-to-a-cheap-USB-hub/

Khi mua cái USB Hub giá rẻ về mà không có kèm nguồn phụ, thì có thể cái Hub đó nó chỉ nhận được 2, 3 thiết bị để điều khiển. Đôi khi nó còn bị chập chờn ngắt tín hiệu, lý do là dòng tiêu thụ của 1 cổng USB trên máy tính thường giới hạn tối đa 2 thiết bị, cho nên khi ta cắm Hub vào nó sẽ phải chia sẻ băng thông và dòng cho tất cả các thiết bị USB cắm vào 1 cổng USB trên máy tính của bạn.

Do đó, có thể tự thêm nguồn vào nó để nó có đủ dòng cung cấp cho nhiều thiết bị hơn.

Link cái USB 7 cổng cùi của mình

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Chuẩn bị:

+ Adapter 220v -> 5V, dòng cấp cỡ >=2Ampere. Tùy thuộc vào nhu cầu sử dụng của bạn

+ Dây nối điện, mỏ hàn…

Cách để mà làm sao nó gắn lại và chạy được là tùy mỗi cổng USB Hub. Nhưng ý tưởng chung là:

  • Ngắt kết nối dây Vcc từ cổng USB chính đến chân Vcc trên cổng USB máy tính(dây nối để lấy nguồn từ cổng USB máy tính).
  • Tiếp theo, nối Vcc và GND của ngõ ra Adapter vào Vcc và GND của USB Hub -> sau đó, bạn nên kiểm tra lại bằng Đồng hồ điện VOM có bị thông chập nguồn hay không.

Đối với cổng USB trên máy tính: Hiện nay đa phần đều có cơ chế bảo vệ cổng USB nếu nó bị chập nguồn, tuy nhiên đối với các máy không bảo vệ thì có thể gây nên hư hỏng cổng USB trên máy của bạn đấy nhé.

VI. HC-05 Bluetooth Test communication tutorial

How to implement Bluetooth communication into your project? First you need to ensure the communication work well to perform the next steps you want. I will guild you ….

Bluetooth HC-05 module test using computer’s software Hercules.

Note that the module’s pins you have may differs mine.

STATE, RX, TX, GND, +5V, EN and a small button.

Pinout:

[su_table]

HC-05 PL2303 RX TX TX RX GND,+5V GND,+5V

[/su_table]

and the two pins are left floating. ( Now we don’t use that )

+ Connect the PL2303 to PC to power HC-05 module. Enter the Hercules. Configure Serial communication as following:

Hướng dẫn download source code datasheet từ www.st.com năm 2024

( connected )

+ You should perform some AT commands for testing. Read all AT commands in datasheet. The small button must be pressed and hold to receive AT command (AT command mode ). If not its default is in the Data mode.

Then I recommend the Android’s app: Bluetooth Terminal for serial communication. You can send whatever you like to make sure the module works perfectly. So depends on your needs to build your own Bluetooth application!

VII. Advanced Control Theory ( for USV ) and …

Advanced Control Theory.

Don’t be stuck. Know when you got stuck and handle it.

Basic Control Theory: PID controller. Control signal ( which is calculated and then output to the system ). >>

+( Reference Model Control: Diophantine …. )

When designing a control system for real application, one inevitably meets problems such as: ….

Therefore, We must consider “Self-Tuning Regulator”, STR is a system designed to resolve simultaneously 2 things:

  1. Identify system’s model ( we face a lot of systems can’t easily be identified ), thus we need a system to estimate model’s parameter
  2. Calculate the control signals.
    Hướng dẫn download source code datasheet từ www.st.com năm 2024
    STR block diagram
  3. Wikipedia:

A gyrocompass is a type of non-magnetic compass which is based on a fast-spinning disc and the rotation of the Earth (or another planetary body if used elsewhere in the universe) to find geographical direction automatically

Hướng dẫn download source code datasheet từ www.st.com năm 2024

VIII. Module P3X GNSS Module board

Module GNSS receiver trong bài này lấy từ con Phantom 3 Professional. NEO-M8

Các hệ thống GNSS: GPS, Galileo, GLONASS, BeiDou. Và cả augmentation systems.

Để đọc dữ liệu từ module GPS này, kết nối như sau:

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Để xác định pin 0 bạn nhìn hình sau:

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Do module sử dụng chuẩn giao tiếp UART, nên ta chỉ cần dùng 1 module UART to USB là PL2303 rồi cắm vào máy tính. Dùng phần mềm đọc cổng COM là được ( ở đây mình dùng Terminal ).

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Dữ liệu trả về trong trường hợp không nhận được tín hiệu từ vệ tinh.

Đọc dữ liệu.

Chúng ta sẽ đọc tọa độ hiện tại, và tốc độ.

$GPRMC và $GPGSA được gọi là một loại NMEA sentence!

Ví dụ:

Để có thể hiểu rõ và tận dụng đầy đủ chức năng, cũng như cách để sử dụng module này thì ta cần đọc kỹ datasheet và xem các bài hướng dẫn trên mạng.

$GNRMC,080813.00,A,1046.45364,N,10639.28801,E,0.022,,090318,,,A*62

080813.00: đọc là giờ UTC 08 giờ 08 phút 13 giây. Vì Việt Nam ở múi giờ UTC+7, nên giờ địa phương sẽ là:

15 giờ 08 phút 13 giây.

1046.45359,N: đọc là 10 độ 46.45359 phút vĩ Bắc

10639.28801,E: đọc là 106 độ 39.28801 phút kinh Đông

Mỗi dữ liệu trả về bắt đầu bằng ký tự “$” và kết thúc bằng ký từ “*”.

References:

Main:

https://www.u-blox.com/en/product/neo-m8-series

NEO-M8-FW3_DataSheet_(UBX-15031086)

u-blox M8 Receiver Description Including Protocol Specification

Others:

monocilindro.com/2016/03/28/reading-gps-data-using-arduino-and-a-u-blox-neo-6m-gps-receiver/

http://www.toptechboy.com/arduino/lesson-24-understanding-gps-nmea-sentences/

https://github.com/o-gs/dji-firmware-tools/wiki/P3X-GPS-Module-board

https://www.semiconductorstore.com/blog/2015/What-is-the-Difference-Between-GNSS-and-GPS/1550

Phần mềm u-center.

Note: để có thể nhận dữ liệu GNSS trả về module chính xác, module phải được đặt ngoài trời, nơi không gian thoáng và không có vật cản. Đợi khoảng 30-60s tín hiệu sẽ trả về ổn định.

http://forum.sodaq.com/t/strange-output-from-gps-on-nb-iot-shield/1224/14

IX. My linux Terminal reference

scan storage:

$ df -h

shutdown

$sudo shutdown -h now

download:

$ wget https://abc.com/efg.zip

scan available WiFi networks

$ sudo iwlist wlan0 scan

$ ls: list all contents command color meaning:

$ ls -l: list and view permissions

Blue: Directory Documents

Green: Executable or recognized data file

Sky Blue: Linked file

Yellow with black background: Device

Pink: Graphic image file

Red: Archive file file.tar.gz … and a lot more

Install packages

http://www.familug.org/2013/09/cli-cac-lenh-quan-ly-package-tren.html

After downloading a .tar.gr file to install something, extract that file , follow README inside to install.

If you fail to install something, some packages, try different ways to install it by using Google!

$ sudo apt-get install <package>

$ sudo apt install vlc

$ sudo apt-get remove <package>

$ sudo apt-get –purge remove <programname>

–purge: remove all configuration file of the program also

$ sudo apt-get update

$ sudo apt-get upgrade

install via PPA / ppa: personal package archives

$ sudo add-apt-repository ppa:maarten-baert/simplescreenrecorder

$ sudo apt-get update

$ sudo apt-get install simplescreenrecorder \>Download, update, install install via PIP:

you have to install pip …

$ pip install beautifulsoup4

List all installed package in Ubuntu:

lapt list –installed

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Application, install software:

In the working directory: cd bcm2835-1.XX Run the configure exe ./configure Execute the makefile $make Then $ sudo make check Then $ sudo make install The library is now ready to use.

https://robots.thoughtbot.com/the-magic-behind-configure-make-make-install

Linux command for compress and extract file:

.zip: first, install unzip $ unzip file.zip -d destination_folder

.tar or .tar.gz

$ tar -xvzf tenfile $ tar zxvf bcm2835-1.XX.tar.gz

Read for more: http://www.familug.org/2012/09/nen-giai-nen-bang-command-line-trong.html

useful links:

X. Quá trình biên dịch, compiler and gcc

Compiler

Compiler hay còn gọi là trình biên dịch có thể được hiểu là công việc dịch chuỗi câu lệnh được viết từ một ngôn ngữ lập trình thành chương trình tương đương dưới dạng ngôn ngữ máy tính, thường là ngôn ngữ ở cấp thấp hơn, ngôn ngữ máy. Đơn giản dễ hiểu thì có thể tạm nói là nhờ Complier này mà file .c chúng ta viết mới được dịch thành file .hex .bin để nạp được xuống một MCU bất kỳ.

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Chúng ta có thể xem sơ đồ chi tiết các bước từ Code/Build/Run ở hình sau

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Các quá trình sau:

1_Preprocessor (tiền xử lý): chương trình sẽ copy nội dung của các file được include vào file mã nguồn chính, thực hiện xử lý các lệnh macro như

if

else và chọn code tương ứng theo điều kiện, và thực hiện các thay thế các macro được define trong chương trình.

Để buộc quá trình biên dịch dừng lại ở bước tiền xử lý, ta thêm option -E vào câu lệnh.

2_Biên dịch mã nguồn C/C++ thành mã Assembly tương ứng ISA của vi xử lý được chọn. Ta sẽ có file .s.

Mỗi câu lệnh, đoạn mã nguồn trong C đều sẽ được chuyển sang mã Assembly.

Để buộc quá trình biên dịch dừng lại ở bước này, ta thêm option -S vào câu lệnh.

3_Biên dịch thành các object code file.

Để buộc quá trình biên dịch dừng lại ở bước này, ta thêm option -c vào câu lệnh.

4_Linking

Kết hợp giữa các object file mã nguồn từ code của người dùng viết lên, đồng thời nó cũng sẽ tìm trong các đường dẫn được cài đặt để tìm các thư viện cần thiết (library object files). Kết hợp với linker script để tạo ra một file binary/hex hoàn chỉnh mà vi xử lý có thể chạy được.

GCC là gì

GCC = GNU Compiler Collection là một tập hợp trình biên dịch cho nhiều ngôn ngữ khác nhau, như tên của nó đã chỉ ra ý nghĩa này. Một sản phẩm của GNU Project

GCC là trình dịch chính thức của hệ thống GNU, và được hầu hết các hệ điều hành giống Unix, bao gồm Linux, dòng hệ điều hành BSD, và Mac OS X chọn làm trình dịch tiêu chuẩn.

GCC đã tương thích với rất nhiều nền tảng kiến trúc máy tính đa dạng, và được sử dụng rộng rãi như một công cụ làm môi trường phát triển các phần mềm thương mại, có bản quyền và nguồn đóng. GCC cũng có thể dùng trong hầu hết các nền tảng nhúng

GCC là một cross-compiler, dùng để tạo file thực thi trên một platform khác.

Bộ GNU C và C compiler tương ứng là gcc và g.

GNU

nhân vật quan trọng: Richard Stallman, Linus Tovalds

Trang web: http://gcc.gnu.org/

Trình biên dịch thì sẽ thực hiện dịch sang ngôn ngữ máy, và tạo ra một file có thể thực hiện được.

  • Tạo một file .c ví dụ hello.c
  • Để biên dịch hello.c sử dụng command sau

gcc -o hello hello.c

Lúc này gcc đã biên dịch ra một file excutable tên là hello. Để chạy : ./hello

Có một vấn đề, đó là nếu như bạn có một project, có nhiều file liên kết lại với nhau để có thể build 1 chương trình cuối cùng để thực thi. Thì làm thế nào để có thể cho gcc hiểu để biên dịch thành công file excutable cuối cùng. Xin giới thiệu make file

Tại sao phải học về Compiler, GCC và Makefile làm gì, Khi đã có IDE chỉ cần setting và chạy là xong? OK nếu bạn không cần dùng, không có lý do lại đi học nó cả, có thể dành một chút thời gian nhỏ để đọc qua để biết nó tồn tại, mở rộng kiến thức.

[su_table]

[/su_table]

References.

https://en.wikipedia.org/wiki/GNU_Compiler_Collection

https://vi.wikipedia.org/wiki/B%E1%BB%99_tr%C3%ACnh_d%E1%BB%8Bch_GNU

http://icviet.vn/gcc-compiler/

hocarm.org/tim-hieu-compiler/

vi-du-voi-gcc-compiler

http://faculty.cs.niu.edu/~mcmahon/CS241/Notes/compile.html

https://www.freelancer.com/community/articles/how-c-works-understanding-compilation

XII. Biên dịch tự động với waf build

Với một project source code lớn thì việc quản lý các file trong dự án và quản lý để nó biên dịch, sắp xếp tài liệu, cập nhật các tool mà project cần, theo ý muốn quả thực không phải là một công việc dễ dàng. Việc đưa ra giải pháp cho build source code tự động này cần có một giải pháp. Hiện nay có rất nhiều phần mềm hỗ trọ cho việc build tự động này. Ví dụ như make, cmake, SCons, MSBuild.

Với Waf, quá trình build sẽ được chia ra thành quá trình riêng biệt: Configure ( cấu hình ), và build. Khi đó việc cấu hình chỉ diễn ra một lần duy nhất.

Waf được viết bằng Python, không như các phần mềm tự động build khác như: cmake cần phải cài đặt như một phần mềm. Chúng ta chỉ cần download vào trong thư mục cần sử dụng waf, sau đó viết ra file để chạy.

Ta sẽ tạo 3 file có tên là main.c, data.c và show.c. Hai hàm data() và show() nằm trong 2 file có tên tương ứng. Và hàm main() tại main.c sẽ gọi 2 hàm này.

Nội dung của data.c chứa hàm data( ).

include <stdio.h>

void data( ) {             printf(“nLet us learn about Wafn”); }

Nội dung của show.c chứa hàm show( ).

include <stdio.h>

void show( ) {             printf(“nWaf is a build automation tooln”); }

Chúng ta có thể biên dịch và link cả 3 file này cùng một lúc bằng dòng lệnh dưới đây. Kết quả cho ra một file thực thi hello

$gcc main.c data.c show.c –o hello

Vấn đề ở đây là nếu dùng dòng lệnh trên, thì các 3 file C trên đều được biên dịch cho dù chúng cho bị thay đổi nội dung hay không. Vì vậy thông thường chúng ta sẽ biên dịch từng file và link lại như bên dưới

$gcc –c main.c $gcc –c data.c $gcc –c show.c $gcc main.o data.o fun.o –o hello

Một ví dụ tạo Waf script đơn giản

Tạo một file tên wscript đặt trong thư mục có chứa waf. Với nội dung của wscript như sau:

top = ‘.’ out = ‘.’ def options(opt): opt.load(‘compiler_c’) def configure(conf): conf.load(‘compiler_c’) def build(bld): bld.program(source=’main.c’, target=’hello’, use=’data show’) bld.objects(source=’data.c’, target=’data’) bld.objects(source=’show.c’, target=’show’) def test(tst):

        print(“nThis is a waf test functionnn”)
Sau đó tại thư mục này chúng ta chạy 2 lệnh sau trên Terminal:

$./waf configure

$./waf

Kết quả

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Đối với một chương trình lớn, chúng ta rất khó để có thể biên dịch từng file và link lại như ví dụ ở trên. Cho nên các hệ thống build tự động được ra đời.

Configure được dùng để cấu hình các đường dẫn, và những yêu cầu cần thiết cho việc build hoàn thành. Và các tham số được dùng cho các lệnh kế tiếp.

opt.load(‘compiler_c’) được waf dùng để nó tìm trình biên dịch ngôn ngữ C có trong hệ thống, nó có thể là: gcc, hoặc là LLVM,… Tương tự để tìm trình biên dịch cho ngôn ngữ C++ thì lệnh tương ứng sẽ là opt.load(‘compiler_cxx’)

Build

Sau khi chạy lệnh $./waf configure. Để thực hiện build ta sẽ dùng $./waf hoặc $./waf build. Khi đó waf sẽ thực hiện các lệnh trong hàm build(bld) của wscript.

Một project có thể chứa nhiều file wscript trong mỗi các thư mục con của nó.

opensourceforu.com/2017/02/waf-excellent-build-automation-tool/

Sau khi build xong. Nếu ta không cung cấp cho wscript dòng lệnh out=’./a_dir’ để chứa tất cả kết quả build thì Waf sẽ tự động tạo một thư mục có tên build để lưu trữ kết quả build.

Waf hoạt động theo nguyên tắc: “chỉ biên dịch khi có sự thay đổi” . Tuy nhiên chúng ta có thể buộc chúng thực hiện lại tất cả quá trình bằng dòng lệnh.

  • clean: clean project và các dòng lệnh chính sẽ được thực hiện lại trong lần chạy Waf tiếp theo.
  • distclean: clean sâu hơn, xóa thư mục build, yêu cầu cấu hình (configure) lại cho lần chạy Waf tiếp theo.

Một số hàm thông dụng trong Waf build system

bld.env.PYTHONPATH=os.getcwd() : set biến môi trường PYTHONPATH.

bld.recurse(‘src’) : nó sẽ vào thư mục con tên src. Tìm file có tên wscript và thực thi hàm build được định nghĩa ở đó.

In this tutorial: I use a J-Link v9 and a STM32F407 Discovery Kit.

Note that on STM32F407 Discovery Kit, an on board ST-LINK is already integrated so:

  • User can utilize it to interface/flash/debug code with other targets (Refer to UM1472 section 6.1 Embedded ST-LINK for more details).
  • Disconnect embedded ST-Link with the board to connector the STM32F407VG chip using other debuggers.

Interface wiring: connect the target chip using J-Link by one of two interfaces below

Hướng dẫn download source code datasheet từ www.st.com năm 2024

For example to connect STM32F4 with the debugger by SWD interface, the wiring is as the following:

JLink <-> STM32

  1. GND <-> GND

2. SWDIO <-> PA13

3. SWCLK <-> PA14

4. Power line

Thông tin về mạch program/debug J Link:

XIV. Simmechanics trong Matlab

Là một tool rất hữu ích trong việc mô phỏng các robot. Liên kết mô hình được vẽ Simulink qua Matlab, để có thể kết hợp với toolbox dùng cho mô phỏng và điều khiển của matlab.

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Link chính:

https://www.mathworks.com/help/physmod/smlink/ug/installing-and-linking-simmechanics-link-software.html

Đăng nhập vào trang web: https://www.mathworks.com/products/simmechanics/download_smlink.html

Nhập thông tin của mình để matlab biết người dùng, không yêu cầu gì thêm. Sau đó bạn sẽ được chuyển hướng tới trang download.

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Chọn bản cần download tương ứng với phiên bản matlab đang dùng. Down cả 2 file cho option đã chọn.

  • Tiếp tục cài đặt bằng bước 2 của mục đó, theo hướng dẫn.

Vào solidworks, bật add-in Simmechanics mới thêm vào

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Đó là SimMechanics Link

Sau khi hoàn tất cài đặt. Ta tiến hành đưa 1 project từ Solidworks qua bên Matlab Simulink để mô phỏng.

Bước 1: Xuất file từ Solidworks ra một file mà matlab có thể hiểu. Vào Project cần xuất, bấm tool -> SimMechanics Link -> Export -> SimMechanics First Generation.

Đợi 1 chút để nó xuất ra file.

Bước 2: Chọn thư mục làm việc của matlab là thư mục vừa xuất file từ bên Solidworks ra. Trên command prompt, gõ và enter mech_import, trở tới file xml và nhấn Open -> OK cho nó build lên model

Cần chú ý với một số người mới làm lần đầu, thì việc tốt nhất đó là lên mạng đọc + xem videos Youtube cách người ta làm, hiểu rõ nếu không sẽ mắc rất nhiều sai lầm. Như việc đặt hệ trục tọa độ, cài đặt thông số,…

XV. Tụ điện vui

Khi bạn dùng multimeter để đo điện áp đã được nạp lên tụ, ta có thể thấy rằng điện áp dần dần tụt xuống rất chậm. ( 47uF – 5V nó tụt cỡ 0.01V/second ), chứng tỏ một phần hoạt động của multimeter để đo nó sẽ tiêu tốn một phần năng lượng rất nhỏ.

Tính toán năng lượng tích trữ trên tụ: E=1/2*CU^2.

quan hệ giữa dòng điện và điện áp trên tụ: i=C*du/dt. -> u.

Một ví dụ về ultracapacitor: C=650F. Nếu ta nạp điện cho đến khi điện áp trên tụ lên đến 10V. Thì năng lượng tích trữ trên nó là: E=32.5 kJ.

Tính toán thời gian để nạp tụ điện lên một điện áp Vo nhất định. Điện áp này là điện áp cấp vào 2 đầu tụ để nạp

I/C=du/dt nhờ công thức này ta có thể tính ra tỷ số k=du/dt với đơn vị Volt/sec. ( cần đo dòng điện mà ta cấp để nạp cho tụ )

Lấy Vo/k ta sẽ ra thời gian để nạp điện áp trên tụ lên Vo volt

Sự khác biệt giữa tụ điện và pin là gì nếu như chúng nó đều dự trữ năng lượng và giải phóng năng lương? sử dụng càng nhiều thì năng lượng dần mất đi và giảm xuống??

Xét về các cách mắc của tụ điện -> điện dung và điện áp định mức tương ứng thay đổi ntn

Video tham khảo:

Khi làm việc với các dòng vi điều khiển ARM, thông thường chúng ta sẽ sử dụng IDE và làm theo các hướng dẫn trên mạng và chỉ cần cấu hình một số tùy chọn đơn giản là có thể phát triển ứng dụng cho target chip. Tuy nhiên, để có cái nhìn rộng và sâu hơn về hệ thống thì ta sẽ cần phải hiểu các công cụ và thành phần của quá trình biên dịch, nó giúp ích rất nhiều cho việc tùy biến theo ý thích của bản thân, hiểu được source code các project lớn (như FreeRTOS), và debug chương trình.

Ở bài viết này sẽ chỉ dừng lại ở mức độ cơ bản về khái niệm các công cụ. Cho nên việc đi sâu vào từng công cụ, cách lập trình thì trên mạng đã có khá nhiều bài viết (nên sử dụng tiếng Anh để tra cứu và học) các bạn tự tìm hiểu nhé. Mình có để một số link hữu ích ở cuối bài viết.

[GNU toolchain]

Hướng dẫn download source code datasheet từ www.st.com năm 2024

GNU toolchains bao gồm các công cụ (programs) như: GCC, GNU Make, Linker, GDB, Assembler … Chúng ta sẽ sử dụng các công cụ này để làm việc với các file mã nguồn, với mục đích cuối cùng là từ các file mã nguồn sinh ra file .hex (hoặc .bin cũng được) để nạp vào vi điều khiển hoặc là debug chương trình.

Điểm mạnh nhất mà người dùng nhân được khi sử dụng GNU toolchain để phát triển ứng dụng đó là nó miễn phí, do đó tiết kiệm khoản chi phí đáng kể cho dự án. Hơn nữa là nó đều có thể được sử dụng trên 3 hệ điều hành phổ biến hiện nay (ví dụ bất tiện là nếu bạn quen dùng Keil IDE, nhưng trên Linux OSes thì hiện tại không có Keil C nha)

[Compiler]

Nhiệm vụ của chương trình biên dịch đó là chuyển mã nguồn từ ngôn ngữ bậc cao hơn sang chương trình tương đương ở ngôn ngữ cấp thấp hơn ( assembly code).

Trong thực tế, khi chúng ta compile bằng chương trình gcc thì nó sẽ chuyển từ source code -> assembly source code -> object file luôn. Và nếu muốn xem mã assembly của source code thì người ta sẽ dùng chương trình objdump (disassembler)

Đối với mỗi kiến trúc vi điều khiển khác nhau thì có một trình biên dịch khác nhau (vì kiến trúc tập lệnh của chúng khác nhau). Thí dụ như nếu dùng GCC thì ta sẽ lựa chọn target bằng cách thêm option $-mcpu=cortex-m4 trong chương trình gcc.

Khi làm việc với dòng chip STM32Fxx (Cortex M), thì có các trình biên dịch phổ biến nhất, đó là: ARM compiler (được sử dụng trong Keil IDE), IAR compiler và GNU compiler.

Có một video rất hay giải thích về cách người ta sẽ lập trình để chuyển mã C sang mã Assembly như thế nào, bạn nào muốn tìm hiểu kỹ hơn thì vào xem nhé:

Youtube – How do computers read code? https://www.youtube.com/watch?v=QXjU9qTsYCc

[Assembler]

Assembler có nhiệm vụ chuyển mã assembly sang các object file (mã máy dạng nhị phân). Nếu bạn đã từng học lập trình LC3 ISA, hay kiến trúc khác thì đều biết rằng mã Assembly có thể chuyển đổi ngay sang mã nhị phân bằng cách tra Instruction Set, Assembler sẽ làm điều này một cách tự động cho chúng ta.

[Make và Makefile]

Make là một chương trình máy tính được viết bằng ngôn ngữ C, nó sẽ đọc các file Makefiles và thực thi các rules trong đó.

Makefile quy định các rules, với mục đích biên dịch tự động cho project. Tuy rằng hiện nay có một số công cụ khác cho build automation như CMake, waf,… Phần lớn mọi người vẫn sử dụng Makefile từ dự án nhỏ cho đến dự án lớn. Ví dụ các dự án dùng Makefile như: betaflight, valgrind, github.com/PX4/Flow,…

Một rule được viết trong Makefile có định dạng như sau:

<target> … : <prerequisites> …

<recipe> … …

<target>: là tên của file mong muốn được tạo ra từ một lệnh nào đó, nó cũng có thể là lệnh của action cần được thực thi (như clean, hoặc flash).

<prerequisite>: là các files, hoặc action cần có để có thể thực hiện các lệnh được viết ở <recipe>, make sẽ kiểm tra các <prerequisite> trước khi thực hiện các lệnh được viết ở <recipe>, nếu không có thì nó sẽ tìm và thực thi các rule để đạt được prerequisite (nếu có).

<recipe>: các lệnh được thực hiện, (thông thường sẽ chạy trên shell như bash).

Đối với nhiều người mới học, khi nhìn vào Makefile thường sẽ cảm thấy rất rối và dễ bỏ cuộc, thực ra việc học Makefile không quá khó, bạn chỉ cần nhớ được công thức trên, và cần tìm hiểu thêm một số thứ sau:

+ Hiểu phony target là gì

+ Một số kiến thức lập trình cơ bản (về biến)

+ Cách include Makefiles

+ Biết các lệnh chương trình trên shell

Nếu có phức tạp thì có lẽ là do Makefiles có nhiều code bởi vì hệ thống lớn (nhiều source code fjles) và cần tương thích nhiều target khác nhau, do đó hơi khó để bao quát và kiểm soát khi chỉ nhìn qua vài lần!

Sau khi compiler đã biên dịch được tất cả các file mã nguồn, tại bước cuối ta cần có file `stm32_flash.ld` (đuôi là .ld), là linker script tương ứng với MCU STM32F407xx. Tại bước link các file object lại với nhau, Linker sẽ dùng file này để đặt các dữ liệu phù hợp vào trong bộ nhớ Flash của MCU để cho ra file .hex nạp được vào vi điều khiển.

Ví dụ như trong chương trình chính, ta có sử dụng một biến global (toàn cục) với giá trị khởi tạo khác 0, thì trong Flash sẽ có vùng nhớ để lưu các biến này, vì khi MCU được cấp nguồn thì chương trình trong file startup.s sẽ có nhiệm vụ là khởi tạo biến này trên vùng nhớ RAM và gán giá trị ban đầu cho biến đó, để sử dụng trong chương trình.

Để biết thêm về Linker script thì bạn cần hiểu về memory map của chương trình, đọc các linker script và hiểu ý nghĩa các memory sections.

+ Bạn có thể kiếm linker script cho MCU của mình bằng cách lên github và gõ keyword phù hợp.

+ Và trong blog này cũng đã có một bài nói về Linker Script, bạn đọc thử tham khảo nhé!

[GNU Debugger (aka GDB)]

GDB được bắt đầu viết bởi Richard Stallman vào năm 1986 như là một phần của GNU system, hiện nay được duy trì và phát triển với GDB Steering Committee.

Ta sử dụng trình debug để có thể thực thi các lệnh từng dòng code, đặt breakpoints, theo dõi các thanh ghi, biến,… của chương trình. Tuy nhiên, nhược điểm đó là GDB chỉ hỗ trợ làm việc trên command-line interface, và nó không biết cách để giao tiếp với MCU, OpenOCD sẽ là thành phần hỗ trợ làm những việc này.

[OpenOCD (Open On-chip Debugger)]

OpenOCD là một phần mềm máy tính, có mục đích là cung cấp các tính năng như: debugging, in-system programming, và boundary-scan testing cho các thiết bị nhúng.

Như chúng ta đã biết hardware như ST-Link hoặc J-Link dùng giao tiếp SWO hoặc JTAG để giao tiếp với target chip. Qua đó cho phép chúng ta nạp code, xóa, thay đổi bộ nhớ Flash thông qua phần mềm như ST-Link Utility.

Hướng dẫn download source code datasheet từ www.st.com năm 2024

ST-Link, J-Link được gọi là Debug Adapter

Hướng dẫn download source code datasheet từ www.st.com năm 2024

OpenOCD nó sẽ làm việc với vi điều khiển gián tiếp qua Debug Adapter, và giao tiếp với Debug Adapter thông qua chuẩn USB. Như hình trên minh họa các thành phần của hệ thống, OpenOCD sẽ tạo GBD server để IDE như Eclipse – là GBD client có thể nạp code vào chip ngay trên các nút trên thanh công cụ, và debug ngay trên Eclipse GUI.

[References]

hocarm.org/tim-hieu-compiler/

hocarm.org/makefile-la-gi/

b4050n.wordpress.com/2016/12/24/stm8s-3-gpio-va-bien-dich-voi-make/

embedds.com/programming-stm32-discovery-using-gnu-tools-linker-script/

stackoverflow.com/questions/41365110/why-need-linker-script-and-startup-code

hertaville.com/a-sample-linker-script.html

thunderbench-Linker-Script-guide.pdf

https://github.com/ntfreak/openocd

Goals of this project

Learn typical code structure of professional level project

Build ardupilot with minimal files and folders (for Arducopter).

Learn build management: build tools, GNU toolchain commands, and build options,…

Static and dynamic library in C/C++, archive library (.a extension)

A lot of tools are added into the repository for more features, if you just want to study the code they can be removed, just keep all the necessary things for building the completed .hex file.

Some philosophies to keep in mind

Understand that Ardupilot abstracts a lot of steps, the higher the abstraction is, the more easy for users to use.

Most of the scripts are: shell scripts and python scripts.

The build system can be written in Makefile, but a lot more complex, and more code, so Ardupilot uses waf build system.

Hardware schematics

https://github.com/proficnc/ProfiCNC_Hardware

https://github.com/proficnc?tab=repositories

https://github.com/ArduPilot/Schematics

13 May 2019

Ardupilot is large, and it’s written by experienced developers from all over the world. It takes time and effort for understanding the whole system.

You may want to start off learning Ardupilot by modifying the code, add a new flight mode or enable/disable a feature, or maybe running the example sketches.

Consult other programmers.

15 May 2019

Good way to learn how to make changes to Ardupilot codebase is studying how did others do it. We can compare the code by using compare tools.

Implement new sensors.

Schedule a new task.

Run example sketches.

Run and study old ardupilot code, and compare them.

16 May 2019

Now, you must have a new way to see the code.

What Ardupilot wants to achieve when doing so, is that you always see that the board is all set up, everything such as sensors checking and initialization, object initialization and are all done (you should take them for granted) to you point of view if.

Try imagine that you power up the computer, close your eyes and open when the computer as the time you open your eyes again. This part of Ardupilot is just like that.

example sketches code, what you do there is just like you doing something with your computer when the computer has done booting, and in operating system GUI ready for you to use.

16 May 2019

Now you should go for sensor drivers code, hardware code, to see how Ardupilot abstracts this layer!

21 May 2019

Để hiểu hơn về cách mà Ardupilot được port lên board Raspberry/BBB, tạm thời không quan tâm đến waf, ta cần hiểu được cách nào mà nó có thể giao tiếp với các ngoại vi, cảm biến (PWM, uBlox GPS, MS5611, AHRS algorithm) được! NAVIO shield for Ardupilot có code sẵn trên mạng để ví dụ giao tiếp với các module cho máy bay viết bằng ngôn ngữ C++, cần đọc nó!

Cũng như biết được nó sẽ dùng hàm nào cho việc delay, POSIX, multi threading …., giao tiếp thông qua /dev/…., networking!! Các thư viện sử dụng trong code!

ChibiOS KHÔNG dùng với các board Linux

24 May 2019

Càng đọc càng hiểu hơn về hệ thống Ardupilot, thứ nhất cơ chế nó gọi các hàm, setup() và loop(), để mình có thể áp dụng theo cách riêng của mình vào code C cũng ok.

loop() sẽ chạy trong vòng lặp vô hạn như while() của chương trình C bình thường.

Ở đầu chương trình loop là đợi lấy mẫu dữ liệu INS lần tiếp theo (ta không nhất thiết đợi hết tất cả các cảm biến có dữ liệu mới), mà chỉ cần đợi những dữ liệu cảm biến mà sẽ cho chúng ta thông tin để tính toán IMU cho cân bằng quadcopter.

I.e `AP::ins().wait_for_sample();` function

while(1) {

collect_sensor_data();

main_loop(); // calculate AHRS, PID, update motor

scheduler_tasks();

}

Ủa hình như nó hoạt động kiểu như một vòng lặp mà, cái Ardupilot ấy, rõ ràng cái thread backend nó chạy đầu ở vòng loop main, tại sao nó lại nói là multi threads???

Khó hiểu đoạn này, xem lại phần code `void AP_InertialSensor::wait_for_sample(void)` để hiểu mình đang nói cái gì.

Khi đã hiểu rồi có thể port và tự làm lại một autopilot dựa trên kiến trúc của Ardupilot, không ngờ nó lại đơn giản vậy, cái quan trọng là port code C++ qua C, ví dụ port bộ tính toán AHRS, INS từ cảm biến.

Cách nó filter data, implement algorithm!

Có thể áp dụng thêm FreeRTOS, các chức năng của RTOS + Ardupilot system architecture.

Open source project for embedded engineers?? Ví dụ như GUI để đọc dữ liệu cảm biến

23 June 2019

*Reading Ardupilot fast_loop(). The calling structure is kind of weird, because it’s not similar to my old quadcopter code. You can see that here:

Hướng dẫn download source code datasheet từ www.st.com năm 2024
My first guess is that: actually, in some case you can call them in any orders and it makes almost no difference in performance, but when you look at this line again, check it again.


Why is Ardupilot codebase so large?

Because it’s necessary for a big project as Ardupilot to be large! And it’s also the case for any popular open source projects, as well as in company-level projects.

Minimal Ardupilot code only for building CubeBlack board option.

$./waf configure –board CubeBlack

$./waf copter

General folders

Remove folders: AntennaTracker, APMrover2, ArduPlane, ArduSub, docs

mk folder

test folder

Files:

deleted: BUILD.md deleted: COPYING.txt deleted: Dockerfile deleted: Doxyfile.in deleted: Makefile deleted: README.md deleted: Vagrantfile deleted: appveyor.yml deleted: reformat.sh deleted: uncrustify_cpp.cfg deleted: uncrustify_headers.cfg

Ardupilot/Tools

Tools/environment_install, Pozyx, Replay, LogAnalyzer, GIT_Test, CodeStyle

After build all source files:

File “/mnt/c/Users/Admin/Desktop/ardupilot_minimal/ardupilot/modules/waf/waflib/Task.py”, line 338, in process ret = self.run() File “Tools/ardupilotwaf/chibios.py”, line 76, in run

env.APJ_TOOL = srcpath(‘Tools/scripts/apj_tool.py’)

so you can’t delete some folders in Tools directory.

Ardupilot/modules

can be deleted: gbenchmark, gtest

You can’t delete other directories in modules folder, because waf will check them before building.

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Ardupilot/libraries This is the most interesting part to clean up Ardupilot project, as the Ardupilot’s waf build system will use build option for deciding what files to be compiled. Some files in this folder can be removed if we only want to build with CubeBlack target.

Cleaning up this folder can be easily messed up, because some necessary folders won’t listed in compiled files terminal, but they can’t be removed (such as AP_HAL, AP_HAL_Empty). Or it will put error message in the terminal when you execute build command.

$ap_library: AP_HAL not found

Folders can be removed:

AP_HAL_SITL

APM_Control

AP_HAL_Linux

AP_Navigation

AP_Soaring

AP_TECS

AP_TemperatureSensor

AP_SpdHgtControl

10 August 2019

Embedded computers running Ardupilot:

_https://github.com/mirkix/BBBMINI

_Navio and Navio2 project

Với sự phát triển không ngừng trong ngành công nghiệp máy tính, hệ thống nhúng, máy tính cá nhân (PC) và laptop hiện nay đã lược bỏ đi nhiều các chuẩn kết nối cũ, ví dụ như là: PS/2, DE-9, rãnh cắm ISA… Thay vào đó là các chuẩn kết nối hiện đại như: USB, HDMI, RJ-45,…

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Bo mạch chủ máy tính

Trong bài này chỉ giới thiệu ngắn gọn các chuẩn giao tiếp trên máy tính để người đọc có cái nhìn bao quát về các chuẩn kết nối mà chúng ta thường gặp hàng ngày.

HDMI

HDMI (High-Definition Multimedia Interface) nghĩa là giao diện đa phương tiện có độ phân giải cao. HDMI là giao diện kỹ thuật số để kết nối các thiết bị có độ nét cao và siêu nét như màn hình máy tính, HDTV, đầu đĩa Blu-Ray, các thiết bị chơi game hay máy ảnh độ nét cao, v.v.

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Cổng HDMI

Đầu cáp HDMI được cấu tạo bao gồm 19 chân, mỗi chân đảm nhiệm một nhiệm vụ khác nhau và trong quá trình truyền dữ liệu thì sẽ phải tuân thủ theo nguyên tắc nhất định. Cáp HDMI thường được hỗ trợ chất lượng âm thanh chuẩn của phòng thu, nên người dùng hoàn toàn yên tâm khi sử dụng nó để chuyển sang một thiết bị khác. Phiên bản HDMI mới nhất, tức là HDMI 2.0 có thể mang tín hiệu video kỹ thuật số có độ phân giải lên đến 4096 × 2160 và 32 kênh âm thanh. Ngoài ra, HDMI có thể được sử dụng để truyền tải tín hiệu video không nén và tín hiệu âm thanh cả nén hoặc không nén. Cổng HDMI loại A được minh họa ở hình bên dưới.

Cổng VGA

Cùng chức năng như cổng HDMI, chúng ta sử dụng cổng VGA hoặc cổng HDMI để kết nối laptop với các thiết bị có khả năng trình chiếu (như máy chiếu, màn hình,…)

Hướng dẫn download source code datasheet từ www.st.com năm 2024
Analog VGA port to connect the monitor to the graphics card closeup

VGA (Video Graphics Array) là một chuẩn hiển thị được giới thiệu năm 1987 từ hãng IBM cùng loại máy tính PS/2. Nó dùng để hỗ trợ việc kết nối từ laptop tới các thiết bị trình chiếu (máy chiếu, màn hình ngoài…) thông qua dây cáp.

Dây cáp VGA có 15 chân kết nối, hỗ trợ nhiều chuẩn độ phân giải 640x400px, 1280x1024px, hiện nay có thể lên đến 1920×1080 px (FullHD), 2048x1536px.

Hướng dẫn download source code datasheet từ www.st.com năm 2024

RJ-45

Như chúng ta đều biết, Ethernet là một công nghệ mạng được sử dụng để kết nối máy tính của bạn với Internet và giao tiếp với các máy tính hoặc thiết bị mạng khác.

Giao diện kết nối được sử dụng cho mạng máy tính và trong viễn thông được gọi là Registered Jack (RJ) và cổng RJ-45 nói riêng được sử dụng cho Ethernet thông qua cáp. Đầu nối RJ-45 là đầu nối kiểu mô-đun 8 chân 8 (8P – 8C).

Công nghệ Ethernet mới nhất được gọi là Gigabit Ethernet và hỗ trợ tốc độ truyền dữ liệu trên 10Gigabits mỗi giây. Ethernet hoặc cổng LAN có đầu nối loại 8P – 8C cùng với cáp RJ-45 male được hiển thị ở hình ảnh bên dưới.

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Đầu nối mô-đun 8P – 8C không có khóa thường được gọi là Ethernet RJ-45. Thông thường, các cổng RJ-45 được trang bị hai đèn LED thông báo phát hiện truyền dữ liệu và gói lưu lượng.

Như đã đề cập trước đó, một cổng Ethernet RJ-45 có 8 chân kết nối và hình dưới đây mô tả sơ đồ kết nối trong một cổng RJ-45.

e-SATA

e-SATA là một đầu nối Serial AT Attachment gắn rời, được sử dụng như một giao diện để kết nối các thiết bị lưu trữ khối (mass storage devices). Kết nối e-SATA hiện đại được gọi là e-SATAp và là viết tắt của cổng Power e-SATA.

Chúng là các cổng lai có khả năng hỗ trợ cả e-SATA và USB. Cả tổ chức SATA và tổ chức USB đều không chính thức phê duyệt cổng e-SATAp và người dùng sẽ phải sử dụng bất chấp những rủi ro.

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Hình ảnh trên là một cổng e-SATAp. Nó cho thấy rằng cả hai thiết bị e-SATA và USB đều có thể kết nối được.

Được sử dụng để kết nối các ổ đĩa có dung lượng lớn như HDD hay SSD. Cần chú ý khi mua ổ đĩa cứng ở trên thị trường bởi vì nếu không tìm hiểu kỹ trước thì có thể mua về mà không sử dụng được.

Cổng USB

USB (Universal Serial Bus) là một chuẩn kết nối có dây trong máy tính. USB sử dụng với mục đích là để kết nối các thiết bị như điện thoại, máy tính bảng, máy chụp ảnh, máy quay phim, máy nghe nhạc với máy tính.

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Cho đến thời điểm hiện nay thì USB có 2 loại chính đó là cổng USB 2.0 và cổng USB 3.0, đại khái đây là 2 phiên bản công nghệ trước và sau thôi. Về lí thuyết thì tốc độ ghi chép dữ liệu của USB 2.0 là 60 MB/s, còn USB 3.0 là 600 – 625 MB/s. Nhìn thông số trên thì có thề thấy tốc độ trên lệch nhau gấp 10 lần, nhưng trong thực tế khi sử dụng thì con số này khiêm tốn hơn, có nghĩa là chỉ nhanh hơn khoảng 3 lần thôi. Ví dụ thực tế khi chép một file video thì tốc độ truyền cùa USB 2.0 thường là 19 – 20 MB/s, còn tốc độ của USB 3.0 thường là 59 – 60 MB/s (còn phụ thuộc vào độ tương thích giữa các thiết bị kết nối).

Khe cắm RAM

RAM (Random Access Memory) là bộ nhớ truy xuất ngẫu nhiên. RAM là nơi mà hệ điều hành, chương trình ứng dụng lưu trữ dữ liệu tạm thời để CPU có thể nhanh chóng truy xuất để hệ điều hành/ứng dụng chạy nhanh và mượt.

Hướng dẫn download source code datasheet từ www.st.com năm 2024
Khe cắm RAM trên bo mạch chủ máy tính PC

Các thông số phổ biến khi sử dụng RAM máy tính là: dung lượng RAM, sự tương thích, và đời RAM sử dụng.

Một số đời RAM phổ biến trên thị thường là: DDR 1, DDR 2, DDR 3 và DDR 4. Trong đó RAM DDR 4 thì tuy là rất mạnh mẽ và là đời mới nhất.

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Thanh RAM DDR3 của Kingston

Đối với RAM trên máy tính bạn có thể tự nâng cấp, thay thế khi nó bị hỏng một cách dễ dàng nhờ các hướng dẫn trên mạng.

Cổng PCIe

PCIe (Peripheral Component Interconnect Express) là một chuẩn giao tiếp dùng cho kết nối giữa các thiết bị bên trong máy tính, được ra đời vào năm 2004, version chuẩn lúc đó của PCI Express (PCIe) là 1.1.

PCIe là một cổng giao tiếp nhanh hơn nhiều so với các chuẩn cổng giao tiếp đời cũ trước nó như là PCI, PCI-X và AGP. Nó được dùng kết nối với các card mở rộng và card đồ họa (GPU card).

PCIe ra đời để đáp ứng yêu cầu tốc độ truyền dữ liệu ngày một tăng trong khi đó cách đây không lâu, PCI còn là chuẩn tốt nhất để máy tính giao tiếp với các card mở rộng như sound, modem,… qua các khe cắm trên mainboard.

Hướng dẫn download source code datasheet từ www.st.com năm 2024

Nhờ ưu điểm vượt trội về tốc độ, tính năng của PCIe, hiện nay có nhiều hãng đã sản xuất các card thiết bị khác với kết nối PCIe như ethernet PCIe card, SSD card, USB card,… Nên PCIe hầu như hỗ trợ tất cả kết nối hiện nay trên máy tính, do đó đã có một số motherboard được sản xuất với chỉ các khe cắm PCIe.

Hướng dẫn download source code datasheet từ www.st.com năm 2024

PCIe ethernet card

Kết bài

Tất nhiên là không một bài viết nào có thể giới thiệu được hết cho bạn các chuẩn kết nối được, vì còn rất rất nhiều loại cổng và chuẩn kết nối đang tồn tại hiện nay ví dụ như cổng đa năng lightning của Apple, hay cổng là DisplayPort cho việc hiển thị màn hình.

Do vậy, tốt nhất là các bạn nên dần dần tìm hiểu từng cái, khi nào gặp sử dụng rồi biết là ok rồi, mục đích trước mặt là tận dụng đến sức mạnh mà hệ thống của bạn có thể đáp ứng. Ví dụ như cổng USB 3.0 có tốc độ truyền rất cao thì nên dùng nó cho việc copy dữ liệu, hoặc là cổng USB Type-C trên Macbook có thể vừa dùng để làm cổng sạc pin, vừa làm cổng trung gian cho tất cả giao tiếp (USB, HDMI, Audio 3.5mm, …) ở trên Macbook.

Không đến mức ôm trọm gói như thợ sửa máy tính, hoặc là kỹ sư thiết kế ra CPU. Nói thật ra là mấy người kỹ sư design chip phải đọc tài liệu và hiểu mấy các chuẩn này kỹ thì mới có thể hoàn thành được công việc của mình, hoặc là kỹ sư embedded Linux cũng phải hiểu để còn lập trình device driver.