Bài giảng Hệ thống nhúng - Khái niệm về hệ thống nhúng - Lưu Hoàng

pdf 43 trang Gia Huy 17/05/2022 3300
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Hệ thống nhúng - Khái niệm về hệ thống nhúng - Lưu Hoàng", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_he_thong_nhung_khai_niem_ve_he_thong_nhung_luu_hoa.pdf

Nội dung text: Bài giảng Hệ thống nhúng - Khái niệm về hệ thống nhúng - Lưu Hoàng

  1. glkjglkjg Nội dung môn học HỆ THỐNG NHÚNG 1. Khái niệm Hệ thống nhúng 2. Ôn tập Lập trình C 3. Giới thiệu ARM THS. LƯU HOÀNG 4. KIT ARM STM32F407 Discovery 5. Các phần mềm lập trình ARM 6. Các bài tập trên KIT ARM STM32F407 Discovery 7. Tiểu luận TRƯỜNG ĐẠI HỌC BÀ RỊA – VŨNG TÀU VIỆN CNNT - ĐIỆN - ĐIỆN TỬ 1 2 Tài liệu tham khảo Mục đích của môn học  Bài giảng Hệ thống nhúng – ĐH  Nắm được khái niệm chung về hệ thống nhúng BRVT.  Lập trình hệ thống nhúng – Hoàng Trang, Bùi Quốc Bảo –  Có kiến thức về ARM NXB ĐHQG TPHCM.  Lập trình nhúng căn bản – Vũ  Có khả năng lập trình bằng C cho ARM Đức Lung, Trần Ngọc Đức – NXB ĐHQG TPHCM.  Có khả năng tự xây dựng ứng dụng nhúng trên  Hệ thống điều khiển nhúng – ARM và các loại VĐK khác Lưu Hồng Việt.  Web: hocarm.org 3 4 1
  2. glkjglkjg Đánh giá kết quả học tập KHÁI NIỆM VỀ  Bài kiểm tra (20% điểm) HỆ THỐNG NHÚNG Kiểm tra 45’ vào giữa học kỳ.  Điểm chuyên cần (20% điểm) Đi học đầy đủ và nghiêm túc. 1. KHÁI NIỆM HỆ THỐNG NHÚNG Làm đủ bài kiểm tra và đạt trên trung bình. 2. ỨNG DỤNG CỦA HỆ THỐNG  Điểm cuối kỳ (60% điểm) NHÚNG Tiểu luận nhóm: Thiết kế hệ thống nhúng dùng ARM STM32F407 5 6 HỆ THỐNG NHÚNG LÀ GÌ? HỆ THỐNG NHÚNG LÀ GÌ?  Hệ thống nhúng (embedded system) là một thuật ngữ để chỉ một hệ thống có khả năng tự trị được nhúng vào trong một môi trường hay một hệ thống mẹ.  Là các hệ thống tích hợp cả phần cứng và phần mềm phục vụ các bài toán chuyên dụng trong nhiều lĩnh vực công nghiệp, tự động hoá điều khiển, quan trắc và truyền tin. Đặc điểm của các hệ thống nhúng là hoạt động ổn định và có tính năng tự động hoá cao. 7 8 2
  3. glkjglkjg HỆ THỐNG NHÚNG LÀ GÌ? HỆ THỐNG NHÚNG LÀ GÌ?  Một hệ thống nhúng sẽ có một hoặc nhiều microcomputer bên  Hệ thống nhúng thường được thiết kế để thực hiện một trong. Một vi điều khiển (microcontroller) là một microcomputer kết hợp với bộ xử lý(Processor), RAM, ROM, và các cổng I/O chức năng chuyên biệt nào đó. thành một khối duy nhất. Đây là loại thường được dùng cho các  Một hệ thống nhúng chỉ thực hiện một hoặc một vài hệ thống nhúng rất nhiều bởi vì nó rẻ, kích thước nhỏ và đáp ứng được các yêu cầu về tiêu thụ năng lượng thấp. chức năng nhất định, thường đi kèm với những yêu cầu cụ thể và bao gồm một số thiết bị máy móc và phần cứng chuyên dụng.  Hệ thống nhúng có thể tối ưu hóa nó nhằm giảm thiểu kích thước và chi phí sản xuất.  Các hệ thống nhúng thường được sản xuất hàng loạt với số lượng lớn. 9 10 HỆ THỐNG NHÚNG VỚI MÁY TÍNH HỆ THỐNG NHÚNG VỚI MÁY TÍNH COMPUTER WASHING MACHINE Sử dụng phầncứng và Sử dụng phầncứng và phầnmềm phầnmềm Khả năng xử lý linh hoạt Chỉ có khả năng thực nhiều tácvụ vớitốcđộ một công việc chuyên rất cao biệt trên mộthệ thống được thiếtkế riêng Khả năng xử lý một Khả năng xử lý một lượng dữ liệurấtlớn lượng dữ liệu giớihạn 11 12 3
  4. glkjglkjg ỨNG DỤNG CỦA HỆ THỐNG NHÚNG ỨNG DỤNG CỦA HỆ THỐNG NHÚNG . VD: Xe ôtô ngày nay có trên 50 hệ thống máy tính. . Các thiết bị điều khiển . Ôtô, tàu điện . Truyền thông . Thiết bị y tế . Hệ thống đo lường . Toà nhà thông minh . Thiết bị trong các dây chuyền sản xuất . Robot . Thiết bị gia dụng . 13 14 ỨNG DỤNG CỦA HỆ THỐNG NHÚNG ỨNG DỤNG CỦA HỆ THỐNG NHÚNG . VD: Hệ thống tự động hóa trong công nghiệp. 15 16 4
  5. glkjglkjg VI XỬ LÝ TRONG HỆ THỐNG NHÚNG LẬP TRÌNH C CHO Tùy thuộc vào ứng dụng và giá thành, người thiết kế VI ĐIỀU KHIỂN quyết định loại vi xử lý dùng trong hệ thống nhúng.  Họ 8086  PowerPC M ỘT SỐ KHÁI NIỆM NGÔN NGỮ LẬP  Họ 8051 TRÌNH C. CẤU TRÚC ĐIỀU KHIỂN VÀ HÀM.  PIC  AVR  ARM  17 18 Một số khái niệm C cho Vi điều khiển Các kiểu dữ liệu  Một chương trình C thường bao gồm các thành phần như: Tên kiểu dữ liệu (Data Số byte Khoảng dữ liệu (Range) o Các kiểu dữ liệu type) o chú thích (comments) char 1 –128 to 127 or 0 to 255 unsigned char 1 0 to 255 o biểu thức (expressions) int 2 –32,768 to 32,767 o câu lệnh (statements) unsigned int 2 0 to 65,535 long 4 –2,147,483,648 to 2,147,483,647 o khối (blocks) unsigned long 4 0 to 4,294,967,295 o toán tử (operator) float 4 6 digits of precision o cấu trúc điều khiển (Flow controls) o hàm (functions) 19 20 5
  6. glkjglkjg Chú thích (comments) Tiền xử lý (preprocessor)  Có 2 cách để tạo phần chú thích trong C là:  Tiền xử lý là một tiện ích của ngôn ngữ C, các preprocessor o chú thích từng dòng bằng 2 dấu “//” được trình biên dịch xử lý trước tất cả các phần khác. ví dụ: //day la chu thich  Preprocessor được bắt đầu bằng dấu “#”. o chú thích block bằng cách kẹp block cần chú thích vào giữa /* .*/ ví dụ:  Trong ngôn ngữ C có hai preprocessors được sử dụng phổ /* biến nhất là #include và #define. Ban co the type bat ky chu thich nao trong block nay  #include chỉ định 1 file được đính kèm trong quá trình biên Ngay ca khi ban xuong dong dịch. Phan chu thich thuong co mau chu la green */  #define để định nghĩa 1 chuỗi thay thế hoặc 1 macro. 21 22 Tiền xử lý (preprocessor) Biểu thức (Expressions)  #include delay.h  Biểu thức là 1 phần của các câu lệnh. /* đính kèm nội dung file delay.h trong lúc biên dịch */  Biểu thức có thể bao gồm biến, toán tử, gọi hàm , biểu  #define Lamp1 PORTA.5 thức trả về 1 giá trị đơn. Biểu thức không phải là 1 câu lệnh hoàn chỉnh. /* định nghĩa Lamp1 thay thể cho PORTA.5 */  #define max (a,b) ((a)>(b)? (a): (b))  Ví dụ: A>B. /* định nghĩa một macro tìm số lớn nhất trong 2 số a và b, trong chương trình nếu bạn gọi x=max(2,3) thì kết quả thu được x=3 */ 23 24 6
  7. glkjglkjg Câu lệnh (Statement) Khối (Blocks)  Câu lệnh là 1 dòng lệnh hoàn chỉnh, có thể bao gồm các  Khối là sự kết hợp của nhiều câu lệnh để thực hiện keywords, biểu thức và các câu lệnh khác. chung 1 nhiệm vụ nào đó.  Câu lệnh được kết thúc bằng dấu “;”.  Khối được bao bởi 2 dấu mở khối “{“ và đóng khối “}”.  Ví dụ: if(A>B) A=A-B; là một các câu lệnh  Ví dụ 1 khối: 25 26 Toán tử (Operators) Bảng 1: các toán tử đại số  Toán tử là những ký hiệu báo cho trình biên dịch các o Các toán tử đại số dùng thực hiện các phép toán đại số quen thuộc. nhiệm vụ cần thực hiện. o Chú ý phân biệt y=x++ và y=++x  Các bảng dưới đây tóm tắt các toán tử C dùng cho lập trình AVR. 27 28 7
  8. glkjglkjg Bảng 2: Toán tử truy cập và kích thước Mảng và chuỗi (Array anh String) o Toán tử [] thường được sử dụng khi dùng mảng, phần tử thứ i của o Mảng là tập hợp các biến giống nhau có cùng mảng sẽ được truy xuất thông qua [i]. tên gọi. o Chú ý mảng trong C bắt đầu từ 0. o Các phần tử của mảng được xác định bằng chỉ số (bắt đầu từ 0). o Kích thước của mảng là cố định. o VD: int a[4] = {1,2,3,4}; int b = a[0]; 29 30 Mảng và chuỗi (Array anh String) Con trỏ (Pointer) o Chuỗi tương tự mảng, ngoại trừ Chuỗi có thể o Con trỏ là 1 biến chứa một địa chỉ. có số lượng phần tử thay đổi. o Giá trị của con trỏ có thể thay đổi được. o Các phần tử của chuỗi là ký tự ASCII kết thúc o VD: char *p; bằng giá trị 0. char *k; o Chuỗi được khai báo như 1 con trỏ kiểu char. p = 0x2000; *p = 1; o VD: char * mystring = “embedded”; k = p+2; *k = *p+1; 31 32 8
  9. glkjglkjg Phép toán với Con trỏ Bảng 3: Toán tử Logic và quan hệ o Phép cộng: Con trỏ luôn chỉ vào địa chỉ đầu của o Toán tử Logic và quan hệ: thực hiện các phép so sánh và logic, thường được dùng làm điều kiện trong các cấu trúc điều khiển. một đối tượng (object). Cộng 1 vào con trỏ làm nó chỉ đến đối tượng tiếp theo. o Phép so sánh: Khi so sánh 2 con trỏ, giá trị chúng đang mang được coi như số không dấu. 33 34 Bảng 4: Toán tử thao tác Bit Bảng 5: Các toán tử khác o Toán tử thao tác Bit (Bitwise operator): là các toán tử thực hiện Operator Name Example Defined trên từng bit nhị phân của các con số. () Funtion Delay(10) Call Delay with an argument of Operator Name Example Defined 10 ~ Bitwise ~x Changes 1 bits to 0 and 0 bits to 1 (type) Type cast (int)x X converted to a int complement ?: Conditional x?y:z If x is not đ evalute y, otherwise NOT evalute z & Bitwise AND x&y Bitwise AND of x and y , Sequential x++,y++ Increment x first, then increment | Bitwise OR x|y Bitwise OR of x and y evaluation y >> Right shift x>>3 Bits in x shifted right 3 bit positions << Left shift x<<2 Bits in x shifted left 2 bit positions 35 36 9
  10. glkjglkjg Cấu trúc điều khiển Cấu trúc IF  Cấu trúc IF  Cú pháp: If (điều kiện) statement;  Giải thích: nếu điều kiện là đúng thì thực hiện statement theo  Cấu trúc IF ELSE sau.  Cấu trúc SWITCH  statement có thể được trình bày cùng dòng hoặc dòng sau  Cấu trúc WHILE điều khiển If.  Cấu trúc DO WHILE  Điều kiện có thể là một biểu thức bất kỳ, có thể là sự kết hợp của nhiều điều kiện bằng các toán tử quan hệ AND (&&), OR  Cấu trúc FOR (||) Điều kiện được cho là đúng khi nó khác 0.  Ví dụ: If (x==1 && y==2) result=’A’; 37 38 Cấu trúc IF ELSE Cấu trúc SWITCH  Cú pháp: switch (biểu thức) {  Cú pháp: If (điều kiện) statement1; else statement2; case hằng_số_1: các statement1;  Giải thích: nếu điều kiện đúng thì thực hiện statement1, break; ngược lại thực thi statement2. case hằng_số_2: các statement2;  Việc đặt các statement và else trên cùng 1 dòng hay trên break; những dòng khác nhau đều không ảnh hưởng đến kết default: các statement khác; quả. break; }  Nếu có nhiều statements thì cần đặt chúng trong 1 khối.  Giải thích: trong trường hợp có nhiều khả năng có thể xảy ra cho 1 biểu thức (hay 1 biến), ứng với mỗi khả năng chương trình cần thực hiện một việc nào đó,  Ví dụ: If (x>y) result=’A’ else result=‘B’; khi này nên sử dụng cấu trúc Switch. 39 40 10
  11. glkjglkjg Cấu trúc SWITCH Cấu trúc WHILE  Ví dụ: switch (Command) {  Cú pháp: while (điều kiện ) statement1; case 1: PWM=255;  Giải thích: while là một cấu trúc lặp (Loop), ý nghĩa của ON_Motor(); break; cấu trúc while là khi điều kiện còn đúng thì sẽ thực hiện case 2: statement1 (hoặc các statements nếu chúng được đặt PWM=0; OFF_Motor();; trong 1 khối {} như trong trường hợp của if được giới break; thiệu ở trên). default: Get_Cmd();  Ví dụ: x=10;y=3; break; } while(x>y) x=x-y; 41 42 Cấu trúc DO WHILE Cấu trúc FOR  Cú pháp: Do { statement1;  Cú pháp: for (biểu_thức_1 ; biểu_thức_2 ; biểu_thức_3) { statement2; các statement; } }  Giải thích: là một cấu trúc lặp khác, trong cấu trúc for, While (điều kiện ); biểu_thức_1 thường được hiểu là khởi tạo, biểu_thức_2 là  Giải thích: tương tự cấu trúc while nhưng cấu trúc do while sẽ điều kiện và biểu_thức_3 là biểu thức được thực hiện sau mỗi thực thi các câu lệnh trước 1 lần mới kiểm tra điều kiện. vòng lặp.  Ví dụ: x=3;y=3;  Ví dụ: for (i=0 ; i y); }; 43 44 11
  12. glkjglkjg FUNTION FUNTION (HÀM, CHƯƠNG TRÌNH CON) (HÀM, CHƯƠNG TRÌNH CON)  Một chương trình lớn thường được chia thành nhiều khối (module)  Module là 1 tác vụ nhận dữ liệu vào (input), xử lý và xuất ra kết quả (output).  Ví dụ: hàm chuyển đổi độ F sang độ C  Các module được tạo ra như là các hàm (function). int FtoC(int TempF){ int TempC; TempC=(5*(TempF-32))/9; // conversion return TempC;} 45 46 ĐỊNH NGHĨA HÀM MÔ TẢ HÀM (FUNTION DEFINATION) (FUNTION DECLARATION)  Mô tả hàm cho ta biết tên hàm, kiểu của các tham số và kiểu  Một định nghĩa của hàm là cách mà hàm đó thực thi. kết quả trả về. type Name(parameter list){  // declaration input output Statement void Ritual(void); // none none }; char InChar(void); // none 8-bit void OutChar(char letter); // 8-bit none  Ví dụ: hàm chuyển đổi độ F sang độ C short InSDec(void); // none 16-bit int FtoC(int TempF){ void OutSDec(short i); // 16-bit none char Max(char in1,char in2); // two 8-bit 8-bit int TempC; int EMax(int in1,int in2); // two 16-bit 16-bit TempC=(5*(TempF-32))/9; // conversion void OutString(char* mystring); // pointer to 8-bit none return TempC;} char *alloc(int size); // 16-bit pointer to 8-bit int Exec(void(*fnctPt)(void)); // function pointer 16-bit 47 48 12
  13. glkjglkjg Cấu trúc Chương trình C VI ĐIỀU KHIỂN ARM  một chương trình C cho AVR phải bao gồm 1 chương trình chính main, tất cả các nội dung chính sẽ được đặt bên trong chương trình chính. Cấu trúc chương trình chính có thể như sau: void main(void){ 1. GIỚI THIỆU // Declare your local variables here 2. MỘT SỐ LOẠI while (1){ ARM THÔNG // Place your code here DỤNG 3. KIT STM32F407 } DISCOVERY // Place your funtions here } 49 50 GIỚI THIỆU ARM GIỚI THIỆU ARM . ARM (Advanced RISC Machine) là một loại cấu trúc vi . Ngày nay, hơn 75% CPU nhúng 32-bit là thuộc họ ARM, điều xử lý 32 bit và 64 bit kiểu RISC được sử dụng rộng rãi này khiến ARM trở thành cấu trúc 32-bit được sản xuất trong các thiết kế nhúng. nhiều nhất trên thế giới. . Các nhà sản xuất IC đưa ra thị truờng hon 240 dòng vi điều . Do có đặc điểm tiết kiệm năng lượng, các khiển sử dụng lõi ARM . bộ CPU ARM chiếm ưu thế trong các sản phẩm điện tử . CPU ARM được tìm thấy khắp nơi trong các sản phẩm di động, mà với các sản phẩm này việc tiêu tán công thương mại điện tử, từ thiết bị cầm tay (PDA, điện thoại di suất thấp là một mục tiêu thiết kế quan trọng hàng đầu. động, máy đa phương tiện, máy trò chơi cầm tay, và máy tính cầm tay) cho đến các thiết bị ngoại vi máy tính (ổ đĩa cứng, bộ định tuyến để bàn). 51 52 13
  14. glkjglkjg GIỚI THIỆU ARM Các dòng ARM Các chip ARM7 và ARM9 được các nhà sản xuất bán dẫn thiết kế với giải pháp riêng của mình, đặc biệt là phần xử lý các các ngắt đặc biệt (exception) và các ngắt thông thường (interrupt). Dòng ARM Cortex là một bộ xử lý thế hệ mới đưa ra một kiến trúc chuẩn cho nhu cầu đa dạng về công nghệ. Không giống như các chip ARM khác, dòng Cortex là một lõi xử lý hoàn thiện, đưa ra một chuẩn CPU và kiến trúc hệ thống chung. 53 54 Các dòng ARM Các dòng ARM Dòng Cortex gồm có 3 phân nhánh chính: dòng A dành cho các ứng dụng cao cấp. dòng R dành cho các ứng dụng thời gian thực. dòng M dành cho các ứng dụng vi điều khiển và chi phí thấp. STM32 đuợc thiết kế dựa trên dòng Cortex-M3, dòng Cortex- M3 đuợc thiết kế đặc biệt để nâng cao hiệu suất hệ thống, kết hợp với tiêu thụ năng lượng thấp Cortex-M3 được thiết kế trên nền kiến trúc mới, do đó chi phí sản xuất đủ thấp để cạnh tranh với các dòng vi điều khiển 8 và 16-bit truyền thống. 55 56 14
  15. glkjglkjg Cortex-M Series ARM Cortex-M Series ARM 57 58 Cortex-R Series ARM Cortex-A Series ARM 59 60 15
  16. glkjglkjg Cortex-A Series ARM Ưu điểm của ARM Được xây dựng theo cấu trúc mở, quy trình xử lý các thuật toán hiệu quả hơn để bảo vệ CPU không bị quá tải, tiết kiệm bộ nhớ và năng lượng. Giá thành ngày càng rẻ. Khả năng hỗ trợ của hãng sx, nhiều công cụ phát triển. 61 62 Ưu điểm của ARM Ưu điểm của ARM Bên cạnh lập trình bằng ASM, cấu trúc ARM được thiết kế tương thích C. Nguồn tài nguyên về source code, tài liệu, application note rất lớn trên internet. So sánh khả năng xử lý lệnh nhân 2 số 16 bit của ARM với các dòng vi điều khiển 8 bit và 16 bit: 63 64 16
  17. glkjglkjg Giới thiệu STM32 Giới thiệu STM32 Tập đoàn ST Microelectronic cho ra mắt dòng STM32, Dòng ARM Cortex™-M là thế hệ mới, thiết lập các tiêu vi điều khiển đầu tiên dựa trên nền lõi ARM Cortex-M3 chuẩn mới về hiệu suất, chi phí, ứng dụng cho các thế hệ mới do hãng ARM thiết kế, lõi ARM Cortex-M3 thiết bị cần tiêu thụ năng lượng thấp, và đáp ứng yêu là sự cải tiến của lõi ARM7 truyền thống. cầu thời gian thực khắc khe. 65 66 Ứng dụng STM32 Tính năng nổi bật Tiêu thụ năng lượng cực thấp với hiệu suất cực cao 67 68 17
  18. glkjglkjg Tính năng nổi bật KIT STM32F4 DISCOVERY  Coding cực dễ: Với sự đồ sộ về ngoại vi (GPIO, I2C, SPI,  Ưu điểm: nhiều ADC, USB, Ethernet, CAN .), ST cung cấp cho chúng ta cảm biến, nhiều các thư viện trực tiếp cho mỗi dòng ARM (gọi là CMSIS – Cortex Microcontroller Software Interface Standard), I/O và tốc độ cao. nhiệm vụ của chúng ta không thể dễ dàng hơn: khai báo Được sử dụng và sử dụng mà thôi. rất nhiều ở Việt Nam, sự hỗ trợ  Giá tiền cực rẻ: một chip STM32F100x giá khoảng 29K từ cộng đồng VN (tương đương 1 chip ATMega8) mà STM32F100x chạy cũng khá nhiều. tốc độ 24Mhz. 69 70 KIT STM32F4 DISCOVERY KIT STM32F4 DISCOVERY  Sử dụng MCU STM32F407VGT6 32-bit lõi ARM Cortex-M4F.  Hỗ trợ USB OTG  1 MB Flash, 192 KB RAM và có  Có các header mở rộng để 100 chân kết nối với các cảm biến  Tích hợp sẵn mạch nạp ST- LINK/V2 trên board khác  Nguồn sử dụng từ USB hoặc  Cảm biến chuyển động và nguồn ngoài 5V gia tốc 3 trục LIS302DL, ST  8 LED: 2 led báo nguồn và kết MEMS nối USB, 4 LED có thể lập trình,  Cảm biến cho các ứng dụng 2 LED cho USB OTG audio MP45DT02, ST MEMS  2 Nút nhấn, 1 nút RESET và 1 nút người dùng. và xuất âm thanh với CS43L22 71 72 18
  19. glkjglkjg KIT STM32F4 DISCOVERY KIT STM32F4 DISCOVERY 73 74 PHẦN MỀM KHỞI TẠO CODE STM32CubeMX CÀI ĐẶT PHẦN MỀM  STM32CubeMX là công cụ giúp khởi tạo phần cứng, ngoại vi, xung nhịp cho vi điều khiển STM32. 1. PHẦN MỀM KHỞI TẠO CODE  Ưu điểm của STM32CubeMX: STM32CUBE MX 2. PHẦN MỀM LẬP TRÌNH ARM KEIL Giúp cấu hình ngoại vi dễ dàng. Chọn các pin trên chip và UVISION5 chọn các tính năng mong muốn gắn với nó. 3. LÀM BÀI TẬP Cấu hình Middlewares (FATS, FREERTOS), các ngoại vi như CRC, IWDG, TIMERS Cấu hình Clock Tính toán mức độ tiêu hao năng lượng. 75 76 19
  20. glkjglkjg PHẦN MỀM KHỞI TẠO CODE PHẦN MỀM KHỞI TẠO CODE STM32CubeMX STM32CubeMX 77 78 PHẦN MỀM KHỞI TẠO CODE PHẦN MỀM KHỞI TẠO CODE STM32CubeMX STM32CubeMX  STM32CubeMX tự động download các driver mới nhất của ST dành cho các dòng chip của mình.  ST đã không còn phát triển Standard Peripheral Libraries nữa, thay vào đó họ phát triển cấu trúc firmware mới bao gồm lớp cách ly phần cứng (HAL) bao gồm:  Các driver cho ngoại vi, lớp Middleware bao gồm hỗ trợ TCP/IP, USB, Graphics, FAT file system, Touch library, và hệ điều hành mã nguồn mở RTOS.  Cấu trúc firmware mới này có mức độ trừu tượng cao hơn, tập trung vào các tính năng phần cứng chung thay vì tập trung thuần túy vào phần cứng. Mức độ trừu tượng cao hơn giúp phát triển các API thân thiện và có thể dễ dàng chuyển từ phần cứng này sang phần cứng khác. 79 80 20
  21. glkjglkjg Cấu trúc Firmware của Cấu trúc Firmware của STM32 STM32 – Level 0: – Level 1:  Board Support Package (BSP): cung cấp các API liên quan đến  Các thành phần Middlewares: Bao gồm các thư viện USB các thành phần phần cứng trên các board(ví dụ driver LCD, MicroSD). Khi sử dụng các board của ST ví dụ như STM32F3 Device, STMTouch, thư viện đồ họa STemWin, hệ điều Discovery, các API này giúp chúng ta nhanh chóng cấu hình/sử hành FreeRTOS, FatFS. dụng các phần cứng có sẵn trên đó ví dụ LED, Buttons, – Level 2: Gyroscope  Dựa trên lớp dịch vụ Middleware, lớp trừu tượng mức độ  Hardware Abstraction Layer (HAL): Cung cấp các driver ở mức thấp và các phương thức giao diện phần cứng để giao tiếp với thấp và sử dụng các ngoại vi. các mức trên (application, libraries và stacks). HAL API chia làm 2 nhóm: nhóm thứ nhất cung cấp các API chung đối với tất cả các serie STM32, và nhóm API mở rộng riêng cho từng dòng chip. 81 82 Cấu trúc Firmware của STM32 Tạo Project với STM32CubeMX  Mở phần mềm STM32CubeMX lên, nhấn vào New Project để bắt đầu tạo project mới.  Cửa sổ hiện ra với các thiết lập: Series: Chọn họ MCU bạn sử dụng. Lines: Chọn dòng MCU bạn sử dụng. Package: Chọn kiểu đóng gói của MCU. Chọn loại MCU chính xác trong phần MCUs List Nhấn OK. 83 84 21
  22. glkjglkjg Cấu hình xung nhịp Cấu hình xung nhịp  Sau khi đã lựa chọn ngoại vi cần thiết, tiến hành cấu hình xung đồng hồ cho ngoại vi tại thẻ Clock Configuration. 85 86 Chọn ngoại vi Chọn ngoại vi  Sau khi đã lựa chọn xong MCU, tiến hành chọn ngoại vi cần dùng tại thẻ PinOut:  Trong danh sách Peripheral được liệt kê bên trái có cách ngoại vi mà MCU hỗ trợ, sử dụng ngoại vi nào thì Enable ngoại vi đó lên.  Tại hình MCU trong khung bên phải, bạn có thể trực tiếp cấu hình trực quan từng chân của MCU theo các tính năng GPIO mà MCU hỗ trợ bằng cách click vào chân MCU và chọn chức năng cần thiết. 87 88 22
  23. glkjglkjg Cấu hình ngoại vi Xuất mã nguồn đã cấu hình  Tiến hành cấu hình đặc tính của ngoại vi đã chọn tại  Sau khi đã điều chỉnh, cấu hình những ngoại vi cần thiết, thẻ Configuration. chúng ta tiến hành xuất mã nguồn để import vào các trình biên dịch như IAR, KeilC  Tại đây phần mềm có biểu diễn theo cấu trúc firmware, tùy vào loại ngoại vi đã chọn mà phần mềm xếp vào nhóm  Nhấn nút Generate source code hoặc chọn Project >> Generate code để mở cửa sổ cấu hình đường dẫn Project. chức năng riêng. Project name: Gõ tên Project. Project Location: chọn đường dẫn lưa thư mục Project. Toolchain/IDE: Chọn MDK-ARM V5 hoặc MDK-ARM V4 nếu dùng KeilC, chọn EWARM dùng IAR.  Nhấn OK để phần mềm bắt đầu quá trình xuất mã nguồn. Phần mềm STM32CubeMX sẽ tự động tải về hoặc tự động cập nhật bộ API mới từ nhà sản xuất ST. 89 90 Xuất mã nguồn đã cấu hình ĐIỀU KHIỂN LED ĐƠN 1. KHỞI TẠO CODE BẰNG STM32CUBEMX 2. VIẾT CODE BẰNG KEIL V5 3. BIÊN DỊCH VÀ NẠP XUỐNG KIT 4. LÀM BÀI TẬP 91 92 23
  24. glkjglkjg Bài tập mẫu Khởi tạo code với CubeMX  Điều khiển 4 led trên KIT STM32F4discovery chớp tắt với  Mở CubeMX tần số 1 Hz.  Chọn New Project. 93 94 Khởi tạo code với CubeMX Khởi tạo code với CubeMX  Mục Core chọn  Ở cửa sổ ARM cortex-M4 bên phải,  Mục Series chọn chọn loại STM32F4 1024KB  Mục Line chọn flash. STM32F407/417  Bấm Start  Mục Package chọn Project để LQFP100 bắt đầu 95 96 24
  25. glkjglkjg Cài đặt Clock Clock Configuration  Mục RCC (Reset & Clock Control) chọn như hình.  Nếu dung bộ clock nội thì chọn mục Disable  Qua thẻ Clock Cofiguration để cấu hình cho Clock 97 98 Clock Configuration Cài đặt I/O  Quay lại thẻ Pinout chọn 4 pin PD12 đến PD15 ở chế độ GPIO_Output. (General Purpose Input Output) 99 100 25
  26. glkjglkjg Cấu hình I/O Cấu hình I/O  Qua thẻ  Chọn cả 4 dòng và cấu hình như sau: Configuraton chọn nút GPIO. (General Purpose Input Output) 101 102 Cài đặt Project Cài đặt Project  Trước khi xuất code sang Keil V5, vào mục Project > Settings  Ở cửa sổ mới, đặt tên cho Project, thư mục lưu và chọn để cài đặt các yêu cầu cho trình sinh code CubeMX: công cụ lập trình như hình: 103 104 26
  27. glkjglkjg Cài đặt Project Khởi tạo code  Qua thẻ Code Generator, Chọn như hình:  Vào mục Project  Sau đó nhấn OK để hoàn thành. > Generate Code hoặc nhấn lên nút trên thanh công cụ như hình.  Quá trình khởi tạo code được thực hiện. Chọn Open Project để chuyển qua phần mềm lập trình Keil V5. 105 106 Lập trình với Keil V5 Lập trình với Keil V5 * Các hàm dùng trong bài  Hàm đổi trạng thái output: HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12);  Hàm set/ reset output: HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);  Hàm Delay ms: HAL_Delay(500); 107 108 27
  28. glkjglkjg Lập trình với Keil V5 Bài tập  Code chớp tắt 4 led trên PORTD. * SV dựa vào bài tập mẫu để viết các chương trình sau:  Điều khiển 16 chân của PORTD chớp tắt.  Điều khiển 16 chân của PORTD sáng dần tắt dần.  Viết hàm choptat, sangdan, tatdan. * Kiểm tra trạng thái các chân qua chức năng Debug. 109 110 Bài tập mẫu NGẮT NGOÀI  Đếm số lần nhấn nút B1 trên board dùng ngắt ngoài. 1. KHỞI TẠO CODE: ĐẾM SỰ KIỆN NHẤN NÚT BẰNG NGẮT NGOÀI 2. VIẾT CODE BẰNG KEIL V5 3. BIÊN DỊCH VÀ DEBUG 4. LÀM BÀI TẬP 111 112 28
  29. glkjglkjg Khởi tạo Code Khởi tạo Code  Mở CubeMX.  Qua thẻ Configuration, chọn nút NVIC (Nested Vectored  Tạo project mới. Interrupt Controller).  Cấu hình clock.  Check vào mục EXTI line0  Chọn chân PA0 với chức interrupt để cho phép ngắt năng GPIO_EXTI0. ngoài.  Chọn chân PD12-15 với chức năng GPIO_Output. 113 114 Khởi tạo Code Khởi tạo Code  Chọn nút GPIO, chọn PA0.  Lưu Project với tên Interrupt.  Chọn chức năng như hình.  Chuyển qua phần mềm soạn thảo Keil V5 115 116 29
  30. glkjglkjg Viết Code bằng Keil V5 Viết Code bằng Keil V5  Biên dịch chương trình.  Viết hàm ngắt ngoài ở khu vực USER CODE BEGIN 4.  Hàm HAL_GPIO_EXTI_Callback sẽ được thực thi khi có tín  Khai báo biến count ở khu hiệu ngắt ngoài. vực Private variables dùng để đếm số lần ngắt  Biến count sẽ được tăng lên mỗi khi có ngắt xảy ra. do ấn nút B1 117 118 Chạy chương trình ở chế độ Debug Bài tập  Sau khi Biên dịch chương * SV dựa vào bài tập mẫu để viết các chương trình sau: trình và không phát sinh  Dùng nút nhấn ở chế độ ngắt để chuyển chế độ sáng lỗi, vào chế độ debug để của 4 đèn led. giám sát biến count.  Viết các hàm choptat, xence, sangdan, tatdan cho 4  Click phải vào biến count led. chọn như hình. * Kiểm tra trạng thái các chân qua chức năng Debug. 119 120 30
  31. glkjglkjg PWM PWM là gì ? Pulse Width Modulation  PWM là kỹ thuật thay đổi độ rộng của xung để thay 1. PWM LÀ GÌ đổi điện áp trung 2. BÀI TẬP MẪU bình ở ngõ ra. 3. KHỞI TẠO CODE 4. VIẾT CODE BẰNG KEIL V5  PWM thường dùng 5. BIÊN DỊCH VÀ DEBUG để điều khiển độ 6. BÀI TẬP NÂNG CAO sáng của đèn, điều khiển tốc độ động cơ DC. 121 122 Bài tập mẫu Khởi tạo Code  Điều khiển độ sáng của 4 led trên PORT D dùng PWM có  Mở CubeMX. tần số 10KHz với độ phân giải là 400.  Tạo project mới.  Cấu hình clock.  Chọn chân PD12-15 với chức năng TIM4_CH1 – CH4. 123 124 31
  32. glkjglkjg Khởi tạo Code Khởi tạo Code  Chọn các chức năng  Qua thẻ Configuration để cầu hình cho của timer 4 như hình. timer4 như sau:  Step = 400  Ftimer = 84MHz  Fpwm = 10KHz  Prescale = Ftimer/(Step*Fpwm) = 21 125 126 Khởi tạo Code Viết Code bằng Keil V5  Lưu Project với tên PWM.  Biên dịch chương trình.  Chuyển qua phần mềm soạn thảo Keil V5  Khai báo biến duty và step ở khu vực Private variables dùng để thay đổi độ rộng của xung 127 128 32
  33. glkjglkjg Viết Code bằng Keil V5 Viết Code bằng Keil V5  Khởi tạo timer 4 chế độ PWM ở khu vực USER CODE  Viết code ở khu vực USER CODE BEGIN 3. BEGIN 2.  Macro __HAL_TIM_SET_COMPARE dùng để set giá trị so  Chú ý khởi tạo cho cả 4 kênh. sánh cho timer. 129 130 Viết Code bằng Keil V5 Bài tập  Chạy ở chế độ Debug để quan sát 2 biến duty và step. 1. Viết chương trình tạo hiệu ứng đèn sáng xoay trên 4 led.  Quan sát độ sáng của led. 2. Kết hợp với nút nhấn để đảo chiều xoay. 131 132 33
  34. glkjglkjg ADC ADC là gì ? Analog to Digital Converter  ADC là kỹ thuật chuyển đổi một tín hiệu tương tự dạng điện áp thành dữ liệu số. 1. ADC LÀ GÌ  Giá trị ADC nhận được tỷ lệ 2. BÀI TẬP MẪU 3. KHỞI TẠO CODE với giá trị tín hiệu vào Vin so 4. VIẾT CODE BẰNG KEIL V5 với điện áp tham chiếu Vref và 5. BIÊN DỊCH VÀ DEBUG độ phân giải của ADC. 6. BÀI TẬP NÂNG CAO ADCvalue = (Vin/Vref)*MaxValue 133 134 Bài tập mẫu Khởi tạo Code  Đo nhiệt độ và điện áp tham chiếu bên trong chip STM32  Mở CubeMX. dùng ADC và DMA.  Tạo project mới.  Cấu hình clock.  Cấu hình output trên PD12 đến PD15. 135 136 34
  35. glkjglkjg Khởi tạo Code Khởi tạo Code  Chọn ADC1.  Qua thẻ Configuration.  Check các mục: IN0  Chọn ADC1. Temperature Sensor  Cấu hình như Vrefint Channel hình bên.  IN0 được nối đến nút nhấn B1 137 138 Khởi tạo Code Khởi tạo Code  Cấu hình Rank.  Qua thẻ DMA.  Mỗi Rank ứng với  Add một DMA request là ADC1. 1 kênh đã chọn.  Mode: Circular.  Sampling Time: thời gian lấy mẫu càng lớn thì kết quả càng chính xác. 139 140 35
  36. glkjglkjg Khởi tạo Code Viết Code bằng Keil V5  Lưu Project với tên ADC.  Biên dịch chương trình.  Chuyển qua phần mềm  Khai báo mảng soạn thảo Keil V5 adcData, biến vin0, temp và vref ở khu vực Private variables dùng để lưu giá trị của ADC trước và sau khi quy đổi. 141 142 Viết Code bằng Keil V5 Viết Code bằng Keil V5  Khởi tạo ADC1 chế độ DMA ở khu vực USER CODE  Viết code ở khu vực USER CODE BEGIN 3. BEGIN 2.  Tính giá trị của vin0, vref và temp. 143 144 36
  37. glkjglkjg Viết Code bằng Keil V5 Bài tập kiểm tra  Chạy ở chế độ Debug để quan sát các biến adcData,  Đọc nhiệt độ và ADC kênh 0. vin0, temp và vref.  Nếu nhiệt độ lớn hơn 37oC thì Led1 sáng.  Nhấn nút B1 để xem sự thay đổi của vin0.  Nếu ADC kênh 0 lớn hơn 1.5V thì Led2 sáng. 145 146 DAC DAC là gì ? Digital to Analog Converter  ADC là kỹ thuật chuyển đổi một tín hiệu số thành dữ liệu tương tự dạng điện áp. 1. DAC LÀ GÌ  Giá trị DAC tỷ lệ với giá trị dữ 2. BÀI TẬP MẪU 3. KHỞI TẠO CODE liệu số so với độ phân giải của 4. VIẾT CODE BẰNG KEIL V5 DAC và điện áp tham chiếu 5. BIÊN DỊCH VÀ DEBUG Vref. 6. BÀI TẬP NÂNG CAO 7. STM32F411 KHÔNG CÓ DAC Vdac = (DACvalue/ MaxValue) * Vref 147 148 37
  38. glkjglkjg Bài tập mẫu Khởi tạo Code  Tạo điện áp ngõ ra thay đổi dùng DAC kênh 1. Đo giá trị  Mở CubeMX. điện áp ngõ ra bộ DAC bằng ADC1 kênh 0.  Tạo project mới.  Cấu hình clock.  Chọn bộ ADC1 kênh IN0.  Chọn bộ DAC kênh OUT1. 149 150 Khởi tạo Code Khởi tạo Code  Chọn thẻ  Cấu hình DAC như Configuration. hình.  Cấu hình ADC1 như  Qua thẻ NVIC cho hình. phép ngắt ADC. 151 152 38
  39. glkjglkjg Khởi tạo Code Viết Code bằng Keil V5  Lưu Project với tên  Biên dịch chương DAC_ADC. trình.  Chuyển qua phần mềm  Khai báo mảng adcValue và soạn thảo Keil V5 dacValue ở khu vực Private variables dùng để lưu giá trị của ADC và DAC. 153 154 Viết Code bằng Keil V5 Viết Code bằng Keil V5  Ở khu vực USER CODE BEGIN 2:  Viết code ở khu vực USER CODE BEGIN 3.  Khởi tạo ADC1 chế độ IT (interrupt),  Tính giá trị của DAC trước khi xuất ra kênh 1.  Khởi tạo DAC kênh 1.  Tăng dần dacValue đến 3V thì lặp lại. 155 156 39
  40. glkjglkjg Viết Code bằng Keil V5 Viết Code bằng Keil V5  Viết code ở khu vực USER CODE BEGIN 4.  Nối PA4 với PA0.  Viết hàm ngắt ADC và tính adcValue theo điện áp.  Chạy ở chế độ Debug để quan sát các biến adcValue và dacValue. 157 158 Bài tập Cảm biến gia tốc Accelerometer  Làm lại bài tập mẫu nhưng ADC dùng DMA.  Dùng DAC kênh 1 kết nối với dây dẫn làm đầu dò để đo điện áp các điểm trên board. 1. ACCELEROMETER LÀ GÌ 2. BÀI TẬP MẪU 3. KHỞI TẠO CODE 4. VIẾT CODE BẰNG KEIL V5 5. BIÊN DỊCH VÀ DEBUG 6. BÀI TẬP NÂNG CAO 159 160 40
  41. glkjglkjg Accelerometer là gì ? Sơ đồ kết nối Accelerometer  Accelerometer là cảm biến  Trên board, cảm biến Accelerometer là chip U5 được kết gia tốc được chế tạo theo nối đến SPI1 của STM32F4. công nghệ MEMS (Micro ElectroMechanic System).  Tuỳ theo số trục của cảm biến (1, 2 hay 3 trục), giá trị đọc về của cảm biến sẽ là "hình chiếu của gia tốc trọng trường" trên từng trục toạ độ tương ứng. 161 162 Bài tập mẫu Khởi tạo Code  Đọc tín hiệu theo trục XYZ từ cảm biến LIS3DSH. Bật led  Mở CubeMX. sáng tương ứng theo độ nghiêng của board.  Tạo project mới.  Cấu hình clock.  Chọn bộ SPI1 là giao tiếp giữa VXL và cảm biến. 163 164 41
  42. glkjglkjg Khởi tạo Code Khởi tạo Code  Chọn thẻ  Cấu hình 4 Configuration. pin PD12 đến PD15 ở chế  Cấu hình SPI1 như hình. độ GPIO_Output. (General Purpose Input Output) 165 166 Viết Code bằng ARM V5 Viết Code bằng ARM V5  Biên dịch  Click phải vào chương trình. mục Drivers/CMSIS  Khai báo mảng xyz ở khu vực để add thêm các Private variables thư viện như dùng để lưu giá hình. trị cảm biến của 3 trục x,y,z. 167 168 42
  43. glkjglkjg Viết Code bằng ARM V5 Viết Code bằng ARM V5  Ở khu vực USER CODE BEGIN 2:  Viết code ở khu vực USER CODE BEGIN 3.  Đọc giá trị cảm biến bằng hàm: BSP_ACCELERO_GetXYZ(xyz); và lưu  Khởi tạo cảm biến bằng hàm: BSP_ACCELERO_Init(); vào mảng xyz.  Chạy ở chế độ Debug để quan sát biến này thay đổi khi thay đổi vị trí của board. 169 170 Bài tập  Bật sáng đèn led tương ứng về phía nghiêng của board. VD nghiêng board sang trái và lên trên thì led trái và led trên sẽ sáng. 171 43