Nghiên cứu và đề xuất thư viện cập nhật chương trình từ xa cho các thiết bị nhúng kết nối internet

102 4 0
Nghiên cứu và đề xuất thư viện cập nhật chương trình từ xa cho các thiết bị nhúng kết nối internet

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ĐẠI HỌC ĐÀ NẴNG TRƢỜNG ĐẠI HỌC BÁCH KHOA -  - C C R L T NGUYỄN HUỲNH NHẬT THƢƠNG U D NGHIÊN CỨU VÀ ĐỀ XUẤT THƢ VIỆN CẬP NHẬT CHƢƠNG TRÌNH TỪ XA CHO CÁC THIẾT BỊ NHÚNG KẾT NỐI INTERNET LUẬN VĂN THẠC SĨ CHUYÊN NGÀNH: KỸ THUẬT ĐIỆN TỬ ĐẠI HỌC ĐÀ NẴNG TRƢỜNG ĐẠI HỌC BÁCH KHOA - NGUYỄN HUỲNH NHẬT THƢƠNG NGHIÊN CỨU VÀ ĐỀ XUẤT THƢ VIỆN CẬP NHẬT CHƢƠNG TRÌNH TỪ XA CHO CÁC THIẾT BỊ NHÚNG KẾT NỐI INTERNET C C R L T Chuyên ngành : Kỹ thuật điện tử Mã số: 8520203 U D LUẬN VĂN THẠC SĨ NGƢỜI HƢỚNG DẪN KHOA HỌC: TS Võ Tuấn Minh TS Nguyễn Duy Nhật Viễn Đà Nẵng – Năm 2020 C C DU R L T ii MỤC LỤC Lời cam đoan i MỤC LỤC ii MỞ ĐẦU 1 Tính cấp thiết đề tài Mục đích nghiên cứu Đối tượng phạm vi nghiên cứu Phương pháp nghiên cứu Ý nghĩa khoa học thực tiễn đề tài Cấu trúc luận văn Chương 1: Tổng quan cập nhật chương trình từ xa C C 1.1 Giới thiệu chương R L T 1.2 Ứng dụng cập nhật chương trình từ xa 1.3 Mơ hình cập nhật chương trình từ xa U D 1.3.1 Thiết bị nhúng 1.3.2 Chương trình chạy thiết bị nhúng 1.3.3 Máy chủ quản lý tập tin chương trình 1.3.4 Quá trình cập nhật chương trình từ xa 1.4 Kết luận chương Chương 2: Nền tảng phần cứng cập nhật chương trình từ xa 2.1 Giới thiệu chương 2.2 Tổng quan phần cứng 2.3 Tổ chức nhớ vi điều khiển cấu trúc chương trình 11 2.3.1 Tổ chức nhớ chương trình 12 2.3.2 Tổ chức nhớ liệu 14 2.3.3 Cấu trúc tập tin chương trình 15 2.3.4 Cấu trúc chương trình nhớ 18 2.4 Bộ xử lý trung tâm ARM Cortex – M 22 2.5 Quá trình khởi động vi điều khiển 23 2.6 Module truyền nhận liệu 4G 24 2.7 Kết luận chương 25 iii Chương 3: Đề xuất phương pháp xây dựng thư viện cập nhật chương trình từ xa 27 3.1 Giới thiệu chương 27 3.2 Phương pháp cập nhật chương trình từ xa 27 3.3 Thuật toán nhận, kiểm tra lỗi tập tin chương trình 29 3.3.1 Thuật toán kết nối thiết bị với máy chủ 29 3.3.2 Thuật toán tải tập tin 33 3.3.3 Thuật toán kiểm tra lỗi tập tin 37 3.3.4 Thuật toán ghi tập tin vào nhớ 41 3.3.5 Thuật toán khởi động lại vi điều khiển 42 3.4 Kết luận chương 50 Chương 4: Kết thực đánh giá 51 C C 4.1 Giới thiệu chương 51 R L T 4.2 Kết thực 51 4.3 Đánh giá hiệu 54 U D 4.3.1 Về chiếm dụng tài nguyên nhớ 54 4.3.2 Về độ tin cậy, tỉ lệ cập nhật thành công 55 4.3.3 Thời gian cập nhật chương trình 56 4.4 Kết luận chương 67 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN CỦA ĐỀ TÀI TÀI LIỆU THAM KHẢO PHỤ LỤC iv NGHIÊN CỨU VÀ ĐỀ XUẤT THƢ VIỆN CẬP NHẬT CHƢƠNG TRÌNH TỪ XA CHO CÁC THIẾT BỊ NHÚNG KẾT NỐI INTERNET Học viên: Nguyễn Huỳnh Nhật Thương Chuyên ngành: Kỹ thuật điện tử Mã số:8520203 Khóa: K38.KĐT Trường Đại học Bách khoa – ĐHĐN Tóm tắt – Cùng với phát triển không ngừng công nghệ đặc biệt xu vạn vận kết nối Internet, ngày nhiều thiết bị nhúng kết nối vào Internet sử dụng khắp nơi giới nhiều lĩnh vực khác Dưới áp lực phát triển, thiết bị sau đưa vào sử dụng phát lỗi hay cần nâng cấp thêm để bổ sung, tối ưu tính Trong đó, nhiều thiết bị lắp đặt sử dụng nơi mà người hay đội ngũ kỹ thuật khó tiếp cận được, điều dẫn đến khó khăn q trình thay đổi chương trình chạy thiết bị Trong đề tài nghiên cứu yếu tố kỹ thuật liên quan đến trình cập nhật từ xa cho thiết bị nhúng Từ đó, đề xuất phương pháp cập nhật chương trình từ xa, xây dựng thử nghiệm đánh giá thư viện chương trình cập nhật từ xa mơ hình cụ thể Thư viện phương pháp đề xuất có độ tin cậy cao, chiếm dụng nhớ thời gian thực cập nhật chương trình nhanh Cấu trúc thư viện thiết kế cho phép dễ dàng kế thừa, áp dụng cho nhiều hệ thống nhúng có kết nối Internet thiết kế dựa tảng vi xử lý ARM Cortex –M để thực việc cập nhật chương trình nhằm vá lỗi, nâng cấp, tối ưu tính hệ thống từ xa, thời gian ngắn mà không cần can thiệp trực tiếp vào thiết bị C C R L T Từ khóa – cập nhật chương trình từ xa; thiết bị nhúng; vạn vật kết nối Internet; vi xử lý ARM Cortex - M; vi điều khiển STM32 U D A STUDY AND PROPOSAL OF OVER-THE-AIR FIRMWARE UPDATE LIBRARY FOR INTERNET-CONNECTED EMBEDDED DEVICES Abstract - With the continuous development of technologies and especially the trend of Internet of Things, more and more Internet-connected embedded devices are being used all over the world in many different use cases Development teams are always under pressure to deliver faster, however, after being put into use, devices are found to have errors or need to be upgraded to add and optimize features In fact, many embedded systems are deployed in places that are difficult for human operators or technical staff to access, which leads to difficulties in the process of changing programs running on the device In this thesis, technical factors related to the remote update process for embedded devices are studied From there, proposing the method of updating the program remotely, checking and evaluating the remote update program on specific model The proposed library and method are highly reliable, consume less memory usage, and have fast program update execution times Designed library structure allows easy inheritance, applicable to many Internet-connected embedded systems designed on ARM Cortex –M platform in order to update the program remotely to patch, upgrade and optimize the features in a short time without intervention directly to the device Keywords – Firmware over the air; Embedded device; Internet of things; ARM Cortex –M Processor; STM32 Microcontroller v Danh mục kí hiệu chữ viết tắt OTA Over The Air FOTA Firmware Over The Air DNS Domain Name System FTP File Transfer Protocol TCP/IP Transmission Control Protocol RSSI Received Signal Strength Indicator CPU Central Processing Unit RTC Real time clock LCD Liquid Crystal Display USB Universal Serial Bus UART Universal Asynchronous Receiver Transmitter ADC Analog-to-digital Converter SRAM Static Ramdom-Access Memory RAM Ramdom-Access Memory NVIC Nested Vector Interrupt Control CRC Cyclic Redundancy Check SP Stack Pointer PSP Processor Stack Pointer MSP Main Stack Pointer PC Program Counter VTOR Vector Table Offset Register UMTS Universal Mobile Telecommunication System HSPA High Speed Packet Access C C R L T U D vi USB Universal Serial Bus LED Light Emitting Diode GSM Symbol Stock Images GPRS General Packet Radio Service PCIe Peripheral Component Interconnect Express HAL Hardware Abstraction Layer C C U D R L T vii Danh mục bảng Bảng 3.1 Mô tả tập tin thư viện Bảng 3.2 Danh sách hàm thư viện cập nhập chương trình từ xa Bảng 4.1 Các phân vùng nhớ Flash Bảng 4.2 Tỉ lệ thử nghiệm cập nhập chương trình từ xa thành cơng Bảng 4.3 Kích cỡ tập tin định dạng HEX tập tin định dạng BIN chương trình ứng dụng Bảng 4.4 Kết thời gian thực OTA với tập tin định dạng HEX định dạng BIN C C U D R L T viii Danh mục hình Hình 1.1 Sơ đồ khối tổng quát thiết bị nhúng có kết nối Internet Hình 1.2 Quá trình tạo tập tin chương trình ứng dụng Hình 1.3 Quá trình cập nhập chương trình từ xa Hình 2.1 Sơ đồ khối phần cứng thử nghiệm Hình 2.2 Sơ đồ khối vi điều khiển STM32F411 Hình 2.3 Sơ đồ khối nguyên lý LCD, USB-UART, LEDs Buttons Hình 2.4 Bản đồ nhớ Vi xử lý ARM Cortex M4 Hình 2.5 Vùng nhớ chương trình Hình 2.6 Tổng quan tổ chức nhớ chương trình Hình 2.7 Tổ chức nhớ liệu Hình 2.8 Ví dụ nội dung cấu trúc tập tin HEX Hình 2.9 Ví dụ nội dung cấu trúc tập tin BIN Hình 2.10 Cấu trúc chương trình nhớ Hình 2.11 Cấu trúc chương trình nhớ thêm tính OTA – C1A Hình 2.12 Cấu trúc chương trình nhớ thêm tính OTA – C1B Hình 2.13 Cấu trúc chương trình nhớ thêm tính OTA – C2A Hình 2.14 Q trình hoạt động tương ứng với bố trí nhớ C2A Hình 2.15 Cấu trúc chương trình nhớ thêm tính OTA – C2B Hình 2.16 Các ghi Vi xử lý ARM Cortex - M4 Hình 2.17 Cấu trúc chương trình nhớ vi điều khiển Hình 2.18 Quectel EC21 vad Quectel EC21 PCIe Mini card Hình 2.19 Sơ đồ nguyên lý Module Quectel EC21 Hình 3.1 Phương pháp phân vùng nhớ trình hoạt động chọn Hình 3.2 Giản đồ quy trình kiểm tra hoạt động module Internet Hình 3.3 Giản đồ quy trình cấu hình thơng số kết nối Internet Hình 3.4 Giản đồ quy trình cấu hình thông số giao thức FTP C C R L T U D 76 CHƯƠNG TRÌNH OTA #include "main.h" #include "fota_stm32.h" CRC_HandleTypeDef hcrc; IWDG_HandleTypeDef hiwdg; UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; extern uint8_t Sim_Rxbyte[1]; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_CRC_Init(void); static void MX_IWDG_Init(void); static void MX_USART1_UART_Init(void); static void MX_USART2_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); #ifdef _BINTYPE_ MX_CRC_Init(); #endif #ifdef _IWDG_ MX_IWDG_Init(); #endif MX_USART1_UART_Init(); MX_USART2_UART_Init(); #ifdef _IWDG_ HAL_IWDG_Refresh(&hiwdg); #endif HAL_UART_Receive_IT(&SIM_UART, Sim_Rxbyte, 1); OTA_startProcess(); while(1) { } } C C R L T U D void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; HAL_RCC_PWR_CLK_ENABLE(); HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { 77 Error_Handler(); } } static void MX_CRC_Init(void) { hcrc.Instance = CRC; if (HAL_CRC_Init(&hcrc) != HAL_OK) { Error_Handler(); } } static void MX_IWDG_Init(void) { hiwdg.Instance = IWDG; hiwdg.Init.Prescaler = IWDG_PRESCALER_256; hiwdg.Init.Reload = 4095; if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { Error_Handler(); } } static void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } static void MX_USART2_UART_Init(void) R L T C C U D { huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { /* GPIO Ports Clock Enable */ HAL_RCC_GPIOH_CLK_ENABLE(); HAL_RCC_GPIOA_CLK_ENABLE(); } 78 CHƯƠNG TRÌNH APPLICATION #include "main.h" #include "fota_stm32.h" #define RTC_ALARM //minute IWDG_HandleTypeDef hiwdg; RTC_HandleTypeDef hrtc; UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; RTC_TimeTypeDef time = {0}; RTC_DateTypeDef date = {0}; RTC_AlarmTypeDef alarmtime = {0}; uint32_t currentTick = 0; volatile bool isTimeToCheckVersion = false; extern uint8_t Sim_Rxbyte[1]; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_RTC_Init(void); static void MX_USART1_UART_Init(void); static void MX_USART2_UART_Init(void); static void MX_IWDG_Init(void); bool User_InitAlarm(uint8_t hours, uint8_t minutes, uint8_t seconds); void blinkLED(uint32_t ms); void refreshIWDG(uint16_t ms); //second must be less than 20000 (20s) C C R L T void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) { HAL_RTC_GetTime(hrtc, &time, RTC_FORMAT_BIN); HAL_RTC_GetDate(hrtc, &date, RTC_FORMAT_BIN); HAL_RTC_SetTime(hrtc, &time, RTC_FORMAT_BIN); User_InitAlarm(time.Hours, time.Minutes, time.Seconds); isTimeToCheckVersion = true; } U D int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_RTC_Init(); MX_USART1_UART_Init(); MX_USART2_UART_Init(); #ifdef _IWDG_ MX_IWDG_Init(); #endif HAL_UART_Receive_IT(&SIM_UART, Sim_Rxbyte, 1); APPF_sendDeviceStatusToServer(); currentTick = HAL_GetTick(); //write your code here while (1) { //write your code here if(isTimeToCheckVersion == true) { APPF_handleUpdatingRequest(); isTimeToCheckVersion = false; } APPF_resetFailtimeInFlash(); refreshIWDG(5000); 79 } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; /** Configure the main internal regulator output voltage */ HAL_RCC_PWR_CLK_ENABLE(); HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } } C C R L T U D static void MX_IWDG_Init(void) { hiwdg.Instance = IWDG; hiwdg.Init.Prescaler = IWDG_PRESCALER_256; hiwdg.Init.Reload = 4095; if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { Error_Handler(); } } static void MX_RTC_Init(void) { RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; RTC_AlarmTypeDef sAlarm = {0}; /** Initialize RTC Only */ hrtc.Instance = RTC; hrtc.Init.HourFormat = RTC_HOURFORMAT_24; 80 hrtc.Init.AsynchPrediv = 127; hrtc.Init.SynchPrediv = 255; hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; if (HAL_RTC_Init(&hrtc) != HAL_OK) { Error_Handler(); } /** Initialize RTC and set the Time and Date */ sTime.Hours = 8; sTime.Minutes = 0; sTime.Seconds = 0; sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sTime.StoreOperation = RTC_STOREOPERATION_RESET; if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } sDate.WeekDay = RTC_WEEKDAY_MONDAY; sDate.Month = RTC_MONTH_JANUARY; sDate.Date = 10; sDate.Year = 20; if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } /** Enable the Alarm A */ sAlarm.AlarmTime.Hours = 8; sAlarm.AlarmTime.Minutes = 2; sAlarm.AlarmTime.Seconds = 0; sAlarm.AlarmTime.SubSeconds = 0; sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET; sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY; sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL; sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; sAlarm.AlarmDateWeekDay = 1; sAlarm.Alarm = RTC_ALARM_A; if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } C C R L T U D } static void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } C C DU R L T C C DU R L T C C DU R L T C C DU R L T C C DU R L T C C DU R L T C C DU R L T C C DU R L T C C DU R L T C C DU R L T ... quan đến trình cập nhật từ xa cho thiết bị nhúng Từ đó, đề xuất phương pháp cập nhật chương trình từ xa, xây dựng thử nghiệm đánh giá thư viện chương trình cập nhật từ xa mơ hình cụ thể Thư viện. .. trình từ xa gồm thiết bị nhúng, chương trình chạy thiết bị nhúng, máy chủ quản lý tập tin chương trình trình cập nhật chương trình từ xa Chƣơng 2: NỀN TẢNG PHẦN CỨNG CẬP NHẬT CHƢƠNG TRÌNH TỪ XA Chương. .. ĐỀ XUẤT PHƢƠNG PHÁP VÀ XÂY DỰNG THƢ VIỆN CẬP NHẬT CHƢƠNG TRÌNH TỪ XA R L T Chương đề xuất phương pháp cập nhật chương trình từ xa, xây dựng thư viện cập nhật chương trình từ xa với thuật tốn nhận,

Ngày đăng: 29/04/2021, 15:38

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan