Arm Holdingsphát triển kiến trúc và cấp phép nó cho các công ty khác, nơi mà sẽ thiết kế các sảnphẩm của riêng họ để thực hiện một trong những kiến trúc đó bao gồm các SoC và cácmodule h
HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG KHOA VIỄN THÔNG I BÁO CÁO BÀI TẬP LỚN MÔN: KĨ THUẬT VI XỬ LÝ Đề bài: Cảm biến nhiệt độ dùng NTC hiển thị kết LCD Giảng viên: Hà Nội, 10-2023 LỜI NÓI ĐẦU Trong xu phát triển nay, với bùng nổ ngành công nghệ thơng tin, điện tử, tự động hóa, … Đã làm cho đời sống người ngày hoàn thiện Các thiết bị tự động hóa ngày xâm lấn vào sản xuất chí vào sống sinh hoạt hàng ngày người Ví dụ tơ có hàng ngàn thiết bị hỗ trợ người lái Là sinh viên khoa Điện tử Viễn thông, kiến thức học, nhóm em chọn đề tài Thiết kế mạch đo nhiệt độ dùng NTC cho tập lớn Trong trình làm đề tài này, chúng em cố gắng hoàn thành thật tốt kiến thức hạn chế với yếu tố khách quan khác mà khơng tránh khỏi thiếu sót Chúng em mong đóng góp ý kiến, phê bình hướng dẫn thêm thầy bạn đọc Cuối chúng em xin gửi lời cảm ơn chân thành tới thầy…… hướng dẫn tận tình, giảng giải chi tiết giúp chúng em hồn thành đềtài Trong trình học tập nghiên cứu, chúng em có thêm nhiều kiến thức chuyên ngành kiến thức môn học Kỹ thuật vi xử lý đồng thời có thời gian rèn luyện kỹ khác cần thiết cho sống Chúng em xin chân thành cảm ơn ! MỤC LỤC PHẦN CƠ SỞ LÝ THUYẾT .1 Tổng quan cấu trúc ARM Tổng quan vi xử lí lõi ARM Cortex-M3 1 Vi điều khiển STM32 Vi điều khiển STM32F103C8T6 PHẦN PHÂN TÍCH THIẾT KẾ HỆ THỐNG 14 Yêu cầu chung .14 Yêu cầu module cảm biến DHT11 14 Yêu cầu với LCD 1602 .14 PHẦN XÂY DỰNG THIẾT KẾ HỆ THỐNG 15 KẾT LUẬN 48 PHẦN CƠ SỞ LÝ THUYẾT I Tổng quan cấu trúc ARM vi xử lí lõi ARM Cortex-M3 ARM (từ viết tắt Advanced RISC Machine) họ kiến trúc dạng RISC cho vi xử lý máy tính, cấu hình cho mơi trường khác Arm Holdings phát triển kiến trúc cấp phép cho công ty khác, nơi mà thiết kế sản phẩm riêng họ để thực kiến trúc bao gồm SoC module hệ thống (SoM) kết hợp với thành phần khác nhớ, giao diện, radio Họ thiết kế lõi thực tập lệnh cấp phép cho thiết kế cho công ty đối tác để thiết kế sản phẩm riêng họ dựa lõi Các xử lý có kiến trúc RISC thường u cầu bóng bán dẫn xử lý có kiến trúc điện tốn tập lệnh phức tạp (CISC) (như xử lý x86 có hầu hết máy tính cá nhân), giúp cải thiện chi phí, tiêu thụ điện tản nhiệt Những đặc điểm mong muốn thiết bị nhẹ, di động, chạy pin bao gồm điện thoại thơng minh, máy tính xách tay máy tính bảng hệ thống nhúng khác Đối với siêu máy tính tiêu thụ lượng điện lớn, ARM giải pháp tiết kiệm lượng ARM Holdings định kỳ phát hành cập nhật cho kiến trúc Các phiên kiến trúc ARMv3 đến ARMv7 hỗ trợ không gian địa 32 bit (chip tiền ARMv3, tạo trước ARM Holdings hình thành, sử dụng Acorn Archimedes, có khơng gian địa 26 bit) số học 32 bit; hầu hết kiến trúc có hướng dẫn có độ dài cố định 32 bit Phiên Thumb hỗ trợ tập lệnh có độ dài thay đổi, cung cấp hai lệnh 32 16 bit để cải thiện mật độ mã Một số lõi cũ cung cấp thực thi phần cứng cho mã byte Java Được phát hành vào năm 2011, kiến trúc ARMv8-A thêm hỗ trợ cho không gian địa 64 bit số học 64 bit với tập lệnh có độ dài cố định 32 bit Vi xử lý lõi ARM Cortex dựa cấu hình kiến trúc ARMv7: − Cấu hình A: cho ứng dụng Application, yêu cầu cao chạy hệ điều hành mở phức tạp Linux, Android… − Cấu hình R: cho ứng dụng thời gian thực Real Time − Cấu hình M: cho ứng dụng vi điều khiển Microcontroller Bộ vi xử lý ARM Cortex-M3 dựa kiến trúc ARMv7-M có cấu trúc thứ bậc Nó tích hợp lõi xử lý trung tâm, với thiết bị ngoại vi hệ thống tiên tiến để tạo khả kiểm soát ngắt, bảo vệ nhớ, gỡ lỗi theo vết hệ thống ARM Cortex M3 dựa cấu trúc Havard, đặc trưng tách biệt vùng nhớ liệu chương trình Vì đọc lúc lệnh liệu từ nhớ, vi xử lý ARM Cortex-M3 thực nhiều hoạt động song song, tăng tốc thực thi ứng dụng Cấu Trúc Vi Xử Lý ARM Cortex M3 Lõi ARM Cortex có cấu trúc đường ống gồm tầng: Instruction Fetch, Instruction Decode Instruction Execute Khi gặp lệnh nhánh, tầng decode chứa thị nạp lệnh suy đốn dẫn đến việc thực thi nhanh Bộ xử lý nạp lệnh dự định rẽ nhánh giai đoạn giải mã Sau đó, giai đoạn thực thi, việc rẽ nhánh giải vi xử lý phân tích xem đâu lệnh thực thi Nếu việc rẽ nhánh không chọn lệnh sẵn sàng Cịn việc rẽ nhánh chọn lệnh rẽ nhánh sẵn sàng lập tức, hạn chế thời gian rỗi chu kỳ Document continues below Discover more from: Kỹ thuật vi xử lý Học viện Cơng ng… 113 documents Go to course TÀI LIỆU THI TÍN 39 HIỆUHỆ THỐNG Kỹ thuật vi xử lý 100% (9) Giao trinh Kythuat 143 Vixuly Kỹ thuật vi xử lý 100% (4) KTS2013 - Bài giảng 146 kỹ thuật số ptithcm Kỹ thuật vi xử lý 100% (3) Tiểu luận KTCT 11 maclenin The Cortex–M3 processor Kỹ thuật vi 100% (2) xửcủa lý đường dẫn Bộ vi xử lý Cortex-M3 vi xử lý 32-bit, với độ rộng liệu 32 bit, dải ghi giao tiếp nhớ Có 13 ghi đa dụng, hai trỏ ngăn xếp, ghi liên kết, đếm chương trình số ghi đặc BÀI TẬP TÌNH HUỐNG MƠN KỸ NĂNG LÀM… biệt có ghi trạng thái chương trình II Tổng quan vi điều khiển STM32 STM32F103C8T6 Kỹ thuật vi xử lý 71% (14) ST đưa thị trường dòng vi điều khiển dựa ARM7 ARM9, STM32 bước tiến quan trọng đường cong chi phí hiệu suất Sách hướng dẫn (price/performance), giá gần Euro với số lượng lớn, STM32 thách thức thậthọc tậptiên vật lý14 đại cươn… với vi điều khiển 16-bit truyền thống STM32 đầu gồm biến thể 60 khác nhau, phân thành hai dịng: dịng Performance có tần hoạt động Kỹsốthuật vi CPU 100% (1) lên tới 72Mhz dịng Access có tần số hoạt động lên tới Các biến thể xử36Mhz lý STM32 hai nhóm tương thích hồn tồn cách bố trí chân (pin) phần mềm, đồng thời kích thước nhớ FLASH ROM lên tới 512K 64K SRAM Kiến trúc STM32 nhánh Performance Access Nhánh Performance hoạt động với xung nhịp lên đến 72Mhz có đầy đủ ngoại vi, nhánh Access hoạt động với xung nhịp tối đa 36Mhz có ngoại vi so với nhánh Performance Kit phát triển STM32F103C8T6 Cấu trúc kit STM32F103C8T6 bao gồm: − cổng Mini USB dùng để cấp nguồn, nạp debug − MCU bao gồm MCU nạp MCU dùng để lập trình − Có chân Output riêng cho chân mạch nạp MCU1 − Có chân Output đầy đủ cho chân MCU2 − Chân cấp nguồn ngồi riêng cho MCU2 khơng sử dụng nguồn từ USB − Thạch anh 32,768khz dùng cho RTC Backup − Chân nạp dùng cho chế độ nạp boot loader − Nút Reset led hiển thị chân PB9, led báo nguồn cho MCU2 ARM 32-bit Cortex M3 với clock max 72Mhz Bộ nhớ 64 kbytes nhớ Flash(bộ nhớ lập trình) 20kbytes SRAM.Clock, reset quản lý nguồn: − Điện áp hoạt động 2.0V -> 3.6V − Power on reset (POR), Power down reset (PDR) programmable voltage detector (PVD) − Sử dụng thạch anh từ 4Mhz -> 20Mhz − Thạch anh nội dùng dao động RC mode 8Mhz 40khz − Sử dụng thạch anh 32.768khz sử dụng cho RTC Trong trường hợp điện áp thấp: − Có mode :ngủ, ngừng hoạt động hoạt động chế độ chờ − Cấp nguồn chân Vbat pin để hoạt động RTC sử dụng lưu trữ data nguồn cấp ADC 12 bit với kênh cho bộ: − Khoảng giá trị chuyển đổi từ – 3.6V − Lấy mẫu nhiều kênh kênh − Có cảm biến nhiệt độ nội DMA chuyển đổi giúp tăng tốc độ xử lý khơng có can thiệp sâucủa CPU: − kênh DMA − Hỗ trợ DMA cho ADC, I2C, SPI, UART timer: − timer 16 bit hỗ trợ mode IC/OC/PWM #include "I2C.h" #include "i2c_lcd.h" static uint8_t u8LCD_Buff[8];//bo nho dem luu lai toan bo static uint8_t u8LcdTmp; #define MODE_4_BIT 0x28 #define CLR_SCR 0x01 #define DISP_ON 0x0C #define CURSOR_ON 0x0E #define CURSOR_HOME 0x80 static void I2C_LCD_Write_4bit(uint8_t u8Data); static void I2C_LCD_FlushVal(void); static void I2C_LCD_WriteCmd(uint8_t u8Cmd); void I2C_LCD_FlushVal(void) { uint8_t i; for (i = 0; i < 8; ++i) { u8LcdTmp >>= 1; if(u8LCD_Buff[i]) { u8LcdTmp |= 0x80; } } I2C_Write(I2C_LCD_ADDR, &u8LcdTmp, 1); } void I2C_LCD_Init(void) 37 { uint8_t i; I2C_LCD_Delay_Ms(50); My_I2C_Init(); for (i = 0; i < 8; ++i) { u8LCD_Buff[i] = 0; } I2C_LCD_FlushVal(); u8LCD_Buff[LCD_RS] = 0; I2C_LCD_FlushVal(); u8LCD_Buff[LCD_RW] = 0; I2C_LCD_FlushVal(); I2C_LCD_Write_4bit(0x03); I2C_LCD_Delay_Ms(5); I2C_LCD_Write_4bit(0x03); I2C_LCD_Delay_Ms(1); I2C_LCD_Write_4bit(0x03); I2C_LCD_Delay_Ms(1); I2C_LCD_Write_4bit(MODE_4_BIT >> 4); I2C_LCD_Delay_Ms(1); I2C_LCD_WriteCmd(MODE_4_BIT); I2C_LCD_WriteCmd(DISP_ON); I2C_LCD_WriteCmd(CURSOR_ON); I2C_LCD_WriteCmd(CLR_SCR); 38 } void I2C_LCD_Write_4bit(uint8_t u8Data) { //4 bit can ghi chinh la //dau tien gan LCD_E=1 //ghi du lieu //sau gan LCD_E=0 if(u8Data & 0x08) { u8LCD_Buff[LCD_D7] = 1; } else { u8LCD_Buff[LCD_D7] = 0; } if(u8Data & 0x04) { u8LCD_Buff[LCD_D6] = 1; } else { u8LCD_Buff[LCD_D6] = 0; } if(u8Data & 0x02) { u8LCD_Buff[LCD_D5] = 1; } else { u8LCD_Buff[LCD_D5] = 0; } if(u8Data & 0x01) { u8LCD_Buff[LCD_D4] = 1; } else { u8LCD_Buff[LCD_D4] = 0; 39 } u8LCD_Buff[LCD_EN] = 1; I2C_LCD_FlushVal(); u8LCD_Buff[LCD_EN] = 0; I2C_LCD_FlushVal(); } void LCD_WaitBusy(void) { char temp; //dau tien ghi tat ca bit thap bang 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(); { u8LCD_Buff[LCD_EN] = 1; I2C_LCD_FlushVal(); 40 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; I2C_LCD_FlushVal(); } while (temp & 0x08); } void I2C_LCD_WriteCmd(uint8_t u8Cmd) { LCD_WaitBusy(); u8LCD_Buff[LCD_RS] = 0; I2C_LCD_FlushVal(); u8LCD_Buff[LCD_RW] = 0; I2C_LCD_FlushVal(); I2C_LCD_Write_4bit(u8Cmd >> 4); I2C_LCD_Write_4bit(u8Cmd); } 41 void LCD_Write_Chr(char chr) { LCD_WaitBusy(); u8LCD_Buff[LCD_RS] = 1; I2C_LCD_FlushVal(); u8LCD_Buff[LCD_RW] = 0; I2C_LCD_FlushVal(); I2C_LCD_Write_4bit(chr >> 4); I2C_LCD_Write_4bit(chr); } void I2C_LCD_Puts(char *sz) { while (1) { if (*sz) { LCD_Write_Chr(*sz++); } else { break; } } } void I2C_LCD_Clear(void) { I2C_LCD_WriteCmd(CLR_SCR); 42 } void I2C_LCD_NewLine(void) { I2C_LCD_WriteCmd(0xc0); } void I2C_LCD_BackLight(uint8_t u8BackLight) { if(u8BackLight) { u8LCD_Buff[LCD_BL] = 1; } else { u8LCD_Buff[LCD_BL] = 0; } I2C_LCD_FlushVal(); } File i2c_lcd.h #ifndef I2C_LCD_H_ #define I2C_LCD_H_ #include "stm32f10x.h" #include "I2C.h" #include #define I2C_LCD_ADDR 0x4E extern void delay_ms(uint32_t u32DelayInMs); #define I2C_LCD_Delay_Ms(u16DelayMs) delay_ms(u16DelayMs) 43 #define LCD_EN #define LCD_RW #define LCD_RS #define LCD_D4 #define LCD_D5 #define LCD_D6 #define LCD_D7 #define LCD_BL 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); #endif File main.c #include "stm32f10x.h" #include "delay.h" #include "dht11.h" #include #include "i2c_lcd.h" int main(void) { GPIO_InitTypeDef gpioInit; 44 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_Mode = GPIO_Mode_Out_PP; gpioInit.GPIO_Pin = GPIO_Pin_0; gpioInit.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &gpioInit); Delay_Init(); dht11_init(); i2c_init(); 45 I2C_LCD_Init(); I2C_LCD_Clear(); I2C_LCD_BackLight(1); I2C_LCD_Puts("STM32 & LCD1602"); I2C_LCD_NewLine(); I2C_LCD_Puts("STM32-DHT11"); delay_ms(5000); I2C_LCD_Clear(); while (1) { /* da doc duoc gia tri nhiet va am */ /* gui am */ if (dht11_read(u8Buff)) { //send(u8Buff[0]); sprintf(szDisplay, "Do am: %d ", u8Buff[0]) ; I2C_LCD_Puts(szDisplay); delay_ms(20); //send(u8Buff[2]); I2C_LCD_NewLine(); sprintf(szDisplay, "Nhiet do: %d ", u8Buff[2]); I2C_LCD_Puts(szDisplay); } else { // neu DHT11 bi loi I2C_LCD_Clear(); 46 I2C_LCD_Puts("STM32 - LCD1602"); I2C_LCD_NewLine(); I2C_LCD_Puts("DHT11: ERROR "); } if(u8Buff[2] >= 30) { GPIO_SetBits(GPIOC, GPIO_Pin_14); delay_ms(500); GPIO_ResetBits(GPIOC, GPIO_Pin_14); delay_ms(500); } } } 47 KẾT LUẬN Quá trình làm BTL thực khoảng thời gian hữu ích cho nhóm em nghiên cứu, tìm hiểu lập trình vi xử lí, đồng thời củng cố lại kiến thức học Qua đó, nhận thấy khó khăn triển khai ứng dụng lập trình vi xử lí vào cácsản phẩm thực tế Qua trình tìm hiểu thực đề tài, nhóm thu kếtquả sau: − Tìm hiểu tổng quan dòng vi điều khiển lõi ARM − Học cách code 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 đề Do thời gian có hạn, nên nhiều phần nhóm chúng em hồn thành cách chỉnh chu Chúng em cố gắng nghiên cứu phát triển thêm hệ thống thời gian tới 48 More from: Kỹ thuật vi xử lý Học viện Công ngh… 113 documents Go to course 39 143 TÀI LIỆU THI TÍN HIỆUHỆ THỐNG Kỹ thuật vi xử lý 100% (9) Giao trinh Kythuat Vixuly Kỹ thuật vi xử lý 100% (4) KTS2013 - Bài giảng 146 11 kỹ thuật số ptithcm Kỹ thuật vi xử lý 100% (3) Tiểu luận KTCT maclenin Kỹ thuật vi xử lý 100% (2) More from: Ngô Hải 166 Học viện Công nghệ… Discover more Cau-kien-dien-tu hoang-quang-huy… Hệ thống thông tin… None Bao cao th cau kien 34 13 11 dien tu 0734 Hệ thống thông tin… None Bao cao thi nghiem cau kien dien tu p3… Hệ thống thông tin… None Bao cao thi nghiem cau kien dien tu p2… Hệ thống thông tin… Recommended for you None 14 Toeic Upgrade Transcripts Xử lý hình ảnh 100% (3) 11 đề - Testing 89 19 information technology 100% (2) W1 Sample Test tieng anh Kỹ thuật vi xử lý 100% (1) information technology IT2019 information technology 100% (1)