Trong quá trình học tập và nghiên cứu, chúng em đã có thêm được nhiều kiến thức về chuyên ngành cũng như những kiến thức của môn học Kỹ thuật vi xử lý đồng thời có thời gian rèn luyện cá
CƠ SỞ LÝ THUYẾT
Tổng quan về cấu trúc ARM và vi xử lí lõi ARM Cortex-M3
1.1.1 Tổng quan về cấu trúc ARM
ARM (Advanced RISC Machine) là một kiến trúc RISC cho vi xử lý máy tính, được phát triển bởi Arm Holdings và cấp phép cho các công ty khác Các công ty này thiết kế sản phẩm riêng, bao gồm SoC và SoM, kết hợp với các thành phần như bộ nhớ và giao diện Arm Holdings cũng thiết kế các lõi thực hiện tập lệnh và cấp phép cho các đối tác để phát triển sản phẩm dựa trên các lõi này.
Các bộ xử lý RISC yêu cầu ít bóng bán dẫn hơn so với CISC, như bộ xử lý x86, giúp giảm chi phí, tiêu thụ điện năng và tản nhiệt Điều này đặc biệt quan trọng cho các thiết bị nhẹ, di động, chạy bằng pin như điện thoại thông minh, máy tính xách tay và máy tính bảng, cũng như các hệ thống nhúng Đối với siêu máy tính tiêu thụ nhiều điện, kiến trúc ARM cũng có thể là giải pháp tiết kiệm năng lượng hiệu quả.
ARM Holdings thường xuyên cập nhật kiến trúc của mình, với các phiên bản từ ARMv3 đến ARMv7 hỗ trợ không gian địa chỉ 32 bit và số học 32 bit Các kiến trúc này chủ yếu sử dụng hướng dẫn có độ dài cố định 32 bit, trong khi phiên bản Thumb cung cấp tập lệnh với độ dài thay đổi, cho phép sử dụng cả lệnh 32 và 16 bit để tối ưu hóa mật độ mã Một số lõi cũ hơn còn hỗ trợ thực thi phần cứng cho mã byte Java Năm 2011, ARM giới thiệu kiến trúc ARMv8-A, bổ sung hỗ trợ cho không gian địa chỉ và số học 64 bit, cùng với tập lệnh có độ dài cố định 32 bit mới.
1.1.2 Tổng quan về vi xử lí lõi ARM Cortex-M3
− Cấu hình A: cho các ứng dụng Application, yêu cầu cao chạy trên các hệ điều hành mở và phức tạp như Linux, Android…
− Cấu hình R: cho các ứng dụng thời gian thực Real Time
− Cấu hình M: cho các ứng dụng vi điều khiển Microcontroller
Bộ vi xử lý ARM Cortex-M3, dựa trên kiến trúc ARMv7-M, có cấu trúc thứ bậc và tích hợp lõi xử lý trung tâm cùng các thiết bị ngoại vi tiên tiến Nó cung cấp các khả năng như kiểm soát ngắt, bảo vệ bộ nhớ, gỡ lỗi và theo vết hệ thống Đặc trưng bởi cấu trúc Harvard, ARM Cortex-M3 tách biệt vùng nhớ dữ liệu và chương trình, cho phép đọc lệnh và dữ liệu đồng thời, từ đó tăng tốc độ thực thi ứng dụng thông qua khả năng thực hiện nhiều hoạt động song song.
Hình 1.1: Cấu Trúc Vi Xử Lý ARM Cortex M3
Lõi ARM Cortex có cấu trúc đường ống ba tầng: Fetch, Decode và Execute Khi gặp lệnh nhánh, tầng Decode sẽ nạp lệnh suy đoán để tăng tốc độ thực thi Bộ xử lý dự định rẽ nhánh trong giai đoạn giải mã, và trong giai đoạn thực thi, việc rẽ nhánh sẽ được giải quyết để xác định lệnh tiếp theo Nếu lệnh rẽ nhánh không được chọn, lệnh tiếp theo đã sẵn sàng; nếu lệnh rẽ nhánh được chọn, nó cũng sẽ sẵn sàng ngay lập tức, giúp giảm thời gian chờ chỉ còn một chu kỳ.
Bộ vi xử lý Cortex-M3 là một vi xử lý 32-bit với đường dẫn dữ liệu rộng 32 bit, bao gồm 13 thanh ghi đa dụng, hai con trỏ ngăn xếp, một thanh ghi liên kết, một bộ đếm chương trình và các thanh ghi đặc biệt như thanh ghi trạng thái chương trình.
Tổng quan về vi điều khiển STM32 và STM32F103C8T6
ST đã giới thiệu 4 dòng vi điều khiển dựa trên ARM7 và ARM9, trong đó STM32 nổi bật với sự cải tiến về chi phí và hiệu suất, với giá gần 1 Euro khi mua số lượng lớn STM32 thực sự là một đối thủ đáng gờm so với các vi điều khiển 8 và 16-bit truyền thống Phiên bản đầu tiên của STM32 bao gồm 14 biến thể khác nhau, được chia thành hai dòng: dòng Performance, với tần số hoạt động của CPU tương thích hoàn toàn về cách bố trí chân và phần mềm, cùng với khả năng lưu trữ bộ nhớ FLASH ROM lên tới 512K và 64K SRAM.
Hình 1.3: Kiến trúc của STM32 nhánh Performance và Access
Nhánh Performance hoạt động với xung nhịp lên đến 72MHz, cung cấp đầy đủ các ngoại vi, trong khi nhánh Access có xung nhịp tối đa 36MHz và ít ngoại vi hơn so với nhánh Performance.
1.2.2.1 Cấu trúc kit vi điều khiển STM32F103C8T6
Hình 1.4: Kit phát triển STM32F103C8T6
Cấu trúc của kit STM32F103C8T6 bao gồm:
− 1 cổng Mini USB dùng để cấp nguồn, nạp cũng như debug.
− 2 MCU bao gồm 1 MCU nạp và 1 MCU dùng để lập trình.
− Có chân Output riêng cho các chân mạch nạp trên MCU1.
− Có chân Output đầy đủ cho các chân MCU2.
− Chân cấp nguồn ngoài riêng cho MCU2 nếu không sử dụng nguồn từ USB.
− Thạch anh 32,768khz dùng cho RTC và Backup.
− Chân nạp dùng cho chế độ nạp boot loader.
− Nút Reset ngoài và 1 led hiển thị trên chân PB9, 1 led báo nguồn cho MCU2.
1.2.2.2 Cấu hình chi tiết của STM32F103C8T6
ARM 32-bit Cortex M3 với clock max là 72Mhz.
Bộ nhớ 64 kbytes bộ nhớ Flash(bộ nhớ lập trình) và 20kbytes SRAM.
Clock, reset và quản lý nguồn:
− Power on reset(POR), Power down reset(PDR) và programmable voltage detector (PVD).
− Sử dụng thạch anh ngoài từ 4Mhz -> 20Mhz.
− Thạch anh nội dùng dao động RC ở mode 8Mhz hoặc 40khz.
− Sử dụng thạch anh ngoài 32.768khz được sử dụng cho RTC.
Trong trường hợp điện áp thấp:
− Có các mode :ngủ, ngừng hoạt động hoặc hoạt động ở chế độ chờ.
− Cấp nguồn ở chân Vbat bằng pin để hoạt động bộ RTC và sử dụng lưu trữ data khi mất nguồn cấp chính.
2 bộ ADC 12 bit với 9 kênh cho mỗi bộ:
− Khoảng giá trị chuyển đổi từ 0 – 3.6V.
− Lấy mẫu nhiều kênh hoặc 1 kênh.
− Có cảm biến nhiệt độ nội.
DMA bộ chuyển đổi này giúp tăng tốc độ xử lý do không có sự can thiệp quá sâu của CPU:
− Hỗ trợ DMA cho ADC, I2C, SPI, UART.
− 3 timer 16 bit hỗ trợ các mode IC/OC/PWM.
− 1 timer 16 bit hỗ trợ để điều khiển động cơ với các mode bảo vệ như ngắt input, dead-time
− 2 watdog timer dùng để bảo vệ và kiểm tra lỗi.
− 1 sysTick timer 24 bit đếm xuống dùng cho các ứng dụng như hàm Delay….
Hỗ trợ 9 kênh giao tiếp bao gồm:
− 3 bộ USART(ISO 7816 interface, LIN, IrDA capability, modem control).
Kiểm tra lỗi CRC và 96-bit ID.
Hình 1.5: Sơ đồ chân kit STM32F103C8T6
Các thông số kĩ thuật của kit STM32F103C8T6:
− Điện áp cấp 5VDC qua cổng Micro USB sẽ được chuyển đổi thành 3.3VDC qua IC nguồn và cấp cho Vi điều khiển chính.
− Tích hợp sẵn thạch anh 8Mhz.
− Tích hợp sẵn thạnh anh 32Khz cho các ứng dụng RTC.
− Ra chân đầy đủ tất cả các GPIO và giao tiếp: CAN, I2C, SPI, UART, USB,…
− Tích hợp Led trạng thái nguồn, Led PC13, Nút Reset.
− Sử dụng với các mạch nạp: ST-Link Mini, J-link hoặc USB TO COM.
− Kết nối chân khi nạp bằng ST-Link Mini: TCK - SWCLK, TMS - SWDIO, GND -GND, 3.3V - 3.3V.
Lập trình cho STM32
STMicroelectronics đã ra mắt công cụ STM32CubeMX, cho phép tạo mã cơ bản cho các thiết bị ngoại vi và bo mạch STM32 đã chọn, giúp giảm bớt lo lắng về việc lập trình cho các trình điều khiển và thiết bị ngoại vi cơ bản Mã được tạo ra có thể dễ dàng chỉnh sửa trong Keil uVision theo nhu cầu của người dùng Cuối cùng, mã này có thể được ghi vào STM32 thông qua lập trình ST-Link từ STMicroelectronics.
Công cụ STM32CubeMX, thuộc STMicroelectronics STMCube, giúp đơn giản hóa quá trình phát triển, giảm thời gian và chi phí Đây là một phần mềm cấu hình đồ họa cho phép tạo mã C thông qua trình hướng dẫn trực quan Mã được tạo ra có thể sử dụng trong nhiều môi trường phát triển khác nhau như keil uVision, GCC, IAR, và có thể tải xuống từ liên kết cung cấp.
STM32CubeMX có các tính năng sau:
− Trợ giúp thiết lập xung.
− Một tiện ích thực hiện cấu hình ngoại vi MCU như chân GPIO, USART, v.v.
− Một tiện ích thực hiện cấu hình ngoại vi MCU cho các ngăn xếp phần mềm trung gian như USB, TCP / IP, v.v.
Keil C là phần mềm hỗ trợ lập trình cho các vi điều khiển, cho phép người dùng soạn thảo và biên dịch chương trình C hoặc Assembly thành ngôn ngữ máy Phần mềm này giúp nạp chương trình vào vi điều khiển, tạo điều kiện thuận lợi cho việc tương tác giữa vi điều khiển và lập trình viên.
Quy trình sẽ là cấu hình cơ bản trên CubeMX:
Hình 1.6: Cấu hình trên CubeMX
Sau đó sẽ lập trình nâng cao trên KeilC:
Tổng quan về cảm biến nhiệt độ, độ ẩm DHT11
Cảm biến DHT11 là một thiết bị phổ biến để đo nhiệt độ và độ ẩm, nổi bật với chi phí thấp và khả năng thu thập dữ liệu dễ dàng thông qua giao tiếp 1-wire Với bộ tiền xử lý tín hiệu tích hợp, DHT11 đảm bảo rằng dữ liệu thu được chính xác mà không cần thực hiện thêm bất kỳ phép tính nào.
Hình 1.8: Cảm biến và module cảm biến DHT11 Đặc điểm:
− Điện áp hoạt động : 3V - 5V (DC)
− Dải độ ẩm hoạt động : 20% - 90% RH, sai số ±5%RH
− Dải nhiệt độ hoạt động : 0°C ~ 50°C, sai số ±2°C
− Tần số lấy mẫu tối đa: 1 Hz
− Khoảng cách truyển tối đa: 20m
Cảm biến DHT11 có sơ đồ chân bao gồm 2 chân cấp nguồn và 1 chân tín hiệu, như thể hiện trong hình 1.9 Hiện tại, DHT11 được cung cấp trên thị trường với hai loại đóng gói phổ biến.
Hình 1.9: Các chân của cảm biến DHT11
Cảm biến DHT11 là lựa chọn lý tưởng cho các ứng dụng cần đo nhiệt độ và độ ẩm với chi phí thấp và dễ sử dụng Sản phẩm này thích hợp trong những môi trường không khắc nghiệt và khi yêu cầu về độ chính xác không quá cao.
LCD 1602
Thiết bị hiển thị LCD 1602 (Liquid Crystal Display) ngày nay được ứng dụng rộng rãi trong nhiều lĩnh vực của vi điều khiển Với khả năng hiển thị đa dạng các ký tự như chữ, số và ký tự đồ họa, LCD 1602 mang lại nhiều lợi ích vượt trội so với các loại hiển thị khác Nó dễ dàng tích hợp vào mạch ứng dụng thông qua nhiều giao thức giao tiếp khác nhau, tiêu tốn ít tài nguyên hệ thống và có giá thành phải chăng.
Thông số kĩ thuật của sản phẩm LCD 1602:
− Điện áp ra mức cao : > 2.4
− Điện áp ra mức thấp : = 10) { return 0;
/* cho chan PB12 xuong thap */
TIM_SetCounter(TIM2, 0); while (TIM_GetCounter(TIM2) < 45) { if (!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_8)) { break;
} u16Tim = TIM_GetCounter(TIM2); if ((u16Tim >= 45) || (u16Tim = 90) || (u16Tim = 95) || (u16Tim = 65) || (u16Tim = 80) || (u16Tim = 65) || (u16Tim = 80) || (u16Tim = 80) || (u16Tim = 65) || (u16Tim = 80) || (u16Tim = 65) || (u16Tim = 80) || (u16Tim > 4);
} void I2C_LCD_Write_4bit(uint8_t u8Data)
//4 bit can ghi chinh la 4 5 6 7
//sau do gan LCD_E=0 if(u8Data & 0x08) { u8LCD_Buff[LCD_D7] = 1;
} if(u8Data & 0x04) { u8LCD_Buff[LCD_D6] = 1; u8LCD_Buff[LCD_D6] = 0;
} if(u8Data & 0x02) { u8LCD_Buff[LCD_D5] = 1;
} if(u8Data & 0x01) { u8LCD_Buff[LCD_D4] = 1;
I2C_LCD_FlushVal(); u8LCD_Buff[LCD_EN] = 0;
//dau tien ghi tat ca 4 bit thap bang 1 u8LCD_Buff[LCD_D4] = 1; u8LCD_Buff[LCD_D5] = 1; u8LCD_Buff[LCD_D6] = 1; u8LCD_Buff[LCD_D7] = 1;
I2C_LCD_FlushVal(); u8LCD_Buff[LCD_RS] = 0;
I2C_LCD_FlushVal(); u8LCD_Buff[LCD_RW] = 1;
I2C_LCD_FlushVal(); do { u8LCD_Buff[LCD_EN] = 1;
I2C_Read(I2C_LCD_ADDR + 1, &temp, 1); u8LCD_Buff[LCD_EN] = 0;
I2C_LCD_FlushVal(); u8LCD_Buff[LCD_EN] = 1;
I2C_LCD_FlushVal(); u8LCD_Buff[LCD_EN] = 0;
} void I2C_LCD_WriteCmd(uint8_t u8Cmd)
I2C_LCD_FlushVal(); u8LCD_Buff[LCD_RW] = 0;
} void LCD_Write_Chr(char chr)
LCD_WaitBusy(); u8LCD_Buff[LCD_RS] = 1;
I2C_LCD_FlushVal(); u8LCD_Buff[LCD_RW] = 0;
} void I2C_LCD_Puts(char *sz)
} void I2C_LCD_BackLight(uint8_t u8BackLight)
{ if(u8BackLight) { u8LCD_Buff[LCD_BL] = 1;
} else { u8LCD_Buff[LCD_BL] = 0;
#define I2C_LCD_ADDR 0x4E extern void delay_ms(uint32_t u32DelayInMs);
#define I2C_LCD_Delay_Ms(u16DelayMs) delay_ms(u16DelayMs)
#define LCD_BL 3 void I2C_LCD_Init(void); void I2C_LCD_Puts(char *szStr); void I2C_LCD_Clear(void); void I2C_LCD_NewLine(void); void I2C_LCD_BackLight(uint8_t u8BackLight);
#include "i2c_lcd.h" int main(void)
GPIO_InitTypeDef gpioInit; char szDisplay[17]; uint8_t u8Buff[4];
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
GPIO_Init(GPIOC, &gpioInit); gpioInit.GPIO_Mode = GPIO_Mode_Out_PP; gpioInit.GPIO_Pin = GPIO_Pin_14; gpioInit.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &gpioInit); gpioInit.GPIO_Pin = GPIO_Pin_0; gpioInit.GPIO_Speed = GPIO_Speed_50MHz;
Delay_Init(); dht11_init(); i2c_init();
I2C_LCD_Puts("STM32-DHT11"); delay_ms(5000);
/* da doc duoc gia tri nhiet do va do am */
/* gui do am */ if (dht11_read(u8Buff)) {
//send(u8Buff[0]); sprintf(szDisplay, "Do am: %d ", u8Buff[0]) ;
I2C_LCD_Puts(szDisplay); delay_ms(20);
I2C_LCD_NewLine(); sprintf(szDisplay, "Nhiet do: %d ", u8Buff[2]);
GPIO_SetBits(GPIOC, GPIO_Pin_14); delay_ms(500);
GPIO_ResetBits(GPIOC, GPIO_Pin_14); delay_ms(500);
Quá trình thực hiện đề tài đã mang lại cho nhóm em nhiều lợi ích trong việc nghiên cứu và tìm hiểu về lập trình vi điều khiển, đồng thời củng cố kiến thức đã học Nhóm cũng nhận thấy những khó khăn khi áp dụng lập trình vi điều khiển vào sản phẩm thực tế Kết quả chính thu được từ quá trình tìm hiểu và thực hiện đề tài là rất đáng ghi nhận.
− Tìm hiểu tổng quan về các dòng vi điều khiển lõi ARM.
− Học cách code trên phần mềm Keil C V5.
− Học cách kết nối module cảm biến, LCD, với kit STM32F103C8T6.
− Hoàn thành hệ thống báo nhiệt độ vượt ngưỡng sử dụng module DHT11 sát với yêu cầu đề ra.
Do thời gian hạn chế, nhóm chúng em chưa thể tích hợp điều khiển động cơ bước và cảm biến khói vào hệ thống Chúng em sẽ nỗ lực nghiên cứu và phát triển hệ thống trong thời gian tới.
[1] https://khuenguyencreator.com/lap-trinh-stm32-tu-a-toi-z/
[2] https://www.anonyhome.com/2020/03/chia-se-tai-lieu-hoc-lap-trinh-arm- stm32-stm8-vv.html
[3] https://husteduvn-my.sharepoint.com/personal/ thang_hoangmanh_hust_edu_vn/_layouts/15/onedrive.aspx?id=%2Fpersonal
%2Fthang%5Fhoangmanh%5Fhust%5Fedu%5Fvn%2FDocuments
%2FFordownload%2FSlidesVXL%2Erar&parent=%2Fpersonal%2Fthang
%5Fhoangmanh%5Fhust%5Fedu%5Fvn%2FDocuments
%2FFordownload&originalPath=aHR0cHM6Ly9odXN0ZWR1dm4tbXkuc2h hcmVwb2ludC5jb20vOnU6L2cvcGVyc29uYWwvdGhhbmdfaG9hbmdtYW5oX2h1c3RfZWR1X3ZuL0VWLVQzQWtlMjJkRm9ydmhVdEd5Y0ZJQmIwcFN1NVo4VzBVWnlUbzFuVTRWUkE%5FcnRpbWU9UUlhNFcxRkgyVWc