STM32 내장부트로더 (GUI 설계)

김상훈·2022년 11월 7일
0

출처 : 땜스 전자연구소

이 프로젝트에서 가장 어려운 점은 데이터를 갈무리 하며 serial로 write 하는 것이라고 생각한다.

그 외에 것들은 UART통신 프로토콜을 이해한 후에 명령어들의 송수신을 파악하면 되지만 데이터를 갈무리 하기 위해서는 문자열로 된 HEX파일을 16진수의 바이트 형식으로 바꿔주는 작업이 필요하다.

 While Not String_All_Text_HexFile.EndOfStream()

            String_Read_Line = String_All_Text_HexFile.ReadLine()

            If (Mid(String_Read_Line, 8, 2) <> "00") Then
                Exit While
            End If


            String_Relative_Address = String_Base_Start_Address + Mid(String_Read_Line, 4, 4)

            For q = 1 To 7 Step 2
                Arr_Base_Address(Count, (q - 1) / 2) = CByte(Convert.ToInt16(Mid(String_Relative_Address, q, 2), 16))
            Next
            Arr_Base_Address(Count, 4) = Arr_Base_Address(Count, 0) Xor Arr_Base_Address(Count, 1) Xor Arr_Base_Address(Count, 2) Xor Arr_Base_Address(Count, 3)



            String_Data_Count = Mid(String_Read_Line, 2, 2)
            Val_Data_Count_Byte(Count) = CByte(Convert.ToInt16(String_Data_Count, 16))
            String_Data(Count) = Mid(String_Read_Line, 10, Val_Data_Count_Byte(Count) * 2)
            For j = 1 To (Val_Data_Count_Byte(Count) * 2) - 1 Step 2
                String_Data_Read = Mid(String_Data(Count), j, 2)
                Arr_Data_Read(Count, (j - 1) / 2) = CByte(Convert.ToInt16(String_Data_Read, 16))
            Next

            Val_CheckSum = 0

            For j = 1 To (Val_Data_Count_Byte(Count) * 2) - 1 Step 2

                Val_CheckSum = Val_CheckSum Xor Arr_Data_Read(Count, (j - 1) / 2)
            Next
            Arr_Data_Read(Count, Val_Data_Count_Byte(Count)) = Val_CheckSum Xor (Val_Data_Count_Byte(Count) - 1)

            Count = Count + 1

        End While

이 코드는 문자열 hex 파일을 16진수 바이트 형식으로 바꿔주는 작업이다.

차근차근 위에서부터 분석해보면 While문은 HEX파일 내부의 TEXT의 마지막줄까지 읽겠다는 뜻이다.
그리고 이 내부에 String_Read_Line이라고 내가 선언해준 변수는 TEXT를 한줄 씩 읽어오겠다는 뜻이다.

그리고 그 아래 if문은 시리얼로 데이터를 읽을 때 실제 데이터 부분만 읽어야 하는데 실제 데이터 부분이 가지는 특징은 8번째 2글자가 "00"을 가지는 특징이 있다. 따라서 8번째 2글자가 "00"이 아닌 데이터가 마지막 부분에 있는데 그 부분을 만나면 while문을 벗어나도록 해주었다.

String_Relative_Address는 메모리기록주소를 뜻한다.
String_Base_Start_Address는 Mid(String_All_Text_HexFile.ReadLine(), 10, 4)
로 선언해주었는데 저 의미는 제일 첫줄의 0800을 가리킨다.

그 다음의 For문은 읽어온 메모리 주소가 문자열로 08000000 이런식으로 돼있으므로 2글자씩 짤라서 (08, 00 ,00 ,00) 2글자당 1바이트 16진수로 변환해주는 작업을 취하고 메모리주소 데이터를 보낼 때 XOR해준 값도 보내주어야 하므로 XOR작업도 미리 해주었다.

그 아래 String_Data_Count는 데이터 개수를 의미하는데 HEX파일의 :옆에 즉, 2번째 글자에 있다. 그 글자를 2개 읽어오는 작업이다.

예를들어 10이면 16진수로 변환하면 16바이트 데이터를 가지고 있다는 뜻이고 2글자가 1바이트로 볼 수 있으므로 문자열로 따지면 32개의 문자가 옆에 나열되어 있다.

따라서 데이터 개수를 의미하는 두 글자를 16진수 바이트형식으로 변환해주는 작업을 아래에 하였다.

또한 데이터들과 데이터의 개수 모두 XOR한 것이 체크섬이기 때문에 아래에 Checksum을 모두 계산해주는 작업을 해주었다.

데이터 갈무리 하는데 며칠이 걸렸지만 재밌었다.

출처: https://m.blog.naver.com/ansdbtls4067/221515104202

   
profile
처음 접하는 소프트웨어

0개의 댓글