Драйвер EEPROM: сборка на свежем sdk, частичное стирание

This commit is contained in:
sh-sergey 2025-04-01 12:33:57 +03:00
parent cbe78d08d7
commit 0670b71ee7
5 changed files with 154 additions and 240 deletions

View File

@ -1,114 +1,120 @@
:020000040200F8
:10000000FD62938202400100FD12E39E02FE374131
:10001000000213010100B70100029381016FB705CF
:1000200000029385056F370600021306066FB706B8
:1000300000029386066F39A083A2050023A0560014
:1000400091059106E3EAC5FEB70500029385056FA9
:10005000370600021306066FB70600029386066F86
:1000600039A083A2050023A0560091059106E3EA7A
:10007000C5FEB70500029385056F3706000213061B
:10008000066F21A023A005009105E3EDC5FEB70092
:100090000002E780C00AB7000002E780C00AB7008C
:1000A0000002E780E02273005010F5BF828000005C
:1000B0000000000000000000000000000000000040
:1000C0006F004000197106C20AC40EC612C816CAD3
:1000D0001ACC1ECE22D026D22AD42ED632D836DA48
:1000E0003ADC3EDEC2C0C6C2CAC4CEC6D2C8D6CA78
:1000F000DACCDECEE2D0E6D2EAD4EED6F2D8F6DA28
:10010000FADCFEDE970000009380E00482909240CB
:100110002241B2414242D2426243F24302549254DB
:100120002255B2554256D2566257F2570648964863
:100130002649B649464AD64A664BF64B065C965C5B
:10014000265DB65D465ED65E665FF65F096173004A
:10015000203001A03D432A876373C3029377F700E1
:10016000BDEFADE5937606FF3D8ABA960CC34CC34E
:100170000CC74CC74107E36BD7FE11E28280B30680
:10018000C3408A069702000096966780A600230760
:10019000B700A306B7002306B700A305B7002305E1
:1001A000B700A304B7002304B700A303B7002303D9
:1001B000B700A302B7002302B700A301B7002301D1
:1001C000B700A300B7002300B700828093F5F50FB6
:1001D00093968500D58D93960501D58D61B793963D
:1001E00027009702000096968682E78086FA96801E
:1001F000C1171D8F3E96E374C3F8A5B75D71130652
:1002000080028145280886C6B137BD47230CF1001E
:100210008947230EF1003ED2E177938707082C0827
:100220000A85231AF102C526B640616182803171C8
:100230004AD94ED706DF22DD26DB52D556D35AD116
:1002400037490002653F9307098083A90700854766
:1002500013F7F90F6317F70A614681452800DD3D62
:10026000B707070093D9890061679387074093F91F
:10027000F9031307076A8D461306000281454800FB
:10028000B7240002616A3EC2130909809E09592001
:10029000938404800144130A0A6A130B0008634420
:1002A00034018147A9A8931A040193DA0A01D2877D
:1002B0000147930600022686D68548006D2813065E
:1002C0000008814508107935528793060002101006
:1002D000D68548000D2201471C10BA9783C6070037
:1002E000B307970083C70700638ED7009357744006
:1002F000A207E206D58F4207D98F93E72700232074
:10030000F90001A00507E31967FD130404089384AD
:10031000040871B71C418E0603A88700B3E60601E6
:1003200093E6060894C7144999CA814663DDC6005E
:10033000CCC323A007003A850DE50D458280CCC3D0
:10034000814663CCC600944793E6360094C775D7C0
:10035000C8477D17058965FD828023A007008506B3
:10036000CDB703A8C7007D1513781800E31608FC65
:100370008506910565BF032805000E0783288800C0
:1003800033671701136707082324E800184905C3DA
:1003900001476353D702131527002322B800329573
:1003A00008412320A8003E850DED0D4582802322C3
:1003B000B8000147634FD700032788001367570031
:1003C0002324E800FDD30325C800FD1705897DF926
:1003D000828093152700B2958C4105072320B80031
:1003E000D1BF8328C8007D1593F81800E39E08FA52
:1003F0000507910579BF1C4989CF814763FFD70065
:1004000003280500BA882322B800639108020D452D
:10041000828008414CC163E4D700014582800C41D1
:100420001397270032970CC38507F5B70323C8003D
:10043000FD1813731300E31A03FC832808001398B4
:1004400027003298232018018507910545BF0547ED
:10045000AA876305E50209476300E506054591EBB8
:10046000B7060600DC4A7D771307F73FF98FDCCA31
:10047000014582807D1719EB0D458280930600406F
:1004800037A7070013070712B7050500905D7D8E9B
:1004900075D2370606005C4A7D771307F73FF98F60
:1004A000D58F41115CCA02C613073006B2476359A3
:1004B000F700014541018280856693860680C9B7B1
:1004C000B24785073EC6DDB791476307F50263EA89
:1004D000A7008547630AF50489476309F5040545C4
:1004E0008280A147E31DF5FE0947094501A8FD17D4
:1004F00081EFC8D20D45828005470D45B7A707009B
:1005000093870712B7060500905E798E6DD28A0533
:10051000C98D4111CCD202C613073006B247635AC7
:10052000F7000145410182801147C9BF21470145BC
:10053000F1B7B24785073EC6D5B70547AA87630519
:10054000E50209476304E506054591EBB706060099
:100550009C4A7D771307F73FF98F9CCA014582803B
:100560007D1719EB0D4582809306004037A70700E1
:1005700013070712B7050500905D7D8E75D237070A
:1005800006001C4B7D761306F63FF18FD58F1CCBF2
:10059000232C070085471CCF411102C613073006E4
:1005A000B2476359F7000145410182808566938611
:1005B00006806DBFB24785073EC6DDB711C98547C6
:1005C000630DF50205458280FD1791EB0D45828094
:1005D0000946B7A7070093870712B7060500985E7C
:1005E000718F7DD34111C8D602C613073006B247BA
:1005F0006357F7000145410182800546D9BFB247E4
:1006000085073EC6EDB7011126CAB7040600DC48CF
:1006100006CE22CC4AC84EC652C456C2F19BDCC894
:100620009C482A89C845F19B9CC8D84883C7C50106
:100630002E84137737C08A07D98FDCC883C7D501CA
:1006400098489A071377F7C393F7073CD98F9CC84C
:10065000FD3B0C44AA8A03454400BD351848B70742
:1006600005002A8A98C358480850D8C3184C98C720
:10067000E935AA8948509937834704002A8793F6B9
:10068000170089E6D44893E62600D4C893F62700DD
:1006900099E637060600544A93E6160054CA93F6C4
:1006A000470099E637060600144A93E6260014CA66
:1006B000A18B99E7B70606009C4A93E717009CCAEE
:1006C000F2406244232059012322490123243901A5
:1006D0002326E900D244B249224A924A4A85424935
:1006E00005618280000000000000000000000000A2
:10000000FD6293820240FD12E39F02FE374100022F
:1000100013010100B7110002938181F1B7050002BD
:10002000938585733706000213060674B70600022F
:100030009386867339A083A2050023A056009105FC
:100040009106E3EAC5FEB70500029385850B3706E6
:10005000000213068615B70600029386860B39A0A8
:1000600083A2050023A0560091059106E3EAC5FE90
:10007000B70500029385057437060002130606745F
:1000800021A023A005009105E3EDC5FEB702000203
:100090009382020C73905230B7000002E780600B2D
:1000A000B7000002E780600BB7000002E780202362
:0800B00073005010F5BF8280BF
:1000B80000000000000000006F004000130141F83C
:1000C80006C00AC20EC412C616C81ACA1ECC22CE50
:1000D80026D02AD22ED432D636D83ADA3EDC42DEC0
:1000E800C6C0CAC2CEC4D2C6D6C8DACADECCE2CE30
:1000F800E6D0EAD2EED4F2D6F6D8FADAFEDC9700E9
:10010800000093800005829082401241A241324251
:10011800C2425243E243724482541255A2553256A7
:10012800C2565257E257725886481649A649364A67
:10013800C64A564BE64B764C865C165DA65D365E27
:10014800C65E565FE65F1301C1077300203001A049
:100158003D432A876373C3029377F700BDEFADE58C
:10016800937606FF3D8ABA960CC34CC30CC74CC79E
:100178004107E36BD7FE11E28280B306C3408A06CB
:100188009702000096966780A6002307B700A3068B
:10019800B7002306B700A305B7002305B700A304DB
:1001A800B7002304B700A303B7002303B700A302D3
:1001B800B7002302B700A301B7002301B700A300CB
:1001C800B7002300B700828093F5F50F939685005A
:1001D800D58D93960501D58D61B793962700970223
:1001E800000096968682E78086FA9680C1171D8F52
:1001F8003E96E374C3F8A5B75D7113068002814586
:10020800280886C6B137BD47230CF1008947230E5D
:10021800F1003ED2E177938707082C080A85231A54
:10022800F1020529B6406161828031714ED722DD25
:1002380006DF26DB4AD952D556D35AD1753F03A4D7
:10024800018205471C4093F7F707639EE70C614658
:1002580081452800F53DB7070700938707403EC250
:100268001C40014493D4870093F4F40393F70708E0
:100278009E0485CF61691309096A636C94006169FA
:1002880001441309096A130B0008634A9402814761
:1002980041A8931504014A87814613060002C181CB
:1002A8004800492813040408C9BF61671307076A8F
:1002B8008D461306000281454800AD28C9B703A63C
:1002C8004182131A0401135A0A01CA870147930687
:1002D80000022296D2854800F920130600088145BD
:1002E8000810BD354A87930600021010D2854800D1
:1002F800992283A741820147A2971410BA963386A0
:10030800E70083C6060003460600630FD60093572E
:100318007440A207E206D58F4207D98F93E72700DA
:1003280003A701821CC301A00507E31867FD130496
:100338000408A1BF1C418E0603A88700B3E6060186
:1003480093E6060894C7144999CA814663DDC60036
:10035800CCC323A007003A8515E10D458280CCC3A4
:10036800814663C9C600944793E6360094C70DE3F7
:100378000D451DA023A007008506E5B703A8C70003
:100388007D1513781800E31908FC850691057DBFD3
:10039800C8477D17058961FDB707000103A007005D
:1003A80003A047008280032805000E0783288800E1
:1003B80033671701136707082324E800184905C3A2
:1003C80001476353D702131527002322B80032953B
:1003D80008412320A8003E850DE90D45828023228F
:1003E800B8000147634BD7000327880013675700FD
:1003F8002324E8008DE70D4505A893152700B2953D
:100408008C4105072320B800F1BF8328C8007D155B
:1004180093F81800E39208FC050791055DB70325DA
:10042800C800FD17058979F5B707000103A0070083
:1004380003A0470082801C4989CF814763FFD7000A
:1004480003280500BA882322B800639708020D45DF
:10045800828008414CC163EAD700B707000103A0B6
:10046800070003A04700014582800C41139727002D
:1004780032970CC38507C5B70323C800FD1813734B
:100488001300E31403FC832808001398270032980C
:10049800232018018507910555B70547AA876305E5
:1004A800E50209476300E506054591EBB706060036
:1004B800DC4A7D771307F73FF98FDCCA0145828054
:1004C8007D1719EB0D4582809306004037A707007A
:1004D80013070712B7050500905D7D8E75D23706A4
:1004E80006005C4A7D771307F73FF98FD58F4111D6
:1004F8005CCA02C613073006B2476359F7000145C4
:1005080041018280856693860680C9B7B247850710
:100518003EC6DDB791476307F50263EAA700854742
:10052800630AF50489476309F50405458280A147F4
:10053800E31DF5FE0947094501A8FD1781EFC8D25B
:100548000D45828005470D45B7A707009387071219
:10055800B7060500905E798E6DD28A05C98D411166
:10056800CCD202C613073006B247635AF7000145DA
:10057800410182801147C9BF21470145F1B7B24700
:1005880085073EC6D5B70547AA876305E50209472B
:100598006304E506054591EBB70606009C4A7D779E
:1005A8001307F73FF98F9CCA014582807D1719EB25
:1005B8000D4582809306004037A7070013070712EE
:1005C800B7050500905D7D8E75D2370706001C4B78
:1005D8007D761306F63FF18FD58F1CCB232C0700B1
:1005E80085471CCF411102C613073006B24763592D
:1005F800F7000145410182808566938606806DBFBC
:10060800B24785073EC6DDB711C98547630DF502B8
:1006180005458280FD1791EB0D4582800946B7A7F5
:10062800070093870712B7060500985E718F7DD380
:100638004111C8D602C613073006B2476357F70000
:100648000145410182800546D9BFB24785073EC6AC
:10065800EDB7011126CAB7040600DC4806CE22CC45
:100668004AC84EC652C456C2F19BDCC89C482A8967
:10067800C845F19B9CC8D84883C7C5012E84137709
:1006880037C08A07D98FDCC883C7D50198489A072D
:100698001377F7C393F7073CD98F9CC8FD3B0C44ED
:1006A800AA8A03454400BD351848B70705002A8AB9
:1006B80098C358480850D8C3184C98C7E935AA8930
:1006C80048509937834704002A8793F6170089E62C
:1006D800D44893E62600D4C893F6270099E637064F
:1006E8000600544A93E6160054CA93F6470099E662
:1006F80037060600144A93E6260014CAA18B99E728
:10070800B70606009C4A93E717009CCAF240624469
:100718002320590123224901232439012326E900F2
:10072800D244B249224A924A4A85424905618280A6
:08073800003800020018000265
:0400000502000000F5
:00000001FF

