Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 77 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
77
Dung lượng
1,03 MB
Nội dung
UỶ BAN NHÂN DÂN THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC SÀI GÒN BÁO CÁO TỔNG KẾT ĐỀ TÀI NGHIÊN CỨU KHOA HỌC SINH VIÊN CHẾTẠOMẠCHCOMẢODỰATRÊNMẠCHPHÁTTRIỂN STM32F4-DISCOVERY Mã số đề tài: SV2015-29 Thuộc nhóm ngành khoa học: ĐIỆN TỬ - VIỄN THÔNG Chủ nhiệm đề tài: PHẠM NGỌC THẠCH Thành viên tham gia: PHÙNG CẨM PHÚ Giáo viên hướng dẫn: ThS NGUYỄN HỮU PHÚC Tp Hồ Chí Minh, Tháng Năm 2016 UỶ BAN NHÂN DÂN THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC SÀI GÒN BÁO CÁO TỔNG KẾT ĐỀ TÀI NGHIÊN CỨU KHOA HỌC SINH VIÊN CHẾTẠOMẠCHCOMẢODỰATRÊNMẠCHPHÁTTRIỂN STM32F4-DISCOVERY Mã số đề tài: SV2015-29 Xác nhận Khoa Giáo viên hướng dẫn Chủ nhiệm đề tài (ký, họ tên) (ký, họ tên) (ký, họ tên) Tp Hồ Chí Minh, Tháng Năm 2016 MỤC LỤC BẢN TÓM TẮT ĐỀ TÀI DANH MỤC BẢNG BIỂU DANH MỤC CÁC CHỮ VIẾT TẮT THÔNG TIN KẾT QUẢ NGHIÊN CỨU MỞ ĐẦU Lý chọn đề tài Nội dung bố cục đề tài Kết luận .7 CHƯƠNG 1: MÔ HÌNH HOẠT ĐỘNG CỦA MẠCHCOMẢO 1.1 Virtual Com Port (VCP) 1.2 Giao tiếp VCP (STM32F4) CP2102 1.3 Kết luận 10 CHƯƠNG 2: HỆ THỐNG MẠCHCOMẢO 11 2.1 Mạchpháttriển STM32F4-DISCOVERY 11 2.2 Mạch chuyển USB sang UART CP2102 Nạp Pro Mini .17 2.3 Cấu trúc cổng COM 18 2.4 Kết luận 18 CHƯƠNG 3: CÁC CÔNG NGHỆ HỖ TRỢ CHO VIỆC THIẾT LẬP HỆ THỐNG PHẦN MỀM MẠCHCOMẢO 19 3.1 Công nghệ NET (C#) 19 3.1.1 Cấu trúc NET FrameWork 19 3.1.2 Lập trình hệ thống mô mạchCOMảo 23 3.2 Bộ công cụ lập trình nhúng Keil C 24 3.3 Giao tiếp với khối truyền/thu không đồng đa (UART) 26 3.4 VCP (Virtual Com Port) 28 3.5 Kết luận 29 CHƯƠNG 4: KẾT QUẢ NGHIÊN CỨU 30 4.1 Nhận thiết bị 30 4.2 Truyền nhận liệu 33 4.3 Kết luận 38 CHƯƠNG 5: KẾT LUẬN VÀ KIẾN NGHỊ 39 5.1 Kết đạt 39 5.2 Kiến nghị .39 5.2.1 Áp dụng thực tế 39 5.2.2 Hướng pháttriển 40 TÀI LIỆU THAM KHẢO 41 PHỤ LỤC 42 BẢN TÓM TẮT ĐỀ TÀI CHẾTẠOMẠCHCOMẢODỰATRÊNMẠCHPHÁTTRIỂN STM32F4-DISCOVERY Mã số: SV2015-29 Vấn đề nghiên cứu Nghiên cứu vấn đề khoa học nội dung nghiên cứu, áp dụng kiến thức học vào thực tiễn, giúp cố kiến thức phục vụ cho trình pháttriển đề tài tốt nghiệp sau Mục đích nghiên cứu/mục tiêu nghiên cứu Thiết kế mạchCOMảo nối vào máy tính thông qua cổng USB, kết nối vào máy tính thiết bị đóng vai trò cổng COM giao tiếp với thiết bị có giao tiếp COM Nhiệm vụ/nội dung nghiên cứu/câu hỏi nghiên cứu Nghiên cứu tính thư viện board stm32f4-discovery để pháttriển chương trình COMảo Phương pháp nghiên cứu Nghiên cứu lý thuyết kết hợp thực tiễn gồm bước sau: a) Nghiên cứu dạng COMảo có thị trường b) Nghiên cứu chip ARM thông qua board pháttriển stm32f4-Discovery c) Nghiên cứu công cụ lập trình nhúng cho chip ARM chọn d) Thiết kế COMảo Kết nghiên cứu sản phẩm a) Mạchpháttriển stm32f4-Discovery b) Cơ chế hoạt động cổng COM c) Thiết kế mạchCOMảo d) Công cụ lập trình Keil C e) Công nghệ Net(C#) f) Chương trình COMảo nhúng vào chip ARM mạch stm32f4-Discovery g) Chương trình giao tiếp máy tính để minh họa giao tiếp COM h) Báo cáo đề tài DANH MỤC BẢNG BIỂU Bảng 2.1 Tổng hợp chân giao tiếp UART USART mạchSTM32F4DISCOVERY 12 Bảng 2.2 Cặp chân giao tiếp UART sử dụng đề tài 16 DANH MỤC CÁC CHỮ VIẾT TẮT Cụm từ đầy đủ Từ viết tắt VCP Virtual Com Port UART Universal Asynchronous Receiver/Transmitter USART Universal Synchronous/Asynchronous Receiver/Transmitter USB Universal Serial Bus CLR Common Language Runtime FCL Framework Class Library JIT Just-In-Time JVM Java Virtual Machine MSIL Microsoft Intermediate Language RTOS RealTime Operating Systems TCP Transmission Control Protocol THÔNG TIN KẾT QUẢ NGHIÊN CỨU Đề tài hệ thống mạchCOMảo thực công việc sau: Thiết kế hệ thống phần cứng mạchCOMảo gồm phần sau: o Mạchpháttriển stm32f4-Discovery o Cơ chế hoạt động cổng COM o Thiết kế mạchCOMảo Xây dựng hệ thống phần mềm mạchCOMảo gồm phần sau: o Công cụ lập trình Keil C Chương trình COMảo nhúng vào chip ARM mạchstm32f4Discovery Chương trình giao tiếp với thiết bị có giao tiếp COM thông qua chân UART mạch stm32f4-Discovery o Công cụ lập trình NET(C#) Chương trình giao tiếp máy tính để minh họa giao tiếp COM MỞ ĐẦU Lý chọn đề tài Cổng nối tiếp (Serial port) cổng thông dụng máy tính máy tính truyền thống dùng kết nối thiết bị ngoại vi với máy tính như: bàn phím, chuột điều khiển, modem, máy quét Cổng nối tiếp có tên gọi khác như: Cổng COM Ngày nay, tốc độ truyền liệu chậm so với cổng đời nên cổng nối tiếp dần bị loại bỏ chuẩn máy tính nay, chúng thay cổng có tốc độ nhanh như: USB, FireWire Cổng nối tiếp thường tích hợp sẵn máy tính cá nhân từ năm 1990 hệ thống máy tính cá nhân sử dụng CPU hệ thứ tư Chúng thường tích hợp sẵn bo mạch chủ thông qua chip Super I/O (thay cho chíp UART trước đây) để thuận tiện mà không cần sử dụng bo mạch riêng cho chúng Tuy nhiên, (ngay đầu nói) ngày chúng dần biến khỏi hệ thống máy tính cá nhân Ngày nhiều máy tính cá nhân nói chung máy tính xách tay nói riêng không trang bị cổng nối tiếp nữa, đa số bo mạch chủ trung cao cấp dần loại bỏ cổng nối tiếp khiến cho số người sử dụng gặp khó khăn sử dụng thiết bị cũ, truyền dẫn liệu giao tiếp thông tin (chẳng hạn modem quay số) Trong vòng 20 năm qua, tiến vượt bậc khoa học công nghệ mang đến nhiều tiện ích, dịch vụ cho người dùng toàn giới, có Việt Nam, với chiến lược pháttriển công nghệ tiên tiến nhất, nhằm mục đích tắt, đón đầu, tạo tảng công nghệ cho ngành lĩnh vực khác pháttriển bền vững Với tiện ích ngày phong phú, cộng với giá ngày trở nên rẻ cạnh tranh hơn, tốc độ truyền liệu ngày nhanh Chính cổng COM không tích hợp máy tính ngày nay, mà thay vào máy tính tích hợp cổng USB USB (Universal Serial Bus) chuẩn kết nối đa dụng máy tính USB sử dụng để kết nối thiết bị ngoại vi với máy tính, chúng thường thiết kế dạng đầu cắm cho thiết bị tuân theo chuẩn cắm chạy mà với tính cắm nóng thiết bị (nối ngắt thiết bị không cần phải khởi động lại hệ thống) USB có đặc trưng sau đây: Cho phép mở rộng 127 thiết bị kết nối vào máy tính thông qua cổng USB (bao gồm hub USB) Những sợi cáp USB riêng lẻ dài tới mét, với hub, kéo dài tới 30 mét (6 sợi cáp nối tiếp thông qua hub) tính từ đầu cắm máy tính Với USB 2.0 chuẩn tốc độ cao, đường truyền đạt tốc độ tối đa đến 480 Mbps Cáp USB gồm hai sợi nguồn (+5V dây chung GND) cặp gồm hai sợi dây xoắn để mang liệu Trên sợi nguồn, máy tính cấp nguồn lên tới 500mA điện áp 5V chiều (DC) Những thiết bị tiêu thụ công suất thấp (ví dụ: chuột, bàn phím, loa máy tính công suất thấp ) cung cấp điện cho hoạt động trực tiếp từ cổng USB mà không cần có cung cấp nguồn riêng (thậm chí thiết bị giải trí số SmartPhone, PocketPC ngày sử dụng cổng USB để sạc pin) Với thiết bị cần sử dụng nguồn công suất lớn (như máy in, máy quét ) không sử dụng nguồn điện từ đường truyền USB nguồn chúng, lúc đường truyền nguồn có tác dụng so sánh mức điện tín hiệu Hub có nguồn cấp điện riêng để cấp điện thêm cho thiết bị sử dụng giao tiếp USB cắm vào cổng USB cung cấp công suất định Những thiết bị USB có đặc tính cắm nóng, điều có nghĩa thiết bị kết nối (cắm vào) ngắt kết nối (rút ra) thời điểm mà người sử dụng cần mà không cần phải khởi động lại hệ thống Chờ khoảng thời gian xác định (Wait for Time Delay) int counter0; int counter1; task void job0 (void) { os_tsk_create (job1, 1); // start job while (1) { counter0++; // Increment counter os_dly_wait (3); // Wait timer ticks } } task void job1 (void) { while (1) { counter1++; // Increment counter os_dly_wait (5); // Wait timer ticks } } Chờ biến cố (Wait for Event Flags) long i0, save_i0, i1; OS_TID id1; // task ID for event transmits task void job0 (void) { id1 = os_tsk_create (job1, 1); // start job while (1) { i0++; if (i0 > 1000000) { // when i1 reaches 1000000 i0 = 0; // clear i1 os_evt_set (1, id1); // set event '1' on job1 } } task void job1 (void) { while (1) { 59 os_evt_wait_or (1, 0xffff); // wait for event '1' save_i0 = i0; // save value of i0 i1; // count events in i1 } } Code minh họa khởi tạo cấu hình cho UART void Init(void) { GPIO_InitTypeDef gpioInit; USART_InitTypeDef usartInit; NVIC_InitTypeDef nvicInit; //dau tien cho phep xung clock cap toi GPIOD RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); //khoi tao GPIOD gpioInit.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; gpioInit.GPIO_Mode=GPIO_Mode_OUT; gpioInit.GPIO_Speed=GPIO_Speed_100MHz; gpioInit.GPIO_OType=GPIO_OType_PP; gpioInit.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &gpioInit); //cau hinh ngat //den phan cau hinh cho EUART //su dung cong COM //du tinh su dung cong COM //dau tien cho phep clock toi cong RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE); 60 //cho phep clock toi chan Rx Tx //khoi dong chan PC10, PC11 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); //cau hinh chan Rx Tx gpioInit.GPIO_Mode=GPIO_Mode_AF; gpioInit.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11; gpioInit.GPIO_Speed=GPIO_Speed_100MHz; gpioInit.GPIO_OType=GPIO_OType_PP; gpioInit.GPIO_PuPd=GPIO_PuPd_UP; GPIO_Init(GPIOC, &gpioInit); //gan chan Rx Tx GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_UART4); GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_UART4); //cau hinh cho USART4 usartInit.USART_BaudRate=230400;//256000; usartInit.USART_HardwareFlowControl=USART_HardwareFlowControl_None; usartInit.USART_Mode=USART_Mode_Tx|USART_Mode_Rx; usartInit.USART_Parity=USART_Parity_No; usartInit.USART_StopBits=USART_StopBits_1; usartInit.USART_WordLength=USART_WordLength_8b; USART_Init(UART4, &usartInit); //cho phep ngat nhan USART_ITConfig(UART4, USART_IT_RXNE, ENABLE); //cau hinh NVIC nvicInit.NVIC_IRQChannel=UART4_IRQn; 61 nvicInit.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&nvicInit); //cho phep UART4 hoat dong USART_Cmd(UART4, ENABLE); } Code thiết lập cho phép xung clock cấp vào GPIOD void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { RCC->AHB1ENR |= RCC_AHB1Periph; } else { RCC->AHB1ENR &= ~RCC_AHB1Periph; } } Code thiết lập để khởi tạo chân cho GPIO void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) { uint32_t pinpos = 0x00, pos = 0x00 , currentpin = 0x00; /* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); 62 assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin)); assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode)); assert_param(IS_GPIO_PUPD(GPIO_InitStruct->GPIO_PuPd)); /* - Configure the port pins */ /* GPIO Mode Configuration */ for (pinpos = 0x00; pinpos < 0x10; pinpos++) { pos = ((uint32_t)0x01) GPIO_Pin) & pos; if (currentpin == pos) { GPIOx->MODER &= ~(GPIO_MODER_MODER0 MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct>GPIO_Mode == GPIO_Mode_AF)) { /* Check Speed mode parameters */ assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed)); /* Speed mode configuration */ GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) GPIO_OType)); /* Output mode configuration*/ GPIOx->OTYPER &= ~((GPIO_OTYPER_OT_0) OTYPER |= (uint16_t)(((uint16_t)GPIO_InitStruct->GPIO_OType) PUPDR &= ~(GPIO_PUPDR_PUPDR0 PUPDR |= (((uint32_t)GPIO_InitStruct->GPIO_PuPd) > 0x03] &= ~((uint32_t)0xF AFR[GPIO_PinSource >> 0x03] | temp; GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2; } Code thiết lập cho phép gán cấu hình cho UART void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct) { uint32_t tmpreg = 0x00, apbclock = 0x00; uint32_t integerdivider = 0x00; uint32_t fractionaldivider = 0x00; RCC_ClocksTypeDef RCC_ClocksStatus; /* Check the parameters */ assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_USART_BAUDRATE(USART_InitStruct->USART_BaudRate)); assert_param(IS_USART_WORD_LENGTH(USART_InitStruct>USART_WordLength)); assert_param(IS_USART_STOPBITS(USART_InitStruct->USART_StopBits)); assert_param(IS_USART_PARITY(USART_InitStruct->USART_Parity)); assert_param(IS_USART_MODE(USART_InitStruct->USART_Mode)); assert_param(IS_USART_HARDWARE_FLOW_CONTROL(USART_InitStruct>USART_HardwareFlowControl)); /* The hardware flow control is available only for USART1, USART2, USART3 and USART6 */ if (USART_InitStruct->USART_HardwareFlowControl != USART_HardwareFlowControl_None) { 65 assert_param(IS_USART_1236_PERIPH(USARTx)); } /* USART CR2 Configuration -*/ tmpreg = USARTx->CR2; /* Clear STOP[13:12] bits */ tmpreg &= (uint32_t)~((uint32_t)USART_CR2_STOP); /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit : Set STOP[13:12] bits according to USART_StopBits value */ tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits; /* Write to USART CR2 */ USARTx->CR2 = (uint16_t)tmpreg; /* USART CR1 Configuration -*/ tmpreg = USARTx->CR1; /* Clear M, PCE, PS, TE and RE bits */ tmpreg &= (uint32_t)~((uint32_t)CR1_CLEAR_MASK); /* Configure the USART Word Length, Parity and mode: Set the M bits according to USART_WordLength value Set PCE and PS bits according to USART_Parity value Set TE and RE bits according to USART_Mode value */ tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct>USART_Parity | USART_InitStruct->USART_Mode; /* Write to USART CR1 */ 66 USARTx->CR1 = (uint16_t)tmpreg; /* USART CR3 Configuration -*/ tmpreg = USARTx->CR3; /* Clear CTSE and RTSE bits */ tmpreg &= (uint32_t)~((uint32_t)CR3_CLEAR_MASK); /* Configure the USART HFC : Set CTSE and RTSE bits according to USART_HardwareFlowControl value */ tmpreg |= USART_InitStruct->USART_HardwareFlowControl; /* Write to USART CR3 */ USARTx->CR3 = (uint16_t)tmpreg; /* USART BRR Configuration -*/ /* Configure the USART Baud Rate */ RCC_GetClocksFreq(&RCC_ClocksStatus); if ((USARTx == USART1) || (USARTx == USART6)) { apbclock = RCC_ClocksStatus.PCLK2_Frequency; } else { apbclock = RCC_ClocksStatus.PCLK1_Frequency; } /* Determine the integer part */ if ((USARTx->CR1 & USART_CR1_OVER8) != 0) 67 { /* Integer part computing in case Oversampling mode is Samples */ integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate))); } else /* if ((USARTx->CR1 & USART_CR1_OVER8) == 0) */ { /* Integer part computing in case Oversampling mode is 16 Samples */ integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate))); } tmpreg = (integerdivider / 100) > 4)); /* Implement the fractional part in the register */ if ((USARTx->CR1 & USART_CR1_OVER8) != 0) { tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07); } else /* if ((USARTx->CR1 & USART_CR1_OVER8) == 0) */ { tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F); } /* Write to USART BRR register */ USARTx->BRR = (uint16_t)tmpreg; } Code thiết lập cho phép nhận ngắt UART void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState) 68 { uint32_t usartreg = 0x00, itpos = 0x00, itmask = 0x00; uint32_t usartxbase = 0x00; /* Check the parameters */ assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_USART_CONFIG_IT(USART_IT)); assert_param(IS_FUNCTIONAL_STATE(NewState)); /* The CTS interrupt is not available for UART4 and UART5 */ if (USART_IT == USART_IT_CTS) { assert_param(IS_USART_1236_PERIPH(USARTx)); } usartxbase = (uint32_t)USARTx; /* Get the USART register index */ usartreg = (((uint8_t)USART_IT) >> 0x05); /* Get the interrupt position */ itpos = USART_IT & IT_MASK; itmask = (((uint32_t)0x01) NVIC_IRQChannelCmd)); assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct>NVIC_IRQChannelPreemptionPriority)); assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct>NVIC_IRQChannelSubPriority)); if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE) { /* Compute the Corresponding IRQ Priority */ 70 tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08; tmppre = (0x4 - tmppriority); tmpsub = tmpsub >> tmppriority; tmppriority = NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority NVIC_IRQChannelSubPriority & tmpsub); tmppriority = tmppriority IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority; /* Enable the Selected IRQ Channels */ NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = (uint32_t)0x01 NVIC_IRQChannel & (uint8_t)0x1F); } else { /* Disable the Selected IRQ Channels -*/ NVIC->ICER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] = (uint32_t)0x01 NVIC_IRQChannel & (uint8_t)0x1F); } } Code thiết lập cho phép UART hoạt động void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState) { /* Check the parameters */ assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_FUNCTIONAL_STATE(NewState)); 71 if (NewState != DISABLE) { /* Enable the selected USART by setting the UE bit in the CR1 register */ USARTx->CR1 |= USART_CR1_UE; } else { /* Disable the selected USART by clearing the UE bit in the CR1 register */ USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_UE); } } Code minh họa cho việc nhúng chương trình VirtualCOM vào mạchpháttriển STM32F4-DISCOVERY int main(void) { uint8_t c; /* System Init */ SystemInit(); /* Initialize LED's Make sure to check settings for your board in tm_stm32f4_disco.h file */ TM_DISCO_LedInit(); /* Initialize USB VCP */ TM_USB_VCP_Init(); while (1) { /* USB configured OK, drivers OK */ if (TM_USB_VCP_GetStatus() == TM_USB_VCP_CONNECTED) { } 72 } } Code nhận trạng thái COMảo từ USB TM_USB_VCP_Result TM_USB_VCP_GetStatus(void) { if (TM_USB_VCP_INT_Init) { return TM_USB_VCP_INT_Status; } return TM_USB_VCP_ERROR; } 73 ... hệ thống mạch COM ảo thực công việc sau: Thiết kế hệ thống phần cứng mạch COM ảo gồm phần sau: o Mạch phát triển stm32f4-Discovery o Cơ chế hoạt động cổng COM o Thiết kế mạch COM ảo Xây dựng... 39 5.2.2 Hướng phát triển 40 TÀI LIỆU THAM KHẢO 41 PHỤ LỤC 42 BẢN TÓM TẮT ĐỀ TÀI CHẾ TẠO MẠCH COM ẢO DỰA TRÊN MẠCH PHÁT TRIỂN STM32F4-DISCOVERY Mã... phẩm a) Mạch phát triển stm32f4-Discovery b) Cơ chế hoạt động cổng COM c) Thiết kế mạch COM ảo d) Công cụ lập trình Keil C e) Công nghệ Net(C#) f) Chương trình COM ảo nhúng vào chip ARM mạch stm32f4-Discovery