Skip to content

Commit 487f621

Browse files
committed
chore: update week6 (part i)
1 parent 8b84c35 commit 487f621

File tree

139 files changed

+39696
-13419
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

139 files changed

+39696
-13419
lines changed

CS301 Embedded System and Microcomputer Principle/Assignment/assignment2/.settings/language.settings.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
66
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
77
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
8-
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-503187121000545182" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
8+
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1616291459917111990" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
99
<language-scope id="org.eclipse.cdt.core.gcc"/>
1010
<language-scope id="org.eclipse.cdt.core.g++"/>
1111
</provider>
@@ -16,7 +16,7 @@
1616
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
1717
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
1818
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
19-
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-503187121000545182" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
19+
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1616291459917111990" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
2020
<language-scope id="org.eclipse.cdt.core.gcc"/>
2121
<language-scope id="org.eclipse.cdt.core.g++"/>
2222
</provider>

CS301 Embedded System and Microcomputer Principle/Assignment/assignment2/Core/Inc/hamming.h

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ extern uint32_t input_length;
1919
#define HAMMING_DECODING_MODE 1
2020
#define HAMMING_ENCODING_LENGTH 4
2121
#define HAMMING_DECODING_LENGTH 8
22+
#define HAMMING_PARITY_BITS (HAMMING_DECODING_LENGTH - HAMMING_ENCODING_LENGTH)
2223
#define HAMMING_R 4
2324

2425
#define nthbit(bits, n) ((bits >> (n)) & 0x1)

CS301 Embedded System and Microcomputer Principle/Assignment/assignment2/Core/Src/hamming.c

