STM32 L432KC 부트로더 개발하기(1)
부트로더 개발을 위해 몇가지 기능들을 먼저 테스트 하고자 한다.
1. Flash Erase
2. Flash Write
3.UART Tx,Rx
정도...
우선 Flash 특정 영역을 지우기 위해, 현재 전체 Flash 사용중인 것을 수정해 본다.
STM32L432KCUX_FLASH.ld 파일의 Flash 영역 Length를 120K로 수정하였다.
main 코드에는 다음과 같은 코드를 작성하였다.
/* USER CODE BEGIN 2 */
HAL_FLASH_Unlock();
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.Page = 95; //0x0802F800
EraseInitStruct.Banks= FLASH_BANK_1;
EraseInitStruct.NbPages = 1;
if (HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError) != HAL_OK) {
}
uint64_t data[2] = {0xaaaaaaaabbbbbbbb,0xccccccccdddddddd};
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, ADDR_FLASH_PAGE_95, data[0]) == HAL_OK){
} else {
while (1) ;
}
HAL_FLASH_Lock();
/* USER CODE END 2 */
Erase 기능 확인하는데서 조금 오래 디버깅을 하게 되었는데, EraseInitStruct.Page = 95; //0x0802F800 에서 page 번호가 아닌 Flash 주소를 기입하는 바람에 계속 오류가 났던 것이다. 해당 구조체의 멤버가 pageaddress 로 되어있는 MCU의 경우에는 flash 주소를 적는게 맞지만, L432KC 의 경우에는 page 번호를 넣어줘야 한다.
HAL_FLASH_PROGRAM을 통해 flash 영역에 데이터가 들어간 것을 확인할 수 있었다. 64bit 기준으로 program 되는것이 특징인것 같다.
추가 내용: PAGE 관련
page는 256Kbyte Flash 기준 128개 존재한다. (1개 page당 2Kbyte)
Page | address |
0 | 0x08000000 |
1 | 0x08000800 |
2 | 0x08001000 |
3 | 0x08001800 |
4 | 0x08002000 |
5 | 0x08002800 |
6 | 0x08003000 |
7 | 0x08003800 |
8 | 0x08004000 |
9 | 0x08004800 |
10 | 0x08005000 |
11 | 0x08005800 |
12 | 0x08006000 |
13 | 0x08006800 |
14 | 0x08007000 |
15 | 0x08007800 |
16 | 0x08008000 |
17 | 0x08008800 |
18 | 0x08009000 |
19 | 0x08009800 |
20 | 0x0800A000 |
21 | 0x0800A800 |
22 | 0x0800B000 |
23 | 0x0800B800 |
24 | 0x0800C000 |
25 | 0x0800C800 |
26 | 0x0800D000 |
27 | 0x0800D800 |
28 | 0x0800E000 |
29 | 0x0800E800 |
30 | 0x0800F000 |
31 | 0x0800F800 |
32 | 0x08010000 |
33 | 0x08010800 |
34 | 0x08011000 |
35 | 0x08011800 |
36 | 0x08012000 |
37 | 0x08012800 |
38 | 0x08013000 |
39 | 0x08013800 |
40 | 0x08014000 |
41 | 0x08014800 |
42 | 0x08015000 |
43 | 0x08015800 |
44 | 0x08016000 |
45 | 0x08016800 |
46 | 0x08017000 |
47 | 0x08017800 |
48 | 0x08018000 |
49 | 0x08018800 |
50 | 0x08019000 |
51 | 0x08019800 |
52 | 0x0801A000 |
53 | 0x0801A800 |
54 | 0x0801B000 |
55 | 0x0801B800 |
56 | 0x0801C000 |
57 | 0x0801C800 |
58 | 0x0801D000 |
59 | 0x0801D800 |
60 | 0x0801E000 |
61 | 0x0801E800 |
62 | 0x0801F000 |
63 | 0x0801F800 |
64 | 0x08020000 |
65 | 0x08020800 |
66 | 0x08021000 |
67 | 0x08021800 |
68 | 0x08022000 |
69 | 0x08022800 |
70 | 0x08023000 |
71 | 0x08023800 |
72 | 0x08024000 |
73 | 0x08024800 |
74 | 0x08025000 |
75 | 0x08025800 |
76 | 0x08026000 |
77 | 0x08026800 |
78 | 0x08027000 |
79 | 0x08027800 |
80 | 0x08028000 |
81 | 0x08028800 |
82 | 0x08029000 |
83 | 0x08029800 |
84 | 0x0802A000 |
85 | 0x0802A800 |
86 | 0x0802B000 |
87 | 0x0802B800 |
88 | 0x0802C000 |
89 | 0x0802C800 |
90 | 0x0802D000 |
91 | 0x0802D800 |
92 | 0x0802E000 |
93 | 0x0802E800 |
94 | 0x0802F000 |
95 | 0x0802F800 |
96 | 0x08030000 |
97 | 0x08030800 |
98 | 0x08031000 |
99 | 0x08031800 |
100 | 0x08032000 |
101 | 0x08032800 |
102 | 0x08033000 |
103 | 0x08033800 |
104 | 0x08034000 |
105 | 0x08034800 |
106 | 0x08035000 |
107 | 0x08035800 |
108 | 0x08036000 |
109 | 0x08036800 |
110 | 0x08037000 |
111 | 0x08037800 |
112 | 0x08038000 |
113 | 0x08038800 |
114 | 0x08039000 |
115 | 0x08039800 |
116 | 0x0803A000 |
117 | 0x0803A800 |
118 | 0x0803B000 |
119 | 0x0803B800 |
120 | 0x0803C000 |
121 | 0x0803C800 |
122 | 0x0803D000 |
123 | 0x0803D800 |
124 | 0x0803E000 |
125 | 0x0803E800 |
126 | 0x0803F000 |
127 | 0x0803F800 |