Skip to content

Commit 4974295

Browse files
read and erase working!
1 parent f12b662 commit 4974295

54 files changed

Lines changed: 8828 additions & 7090 deletions

Some content is hidden

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

.cproject

Lines changed: 19 additions & 18 deletions
Large diffs are not rendered by default.

.settings/language.settings.xml

Lines changed: 2 additions & 2 deletions
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="93187812993434085" 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="930547803030114432" 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="93187812993434085" 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="930547803030114432" 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>
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
2F62501ED4689FB349E356AB974DBE57=9DF163A42C11F36CF99A1B0D0856D3AA
1+
2F62501ED4689FB349E356AB974DBE57=6FB3D03341C5D261A9EE9841C66A6A20
22
635E684B79701B039C64EA45C3F84D30=E893F68E978C440B1208EDC95C425A4A
33
66BE74F758C12D739921AEA421D593D3=0
4-
8DF89ED150041C4CBC7CB9A9CAA90856=9DF163A42C11F36CF99A1B0D0856D3AA
4+
8DF89ED150041C4CBC7CB9A9CAA90856=6FB3D03341C5D261A9EE9841C66A6A20
55
DC22A860405A8BF2F2C095E5B6529F12=5E54281DC75B4DE702FD7B851B2C5A22
66
eclipse.preferences.version=1

Core/App/Bootloader.c

Lines changed: 201 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,205 @@
77

88
#include "Bootloader.h"
99