View File

@ -13,3 +13,5 @@ platform = MIK32
board = mik32v2
framework = framework-mik32v2-sdk
board_build.ldscript = ram
board_upload.maximum_size = 4096
board_upload.maximum_ram_size = 2048

View File

@ -1,19 +0,0 @@
OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv")
OUTPUT_ARCH(riscv)
ENTRY(_start)
MEMORY {
ram (RWX): ORIGIN = 0x02000000, LENGTH = 16K
}
STACK_SIZE = 512;
CL_SIZE = 16;
REGION_ALIAS("REGION_TEXT", ram);
REGION_ALIAS("REGION_RAM", ram);
INCLUDE sections.lds

View File

@ -1,105 +0,0 @@
SECTIONS {
.text ORIGIN(REGION_TEXT) : {
PROVIDE(__TEXT_START__ = .);
*crt0.o(.text .text.*)
*(.text.smallsysteminit)
*(.text.SmallSystemInit)
. = ORIGIN(REGION_TEXT) + 0xC0;
KEEP(*crt0.o(.trap_text))
*(.text)
*(.text.*)
*(.rodata)
*(.rodata.*)
. = ALIGN(CL_SIZE);
PROVIDE(__TEXT_END__ = .);
} >REGION_TEXT
.data :
AT( __TEXT_END__ ) {
PROVIDE(__DATA_START__ = .);
_gp = .;
*(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata*)
*(.sdata .sdata.* .gnu.linkonce.s.*)
*(.data .data.*)
. = ALIGN(CL_SIZE);
PROVIDE(__DATA_END__ = .);
} >REGION_RAM
__DATA_IMAGE_START__ = LOADADDR(.data);
__DATA_IMAGE_END__ = LOADADDR(.data) + SIZEOF(.data);
/* thread-local data segment */
.tdata : {
PROVIDE(_tls_data = .);
PROVIDE(_tdata_begin = .);
*(.tdata .tdata.*)
PROVIDE(_tdata_end = .);
. = ALIGN(CL_SIZE);
} >REGION_RAM
.tbss : {
PROVIDE(__BSS_START__ = .);
*(.tbss .tbss.*)
. = ALIGN(CL_SIZE);
PROVIDE(_tbss_end = .);
} >REGION_RAM
/* bss segment */
.sbss : {
*(.sbss .sbss.* .gnu.linkonce.sb.*)
*(.scommon)
} >REGION_RAM
.bss : {
*(.bss .bss.*)
*(COMMON)
. = ALIGN(CL_SIZE);
PROVIDE(__BSS_END__ = .);
} >REGION_RAM
/* Code intended to be copied to REGION_RAM before execution */
.ram_text :
AT( ALIGN(__DATA_IMAGE_END__, CL_SIZE) ) {
PROVIDE(__RAM_TEXT_START__ = .);
*(.ram_text)
. = ALIGN(CL_SIZE);
PROVIDE(__RAM_TEXT_END__ = .);
} > REGION_RAM
__RAM_TEXT_IMAGE_START__ = LOADADDR(.ram_text);
__RAM_TEXT_IMAGE_END__ = LOADADDR(.ram_text) + SIZEOF(.ram_text);
ASSERT(__RAM_TEXT_IMAGE_END__ < ORIGIN(REGION_TEXT) + LENGTH(REGION_TEXT), "REGION_TEXT segment overflows")
ASSERT(__RAM_TEXT_END__ < ORIGIN(REGION_RAM) + LENGTH(REGION_RAM) - STACK_SIZE, "REGION_RAM section overflows")
_end = .;
PROVIDE(__end = .);
BUFFER_SIZE = 8K;
.buffer ORIGIN(REGION_RAM) + 6K : {
FILL(0);
PROVIDE(__BUFFER__END__ = .);
PROVIDE(BUFFER = .);
. += BUFFER_SIZE;
PROVIDE(BUFFER_STATUS = .);
. += 4;
PROVIDE(__BUFFER__END__ = .);
} >REGION_RAM
/* End of uninitalized data segement */
.stack ORIGIN(REGION_RAM) + LENGTH(REGION_RAM) - STACK_SIZE : {
FILL(0);
PROVIDE(__STACK_START__ = .);
. += STACK_SIZE;
PROVIDE(__C_STACK_TOP__ = .);
PROVIDE(__STACK_END__ = .);
} >REGION_RAM
/DISCARD/ : {
*(.eh_frame .eh_frame.*)
}
}