+32-23
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ uint32_t input_length = 0;
1919
void fresh_origin() {
2020
char p[HAMMING_ENCODING_LENGTH + 1] = "0000";
2121
for(int i = 0; i < HAMMING_ENCODING_LENGTH; ++i) {
22-
if (i < HAMMING_ENCODING_LENGTH - input_length) {
23-
p[i] = ' ';
24-
} else {
22+
if (i < input_length) {
2523
p[i] += nthbit(input_data, HAMMING_ENCODING_LENGTH - 1 - i);
24+
} else {
25+
p[i] = ' ';
2626
}
2727
}
2828
lcd_show_string(20, 85, 200, 24, 24, p, BLACK);
@@ -34,10 +34,10 @@ void fresh_origin() {
3434
void fresh_hamming() {
3535
char p[HAMMING_DECODING_LENGTH + 1] = "00000000";
3636
for(int i = 0; i < HAMMING_DECODING_LENGTH; ++i) {
37-
if (i < HAMMING_DECODING_LENGTH - input_length) {
38-
p[i] = ' ';
39-
} else {
37+
if (i < input_length) {
4038
p[i] += nthbit(input_data, HAMMING_DECODING_LENGTH - 1 - i);
39+
} else {
40+
p[i] = ' ';
4141
}
4242
}
4343
lcd_show_string(20, 150, 200, 24, 24, p, BLACK);
@@ -77,39 +77,44 @@ void print_result() {
7777
lcd_show_string(20, 250, 200, 16, 16, "No errors", BLACK);
7878
} else {
7979
// decide number of errors
80-
if (nthbit(result.syndrome, HAMMING_DECODING_LENGTH - HAMMING_ENCODING_LENGTH - 1)) {
81-
lcd_show_string(20, 220, 200, 12, 12, "2 errors occur, P = ", BLACK);
80+
if (!nthbit(result.syndrome, HAMMING_PARITY_BITS - 1)) {
81+
lcd_show_string(20, 211, 200, 24, 24, "2", BLACK);
82+
lcd_show_string(32, 217, 200, 16, 16, " errors occur, P = ", BLACK);
8283
} else {
83-
lcd_show_string(20, 220, 200, 12, 12, "1 error occurs, P = ", BLACK);
84+
lcd_show_string(20, 211, 200, 24, 24, "1", BLACK);
85+
lcd_show_string(32, 217, 200, 16, 16, " error occurs, P = ", BLACK);
8486
}
8587

8688
// index of error bit
87-
char p[2] = "0"; p[0] += result.syndrome & ((1 << (HAMMING_DECODING_LENGTH - HAMMING_ENCODING_LENGTH - 1)) - 1);
88-
lcd_show_string(140, 217, 200, 16, 16, p, BLACK);
89+
char p[2] = "0"; p[0] += result.syndrome & ((1 << (HAMMING_PARITY_BITS - 1)) - 1);
90+
lcd_show_string(178, 211, 200, 24, 24, p, BLACK);
8991

9092
// print difference to indicate the correction
91-
uint32_t error_index = result.syndrome & ((1 << (HAMMING_DECODING_LENGTH - HAMMING_ENCODING_LENGTH - 1)) - 1);
92-
lcd_show_string(20, 240, 200, 16, 16, "Corrupted: ", BLACK);
93+
uint32_t error_index = result.syndrome & ((1 << (HAMMING_PARITY_BITS - 1)) - 1);
94+
lcd_show_string(20, 235, 200, 16, 16, "Corrupted: ", BLACK);
9395
char d[HAMMING_DECODING_LENGTH + 1] = "00000000";
9496
for(int i = 0; i < HAMMING_DECODING_LENGTH; ++i) {
9597
d[i] += nthbit(input_data, HAMMING_DECODING_LENGTH - 1 - i);
9698
}
97-
lcd_show_string_highlight(110, 240, 200, 16, 16, d, RED, error_index);
99+
lcd_show_string_highlight(110, 235, 200, 16, 16, d, RED, error_index);
98100

99-
lcd_show_string(20, 260, 200, 16, 16, "Corrected: ", BLACK);
101+
lcd_show_string(20, 255, 200, 16, 16, "Corrected: ", BLACK);
100102
uint32_t correct = input_data ^= 1 << (HAMMING_DECODING_LENGTH - 1 - error_index);
101103
char c[HAMMING_DECODING_LENGTH + 1] = "00000000";
102104
for(int i = 0; i < HAMMING_DECODING_LENGTH; ++i) {
103105
c[i] += nthbit(correct, HAMMING_DECODING_LENGTH - 1 - i);
104106
}
105-
lcd_show_string_highlight(110, 260, 200, 16, 16, c, GREEN, error_index);
107+
lcd_show_string_highlight(110, 255, 200, 16, 16, c, GREEN, error_index);
106108

107-
for(int i = 0; i < HAMMING_DECODING_LENGTH - HAMMING_ENCODING_MODE - 1; ++i) {
108-
char a[5] = "P0 = 0";
109-
a[1] += (1 << i);
110-
a[5] += nthbit(result.syndrome, i);
111-
lcd_show_string(20 + (i * 40), 270, 200, 16, 16, a, BLACK);
109+
lcd_show_string(20, 275, 200, 16, 16, "P4P2P1 = ", BLACK);
110+
for(int i = 0; i < HAMMING_PARITY_BITS - 1; ++i) {
111+
char a[2] = "0";
112+
a[0] += nthbit(result.syndrome, i);
113+
lcd_show_string(108 - (8 * i), 275, 200, 16, 16, a, BLACK);
112114
}
115+
char f[7] = "PP = 0";
116+
f[5] += nthbit(result.syndrome, HAMMING_PARITY_BITS - 1);
117+
lcd_show_string(135, 275, 200, 16, 16, f, BLACK);
113118
}
114119
}
115120
}
@@ -236,6 +241,10 @@ decode_result decode() {
236241
result.syndrome = get_parity(xor, y);
237242
result.result = data;
238243

244+
if (result.syndrome == (1 << (HAMMING_PARITY_BITS - 1))) {
245+
return result;
246+
}
247+
239248
if (result.syndrome != 0) {
240249
uint32_t old_input = input_data;
241250
if (result.syndrome != (1 << y))
@@ -246,8 +255,8 @@ decode_result decode() {
246255
parity ^= nthbit(old_input, i);
247256
}
248257

249-
if (parity) result.syndrome |= 1 << y;
250-
else result.syndrome &= (1 << (HAMMING_DECODING_LENGTH - HAMMING_ENCODING_LENGTH - 1)) - 1;
258+
if (parity) result.syndrome &= (1 << (HAMMING_PARITY_BITS - 1)) - 1;
259+
else result.syndrome |= 1 << y;
251260

252261
data = 0;
253262
for(int i = 0; i < x; ++i) {

CS301 Embedded System and Microcomputer Principle/Assignment/assignment2/Core/Src/main.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
/* Includes ------------------------------------------------------------------*/
2121
#include "main.h"
2222
#include "gpio.h"
23-
2423
/* Private includes ----------------------------------------------------------*/
2524
/* USER CODE BEGIN Includes */
25+
#include "lcd.h"
2626
#include "hamming.h"
2727
/* USER CODE END Includes */
2828

CS301 Embedded System and Microcomputer Principle/Assignment/assignment2/Core/Src/stm32f1xx_it.c

+5-4
Original file line numberDiff line numberDiff line change
@@ -257,10 +257,10 @@ __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
257257
}
258258

259259
// input 0
260-
if (input_length < limit) input_data = input_data << 1;
260+
if (input_length >= limit) break;
261261

262262
// constrain input when reach the input limit, refresh to input
263-
input_length = input_length >= limit ? limit : input_length + 1;
263+
input_length++;
264264

265265
// refresh specific zone
266266
if (mode == HAMMING_ENCODING_MODE) fresh_origin();
@@ -280,10 +280,11 @@ __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
280280
}
281281

282282
// input 1
283-
if (input_length < limit) input_data = input_data << 1 | 1;
283+
if (input_length < limit) input_data |= (1 << (limit - input_length - 1));
284+
else break;
284285

285286
// constrain input when reach the input limit, refresh to input
286-
input_length = input_length >= limit ? limit : input_length + 1;
287+
input_length++;
287288

288289
// refresh specific zone
289290
if (mode == HAMMING_ENCODING_MODE) fresh_origin();
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
../Core/Src/hamming.c:19:6:fresh_origin 3
22
../Core/Src/hamming.c:34:6:fresh_hamming 3
3-
../Core/Src/hamming.c:49:6:print_result 9
4-
../Core/Src/hamming.c:113:6:print_screen 3
5-
../Core/Src/hamming.c:135:10:is_parity 3
6-
../Core/Src/hamming.c:143:10:flip_bit 2
7-
../Core/Src/hamming.c:158:10:encode 7
8-
../Core/Src/hamming.c:197:10:get_parity 2
9-
../Core/Src/hamming.c:214:15:decode 8
3+
../Core/Src/hamming.c:49:6:print_result 10
4+
../Core/Src/hamming.c:125:6:print_screen 3
5+
../Core/Src/hamming.c:147:10:is_parity 3
6+
../Core/Src/hamming.c:155:10:flip_bit 2
7+
../Core/Src/hamming.c:170:10:encode 7
8+
../Core/Src/hamming.c:209:10:get_parity 2
9+
../Core/Src/hamming.c:226:15:decode 9
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
../Core/Src/hamming.c:19:6:fresh_origin 40 static
22
../Core/Src/hamming.c:34:6:fresh_hamming 40 static
3-
../Core/Src/hamming.c:49:6:print_result 112 static
4-
../Core/Src/hamming.c:113:6:print_screen 24 static
5-
../Core/Src/hamming.c:135:10:is_parity 24 static
6-
../Core/Src/hamming.c:143:10:flip_bit 24 static
7-
../Core/Src/hamming.c:158:10:encode 88 static
8-
../Core/Src/hamming.c:197:10:get_parity 24 static
9-
../Core/Src/hamming.c:214:15:decode 80 static
3+
../Core/Src/hamming.c:49:6:print_result 128 static
4+
../Core/Src/hamming.c:125:6:print_screen 24 static
5+
../Core/Src/hamming.c:147:10:is_parity 24 static
6+
../Core/Src/hamming.c:155:10:flip_bit 24 static
7+
../Core/Src/hamming.c:170:10:encode 88 static
8+
../Core/Src/hamming.c:209:10:get_parity 24 static
9+
../Core/Src/hamming.c:226:15:decode 80 static

CS301 Embedded System and Microcomputer Principle/Assignment/assignment2/Debug/Core/Src/main.d

+3-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ Core/Src/main.o: ../Core/Src/main.c ../Core/Inc/main.h \
2121
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h \
2222
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h \
2323
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h \
24-
../Core/Inc/gpio.h ../Core/Inc/main.h ../Core/Inc/hamming.h
24+
../Core/Inc/gpio.h ../Core/Inc/main.h ../Core/Inc/lcd.h \
25+
../Core/Inc/hamming.h
2526
../Core/Inc/main.h:
2627
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h:
2728
../Core/Inc/stm32f1xx_hal_conf.h:
@@ -47,4 +48,5 @@ Core/Src/main.o: ../Core/Src/main.c ../Core/Inc/main.h \
4748
../Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h:
4849
../Core/Inc/gpio.h:
4950
../Core/Inc/main.h:
51+
../Core/Inc/lcd.h:
5052
../Core/Inc/hamming.h:

CS301 Embedded System and Microcomputer Principle/Assignment/assignment2/Debug/Core/Src/stm32f1xx_it.cyclo

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@
1010
../Core/Src/stm32f1xx_it.c:206:6:EXTI0_IRQHandler 1
1111
../Core/Src/stm32f1xx_it.c:220:6:EXTI9_5_IRQHandler 1
1212
../Core/Src/stm32f1xx_it.c:234:6:EXTI15_10_IRQHandler 1
13-
../Core/Src/stm32f1xx_it.c:246:13:HAL_GPIO_EXTI_Callback 20
13+
../Core/Src/stm32f1xx_it.c:246:13:HAL_GPIO_EXTI_Callback 18

0 commit comments

Comments
 (0)