10-
void bootloader_init(){
11-
return;
10+
/****************************************************************************************
11+
* Macro definitions
12+
****************************************************************************************/
13+
#define BOOTLOADER_ACK (0x79)
14+
#define BOOTLOADER_NACK (0x1f)
15+
16+
17+
/****************************************************************************************
18+
* Function prototypes
19+
****************************************************************************************/
20+
void const __b_wait_until_fdcan_message_received(void);
21+
void const __b_clean_fdcan_packet_data(fdcan_packet_t* packet);
22+
void const __b_clean_fdcan_packet_all(fdcan_packet_t* packet);
23+
void const __b_send_ack(fdcan_packet_t* packet);
24+
void const __b_send_nack(fdcan_packet_t* packet);
25+
void const __b_data_copy_to_packet(fdcan_packet_t* packet, uint8_t* data);
26+
void const __b_data_copy_from_packet(fdcan_packet_t* packet, uint8_t* data);
27+
void const __b_get_version(fdcan_packet_t* packet);
28+
void const __b_read_memory(fdcan_packet_t* packet);
29+
void const __b_write_memory(fdcan_packet_t* packet);
30+
void const __b_erase_memory(fdcan_packet_t* packet);
31+
void const __b_go(fdcan_packet_t* packet);
32+
33+
34+
void bootloader_start(){
35+
fdcan_packet_t packet;
36+
__b_clean_fdcan_packet_all(&packet);
37+
38+
while(1){
39+
__b_wait_until_fdcan_message_received();
40+
fdcan_read(&packet);
41+
42+
switch (packet.identifier) {
43+
case GET_VERSION_ORDER:
44+
__b_get_version(&packet);
45+
break;
46+
case READ_MEMORY_ORDER:
47+
__b_read_memory(&packet);
48+
break;
49+
case WRITE_MEMORY_ORDER:
50+
__b_write_memory(&packet);
51+
break;
52+
case ERASE_MEMORY_ORDER:
53+
__b_erase_memory(&packet);
54+
break;
55+
case GO_ORDER:
56+
__b_go(&packet);
57+
break;
58+
default:
59+
__b_send_nack(&packet);
60+
break;
61+
}
62+
63+
__b_clean_fdcan_packet_all(&packet);
64+
}
65+
}
66+
67+
void const __b_get_version(fdcan_packet_t* packet){
68+
__b_clean_fdcan_packet_all(packet);
69+
70+
__b_send_ack(packet);
71+
72+
packet->data[0] = BOOTLOADER_VERSION;
73+
if (fdcan_transmit(packet) != FDCAN_OK) {
74+
__b_send_nack(packet);
75+
return;
76+
}
77+
78+
__b_send_ack(packet);
79+
}
80+
81+
void const __b_read_memory(fdcan_packet_t* packet){
82+
uint32_t buffer[SECTOR_SIZE_IN_32BITS_WORDS];
83+
sector_t sector;
84+
uint32_t address;
85+
uint16_t i;
86+
87+
sector = packet->data[0];
88+
address = flash_get_sector_starting_address(sector);
89+
90+
if (address == FLASH_SECTOR_ERROR || address == FLASH_PROTECTED_SECTOR) {
91+
__b_send_nack(packet);
92+
return;
93+
}
94+
95+
if (flash_read(address, buffer, SECTOR_SIZE_IN_32BITS_WORDS) != FLASH_OK) {
96+
__b_send_nack(packet);
97+
return;
98+
}
99+
100+
__b_send_ack(packet);
101+
102+
for (i = 0; i < SECTOR_SIZE_IN_32BITS_WORDS; i +=16) {
103+
__b_data_copy_to_packet(packet, ((uint8_t*)&(buffer[i])));
104+
if (fdcan_transmit(packet) != FDCAN_OK) {
105+
__b_send_nack(packet);
106+
return;
107+
}
108+
HAL_Delay(1);
109+
}
110+
111+
__b_send_ack(packet);
112+
}
113+
114+
void const __b_write_memory(fdcan_packet_t* packet){
115+
uint32_t buffer[SECTOR_SIZE_IN_32BITS_WORDS];
116+
sector_t sector;
117+
uint32_t address;
118+
uint16_t i;
119+
120+
sector = packet->data[0];
121+
address = flash_get_sector_starting_address(sector);
122+
123+
if (address == FLASH_SECTOR_ERROR || address == FLASH_PROTECTED_SECTOR) {
124+
__b_send_nack(packet);
125+
return;
126+
}
127+
128+
__b_send_ack(packet);
129+
130+
for (i = 0; i < SECTOR_SIZE_IN_32BITS_WORDS; i +=16) {
131+
__b_wait_until_fdcan_message_received();
132+
if (fdcan_read(packet) != FDCAN_OK) {
133+
__b_send_nack(packet);
134+
return;
135+
}
136+
__b_data_copy_to_packet(packet, ((uint8_t*)&(buffer[i])));
137+
}
138+
}
139+
140+
void const __b_erase_memory(fdcan_packet_t* packet){
141+
sector_t sector1, sector2;
142+
143+
sector1 = packet->data[0];
144+
sector2 = packet->data[1];
145+
146+
if (sector1 > FLASH_MAX_SECTOR || sector2 > FLASH_MAX_SECTOR) {
147+
__b_send_nack(packet);
148+
}
149+
150+
__b_send_ack(packet);
151+
152+
153+
if(flash_erase(sector1, sector2) != FLASH_OK){
154+
__b_send_nack(packet);
155+
}
156+
157+
__b_send_ack(packet);
158+
}
159+
160+
void const __b_go(fdcan_packet_t* packet){
161+
__b_send_nack(packet);
162+
}
163+
164+
void const __b_data_copy_to_packet(fdcan_packet_t* packet, uint8_t* data){
165+
uint8_t i;
166+
167+
for (i = 0; i < 64; ++i) {
168+
packet->data[i] = data[i];
169+
}
170+
}
171+
172+
void const __b_send_ack(fdcan_packet_t* packet){
173+
__b_clean_fdcan_packet_data(packet);
174+
packet->data[0] = BOOTLOADER_ACK;
175+
fdcan_transmit(packet);
176+
}
177+
178+
void const __b_send_nack(fdcan_packet_t* packet){
179+
__b_clean_fdcan_packet_data(packet);
180+
packet->data[0] = BOOTLOADER_NACK;
181+
fdcan_transmit(packet);
182+
}
183+
184+
uint32_t const __b_get_addr_from_data(uint8_t* data){
185+
uint32_t address = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];
186+
187+
return address;
188+
}
189+
190+
void const __b_clean_fdcan_packet_data(fdcan_packet_t* packet){
191+
uint16_t i;
192+
193+
for (i = 0; i < 64; ++i) {
194+
packet->data[i] = 0;
195+
}
196+
}
197+
198+
void const __b_clean_fdcan_packet_all(fdcan_packet_t* packet){
199+
uint16_t i;
200+
201+
for (i = 0; i < 64; ++i) {
202+
packet->data[i] = 0;
203+
}
204+
205+
packet->identifier = 0;
206+
}
207+
208+
209+
void const __b_wait_until_fdcan_message_received(void){
210+
while(!fdcan_test()){}
12211
}

Core/App/Bootloader.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,22 @@
1212
#include "Flash.h"
1313
#include "FDCAN.h"
1414

15+
#define BOOTLOADER_VERSION (0x01)
16+
1517
/****************************************************************************************
1618
* Type definitions
1719
****************************************************************************************/
18-
20+
typedef enum{
21+
GET_VERSION_ORDER = 0x50,
22+
READ_MEMORY_ORDER = 0x40,
23+
WRITE_MEMORY_ORDER = 0x30,
24+
ERASE_MEMORY_ORDER = 0x20,
25+
GO_ORDER = 0x10
26+
}bootloader_order_t;
1927

2028
/****************************************************************************************
2129
* Function prototypes
2230
****************************************************************************************/
23-
void const bootloader_init(void);
31+
void const bootloader_start(void);
2432

2533
#endif /* APP_BOOTLOADER_HPP_ */