View File

@ -11,13 +11,18 @@
*/
#define STATUS_CODE_S 0
#define STATUS_CODE_M 0xFF
#define STATUS_CODE_M 0x7F
#define STATUS_CODE(X) ((X) << STATUS_CODE_S)
#define STATUS_CODE_OK 0
#define STATUS_CODE_START 1
#define STATUS_CODE_MISMATCH 2
#define STATUS_CODE_ERASE_S 7
#define STATUS_CODE_ERASE_M (1 << STATUS_CODE_ERASE_S)
#define STATUS_CODE_ERASE_FULL 0
#define STATUS_CODE_ERASE_USED STATUS_CODE_ERASE_M
#define STATUS_CODE_START_PAGE_COUNT_S 8
#define STATUS_CODE_START_PAGE_COUNT_M ((64 - 1) << STATUS_CODE_START_PAGE_COUNT_S)
@ -30,8 +35,8 @@
#define STATUS_CODE_MISMATCH_VALUE(X) ((X) << STATUS_CODE_MISMATCH_VALUE_S)
const int BUFFER_SIZE = 8 * 1024;
extern uint8_t *BUFFER[];
extern uint32_t BUFFER_STATUS[];
uint8_t *BUFFER = (uint8_t *)0x02001800;
uint32_t *BUFFER_STATUS = (uint32_t *)0x02003800;
#define EEPROM_OP_TIMEOUT 100000
#define USART_TIMEOUT 1000
@ -69,7 +74,27 @@ int main()
STATUS_CODE_START_PAGE_COUNT_S) *
EEPROM_PAGE_WORDS * 4;
HAL_EEPROM_Erase(&heeprom, 0, EEPROM_PAGE_WORDS, HAL_EEPROM_WRITE_ALL, EEPROM_OP_TIMEOUT);
if (*BUFFER_STATUS & STATUS_CODE_ERASE_USED)
{
for (uint32_t addr = 0; addr < max_address; addr += (EEPROM_PAGE_WORDS * 4))
{
HAL_EEPROM_Erase(
&heeprom,
addr,
EEPROM_PAGE_WORDS,
HAL_EEPROM_WRITE_SINGLE,
EEPROM_OP_TIMEOUT);
}
}
else
{
HAL_EEPROM_Erase(
&heeprom,
0,
EEPROM_PAGE_WORDS,
HAL_EEPROM_WRITE_ALL,
EEPROM_OP_TIMEOUT);
}
for (int addr = 0; addr < max_address; addr += (EEPROM_PAGE_WORDS * 4))
{
@ -87,7 +112,12 @@ int main()
uint8_t rb[EEPROM_PAGE_WORDS * 4] = {0};
HAL_EEPROM_Read(&heeprom, addr, (uint32_t *)rb, EEPROM_PAGE_WORDS, EEPROM_OP_TIMEOUT);
HAL_EEPROM_Read(
&heeprom,
addr,
(uint32_t *)rb,
EEPROM_PAGE_WORDS,
EEPROM_OP_TIMEOUT);
for (uint32_t b = 0; b < (EEPROM_PAGE_WORDS * 4); b++)
{