Mercurial > public > ostc4
comparison OtherSources/data_central_mini.c @ 5:e65d01b6a17e
MOVE files for other applications
author | JeanDo |
---|---|
date | Fri, 15 Dec 2017 01:45:20 +0100 |
parents | |
children | 7801c5d8a562 |
comparison
equal
deleted
inserted
replaced
4:89a87ddc2e47 | 5:e65d01b6a17e |
---|---|
1 /** | |
2 ****************************************************************************** | |
3 * @copyright heinrichs weikamp | |
4 * @file data_central_mini.c - bootloader only - | |
5 * @author heinrichs/weikamp, Christian Weikamp | |
6 * @date 10-November-2014 | |
7 * @version V1.0.3 | |
8 * @since 10-Nov-2014 | |
9 * @brief | |
10 * @bug | |
11 * @warning | |
12 @verbatim | |
13 | |
14 @endverbatim | |
15 ****************************************************************************** | |
16 * @attention | |
17 * | |
18 * <h2><center>© COPYRIGHT(c) 2015 heinrichs weikamp</center></h2> | |
19 * | |
20 ****************************************************************************** | |
21 */ | |
22 | |
23 /* Includes ------------------------------------------------------------------*/ | |
24 #include <string.h> | |
25 #include "data_central.h" | |
26 #include "stm32f4xx_hal.h" | |
27 #include "crcmodel.h" | |
28 | |
29 void translateDate(uint32_t datetmpreg, RTC_DateTypeDef *sDate) | |
30 { | |
31 datetmpreg = (uint32_t)(datetmpreg & RTC_DR_RESERVED_MASK); | |
32 | |
33 /* Fill the structure fields with the read parameters */ | |
34 sDate->Year = (uint8_t)((datetmpreg & (RTC_DR_YT | RTC_DR_YU)) >> 16); | |
35 sDate->Month = (uint8_t)((datetmpreg & (RTC_DR_MT | RTC_DR_MU)) >> 8); | |
36 sDate->Date = (uint8_t)(datetmpreg & (RTC_DR_DT | RTC_DR_DU)); | |
37 sDate->WeekDay = (uint8_t)((datetmpreg & (RTC_DR_WDU)) >> 13); | |
38 | |
39 /* Convert the date structure parameters to Binary format */ | |
40 sDate->Year = (uint8_t)RTC_Bcd2ToByte(sDate->Year); | |
41 sDate->Month = (uint8_t)RTC_Bcd2ToByte(sDate->Month); | |
42 sDate->Date = (uint8_t)RTC_Bcd2ToByte(sDate->Date); | |
43 } | |
44 | |
45 void translateTime(uint32_t tmpreg, RTC_TimeTypeDef *sTime) | |
46 { | |
47 tmpreg = (uint32_t)(tmpreg & RTC_TR_RESERVED_MASK); | |
48 | |
49 /* Fill the structure fields with the read parameters */ | |
50 sTime->Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16); | |
51 sTime->Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >>8); | |
52 sTime->Seconds = (uint8_t)(tmpreg & (RTC_TR_ST | RTC_TR_SU)); | |
53 sTime->TimeFormat = (uint8_t)((tmpreg & (RTC_TR_PM)) >> 16); | |
54 | |
55 /* Convert the time structure parameters to Binary format */ | |
56 sTime->Hours = (uint8_t)RTC_Bcd2ToByte(sTime->Hours); | |
57 sTime->Minutes = (uint8_t)RTC_Bcd2ToByte(sTime->Minutes); | |
58 sTime->Seconds = (uint8_t)RTC_Bcd2ToByte(sTime->Seconds); | |
59 sTime->SubSeconds = 0; | |
60 } | |
61 | |
62 | |
63 /* This is derived from crc32b but does table lookup. First the table | |
64 itself is calculated, if it has not yet been set up. | |
65 Not counting the table setup (which would probably be a separate | |
66 function), when compiled to Cyclops with GCC, this function executes in | |
67 7 + 13n instructions, where n is the number of bytes in the input | |
68 message. It should be doable in 4 + 9n instructions. In any case, two | |
69 of the 13 or 9 instrucions are load byte. | |
70 This is Figure 14-7 in the text. */ | |
71 | |
72 /* http://www.hackersdelight.org/ i guess ;-) *chsw */ | |
73 | |
74 uint32_t crc32c_checksum(uint8_t* message, uint16_t length, uint8_t* message2, uint16_t length2) { | |
75 int i, j; | |
76 uint32_t byte, crc, mask; | |
77 static unsigned int table[256] = {0}; | |
78 | |
79 /* Set up the table, if necessary. */ | |
80 if (table[1] == 0) { | |
81 for (byte = 0; byte <= 255; byte++) { | |
82 crc = byte; | |
83 for (j = 7; j >= 0; j--) { // Do eight times. | |
84 mask = -(crc & 1); | |
85 crc = (crc >> 1) ^ (0xEDB88320 & mask); | |
86 } | |
87 table[byte] = crc; | |
88 } | |
89 } | |
90 | |
91 /* Through with table setup, now calculate the CRC. */ | |
92 i = 0; | |
93 crc = 0xFFFFFFFF; | |
94 while (length--) { | |
95 byte = message[i]; | |
96 crc = (crc >> 8) ^ table[(crc ^ byte) & 0xFF]; | |
97 i = i + 1; | |
98 } | |
99 if(length2) | |
100 { | |
101 i = 0; | |
102 while (length2--) { | |
103 byte = message2[i]; | |
104 crc = (crc >> 8) ^ table[(crc ^ byte) & 0xFF]; | |
105 i = i + 1; | |
106 } | |
107 } | |
108 return ~crc; | |
109 } | |
110 | |
111 | |
112 uint32_t CRC_CalcBlockCRC_moreThan768000(uint32_t *buffer1, uint32_t *buffer2, uint32_t words) | |
113 { | |
114 cm_t crc_model; | |
115 uint32_t word_to_do; | |
116 uint8_t byte_to_do; | |
117 int i; | |
118 | |
119 // Values for the STM32F generator. | |
120 | |
121 crc_model.cm_width = 32; // 32-bit CRC | |
122 crc_model.cm_poly = 0x04C11DB7; // CRC-32 polynomial | |
123 crc_model.cm_init = 0xFFFFFFFF; // CRC initialized to 1's | |
124 crc_model.cm_refin = FALSE; // CRC calculated MSB first | |
125 crc_model.cm_refot = FALSE; // Final result is not bit-reversed | |
126 crc_model.cm_xorot = 0x00000000; // Final result XOR'ed with this | |
127 | |
128 cm_ini(&crc_model); | |
129 | |
130 while (words--) | |
131 { | |
132 // The STM32F10x hardware does 32-bit words at a time!!! | |
133 if(words > (768000/4)) | |
134 word_to_do = *buffer2++; | |
135 else | |
136 word_to_do = *buffer1++; | |
137 | |
138 // Do all bytes in the 32-bit word. | |
139 | |
140 for (i = 0; i < sizeof(word_to_do); i++) | |
141 { | |
142 // We calculate a *byte* at a time. If the CRC is MSB first we | |
143 // do the next MS byte and vica-versa. | |
144 | |
145 if (crc_model.cm_refin == FALSE) | |
146 { | |
147 // MSB first. Do the next MS byte. | |
148 | |
149 byte_to_do = (uint8_t) ((word_to_do & 0xFF000000) >> 24); | |
150 word_to_do <<= 8; | |
151 } | |
152 else | |
153 { | |
154 // LSB first. Do the next LS byte. | |
155 | |
156 byte_to_do = (uint8_t) (word_to_do & 0x000000FF); | |
157 word_to_do >>= 8; | |
158 } | |
159 | |
160 cm_nxt(&crc_model, byte_to_do); | |
161 } | |
162 } | |
163 | |
164 // Return the final result. | |
165 | |
166 return (cm_crc(&crc_model)); | |
167 } | |
168 | |
169 | |
170 uint32_t CRC_CalcBlockCRC(uint32_t *buffer, uint32_t words) | |
171 { | |
172 cm_t crc_model; | |
173 uint32_t word_to_do; | |
174 uint8_t byte_to_do; | |
175 int i; | |
176 | |
177 // Values for the STM32F generator. | |
178 | |
179 crc_model.cm_width = 32; // 32-bit CRC | |
180 crc_model.cm_poly = 0x04C11DB7; // CRC-32 polynomial | |
181 crc_model.cm_init = 0xFFFFFFFF; // CRC initialized to 1's | |
182 crc_model.cm_refin = FALSE; // CRC calculated MSB first | |
183 crc_model.cm_refot = FALSE; // Final result is not bit-reversed | |
184 crc_model.cm_xorot = 0x00000000; // Final result XOR'ed with this | |
185 | |
186 cm_ini(&crc_model); | |
187 | |
188 while (words--) | |
189 { | |
190 // The STM32F10x hardware does 32-bit words at a time!!! | |
191 | |
192 word_to_do = *buffer++; | |
193 | |
194 // Do all bytes in the 32-bit word. | |
195 | |
196 for (i = 0; i < sizeof(word_to_do); i++) | |
197 { | |
198 // We calculate a *byte* at a time. If the CRC is MSB first we | |
199 // do the next MS byte and vica-versa. | |
200 | |
201 if (crc_model.cm_refin == FALSE) | |
202 { | |
203 // MSB first. Do the next MS byte. | |
204 | |
205 byte_to_do = (uint8_t) ((word_to_do & 0xFF000000) >> 24); | |
206 word_to_do <<= 8; | |
207 } | |
208 else | |
209 { | |
210 // LSB first. Do the next LS byte. | |
211 | |
212 byte_to_do = (uint8_t) (word_to_do & 0x000000FF); | |
213 word_to_do >>= 8; | |
214 } | |
215 | |
216 cm_nxt(&crc_model, byte_to_do); | |
217 } | |
218 } | |
219 | |
220 // Return the final result. | |
221 | |
222 return (cm_crc(&crc_model)); | |
223 } | |
224 |