Core/App/FDCAN.c

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,10 @@ fdcan_error_t const fdcan_transmit(fdcan_packet_t* packet){
3030
return FDCAN_OK;
3131
}
3232

33-
//void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs){
34-
// __NOP();
35-
//
36-
//}
37-
3833
fdcan_error_t const fdcan_read(fdcan_packet_t* packet){
39-
// if(!fdcan_test) {
40-
// return FDCAN_EMPTY;
41-
// }
42-
34+
if(!fdcan_test) {
35+
return FDCAN_EMPTY;
36+
}
4337

4438
HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_FIFO0, &rx_header_buffer, packet->data);
4539

@@ -48,5 +42,5 @@ fdcan_error_t const fdcan_read(fdcan_packet_t* packet){
4842
}
4943

5044
int const fdcan_test(void){
51-
return HAL_FDCAN_IsRxBufferMessageAvailable(&hfdcan1, 0);
45+
return !((hfdcan1.Instance->RXF0S & FDCAN_RXF0S_F0FL) == 0U);
5246
}

Core/App/FDCAN.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ typedef enum{
2727

2828
typedef struct {
2929
uint16_t identifier;
30-
uint8_t* data;
30+
uint8_t data[64];
3131

3232
}fdcan_packet_t;
3333

Core/App/Flash.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
* Function prototypes
1212
****************************************************************************************/
1313
sector_t const __flash_get_sector(const uint32_t address);
14-
uint32_t const __flash_get_sector_starting_address(const sector_t sector);
14+
uint32_t const flash_get_sector_starting_address(const sector_t sector);
1515

1616
flash_error const flash_read(uint32_t source_addr, uint32_t* result, uint32_t number_of_words){
1717
if (source_addr < FLASH_START_ADDRESS || source_addr > FLASH_CODE_END_ADDRESS) {
@@ -20,7 +20,7 @@ flash_error const flash_read(uint32_t source_addr, uint32_t* result, uint32_t nu
2020

2121
HAL_FLASH_Unlock();
2222
uint32_t i;
23-
for (i = 0; i < number_of_words * FLASH_WORD; i+=4) {
23+
for (i = 0; i < number_of_words; i++) {
2424
*result = *(__IO uint32_t *)(source_addr);
2525
source_addr += 4;
2626
result++;
@@ -38,25 +38,25 @@ flash_error const flash_write(uint32_t dest_addr, uint32_t* data, uint32_t numbe
3838
uint32_t index = 0;
3939

4040
sector_t start_sector =__flash_get_sector(dest_addr);;
41-
uint32_t start_sector_addr = __flash_get_sector_starting_address(start_sector);
41+
uint32_t start_sector_addr = flash_get_sector_starting_address(start_sector);
4242

43-
uint32_t end_address = dest_addr + ((number_of_words * 4) - 4);
43+
uint32_t end_address = dest_addr + ((number_of_words * FLASH_32BITS_WORLD) - FLASH_32BITS_WORLD);
4444
uint32_t end_sector = __flash_get_sector(end_address);
4545

4646
if (flash_erase(start_sector, end_sector) != FLASH_OK) {
4747
return FLASH_ERROR;
4848
}
4949

5050
HAL_FLASH_Unlock();
51-
while(index < (uint32_t)SECTOR_SIZE_IN_WORDS){
51+
while(index < (uint32_t)SECTOR_SIZE_IN_32BITS_WORDS){
5252
if (start_sector_addr > FLASH_CODE_END_ADDRESS) {
5353
return FLASH_PROTECTED_MEM;
5454
}
5555

5656
data[index] = index;
5757
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, start_sector_addr, (uint32_t)&data[index]) == HAL_OK) {
58-
start_sector_addr += 4 * FLASH_WORD;
59-
index += FLASH_WORD;
58+
start_sector_addr += FLASH_WORD_SIZE;
59+
index += FLASH_WORD_SIZE / FLASH_32BITS_WORLD;
6060
}else{
6161
HAL_FLASH_Lock();
6262
return FLASH_ERROR;;
@@ -135,7 +135,7 @@ sector_t const __flash_get_sector(const uint32_t address){
135135
return sector;
136136
}
137137

138-
uint32_t const __flash_get_sector_starting_address(const sector_t sector){
138+
uint32_t const flash_get_sector_starting_address(const sector_t sector){
139139
uint32_t address;
140140
switch ((uint32_t)sector) {
141141
case FLASH_SECTOR_0:
@@ -163,7 +163,7 @@ uint32_t const __flash_get_sector_starting_address(const sector_t sector){
163163
address = FLASH_SECTOR7_START_ADDRESS;
164164
break;
165165
default:
166-
address = FLASH_SECTOR0_START_ADDRESS;
166+
address = FLASH_SECTOR_ERROR;
167167
break;
168168
}
169169

0 commit comments

Comments
 (0)