This commit is contained in:
2025-09-28 23:33:51 +08:00
parent ee6f94aae4
commit e369f6c284
15 changed files with 4043 additions and 0 deletions

BIN
1gpio/bin/gpio.bin Executable file

Binary file not shown.

BIN
1gpio/bin/gpio.elf Executable file

Binary file not shown.

218
1gpio/bin/gpio.hex Normal file
View File

@@ -0,0 +1,218 @@
:020000040800F2
:1000000000000220BD090008B9090008B70900086E
:10001000B7090008B7090008B70900080000000088
:10002000000000000000000000000000B909000806
:10003000B909000800000000B9090008C904000857
:10004000B7090008B7090008B7090008B709000890
:10005000B7090008B7090008B7090008B709000880
:10006000B7090008B7090008B7090008B709000870
:10007000B7090008B7090008B7090008B709000860
:10008000B7090008B7090008B7090008B709000850
:10009000B7090008B7090008B7090008B709000840
:1000A000B7090008B7090008B7090008B709000830
:1000B000B7090008B7090008B7090008B709000820
:1000C000B7090008B7090008B7090008B709000810
:1000D000B7090008B7090008B7090008B709000800
:1000E000B7090008B7090008B7090008B7090008F0
:1000F000B7090008B7090008B7090008B7090008E0
:10010000B7090008B7090008B7090008B7090008CF
:10011000B7090008B7090008B7090008B7090008BF
:10012000B7090008B7090008B7090008B7090008AF
:10013000B7090008B7090008B7090008B70900089F
:10014000B7090008B7090008B7090008B70900088F
:10015000B7090008B7090008B7090008B70900087F
:10016000B7090008B7090008B7090008B70900086F
:10017000B7090008B7090008B7090008B70900085F
:10018000B7090008B7090008B7090008B70900084F
:10019000B7090008B7090008B7090008B70900083F
:1001A000B7090008B7090008B7090008B70900082F
:1001B000B7090008B7090008B7090008B70900081F
:1001C000B7090008B7090008B7090008B70900080F
:1001D000B7090008B7090008B7090008B7090008FF
:1001E000B7090008B7090008B7090008B7090008EF
:1001F000B7090008B7090008B7090008B7090008DF
:10020000B7090008B7090008B7090008B7090008CE
:10021000B7090008B7090008B7090008B7090008BE
:10022000B7090008B7090008B7090008B7090008AE
:10023000B7090008B7090008B7090008B70900089E
:10024000B7090008B7090008B7090008B70900088E
:10025000B7090008B7090008B7090008B70900087E
:10026000B7090008B7090008B7090008B70900086E
:10027000B7090008B7090008B7090008B70900085E
:10028000B7090008B7090008B7090008B70900084E
:10029000B7090008B709000880B500AF41F604406F
:1002A00000F07CFB082300220121104800F02BF90C
:1002B0000823002200210D4800F045F908210B48D1
:1002C00000F012F90A4B1B68094A43F4807313606B
:1002D00041F6024000F062FB4FF40053022200217D
:1002E000044800F010F900BF80BD00BF00100258A4
:1002F000004802580008025880B500AF4FF4407023
:1003000000F0CFFB00F02CF84FF47A7000F0BCF84E
:10031000FFF7C2FF4FF400510F4800F0E8F8034622
:10032000002BF7D0142000F095F84FF400510A4844
:1003300000F0DDF80346002B03D00821074800F049
:10034000D9F800BF4FF40051034800F0D0F803463D
:10035000002BF7D1DEE700BF00080258001002585A
:1003600080B58CB000AF3B462C220021184600F02F
:1003700091FC41F6074000F011FB41F6816000F06E
:100380000DFB022301220121304800F0BCF80223BA
:10039000022200212D4800F0D6F80023FB6203E082
:1003A00000BFFB6A0133FB62FB6A132BF8D9022101
:1003B000264800F097F800233B7002237B70244B03
:1003C0007B6005233B72C0237B8102233B730223A6
:1003D0007B730223BB7320233B7481237B82022324
:1003E0003B7502237B750223BB7520233B7681235B
:1003F0007B8302233B7702237B770223BB77002397
:1004000087F82030082387F82130042387F822302A
:10041000042387F82330042387F82430042387F843
:100420002530042387F82630012387F8273002235C
:1004300087F82830002387F829303B46184600F01B
:1004400063F900BF3037BD4680BD00BF001C0258B5
:1004500040787D0180B485B000AF7860094B1B689F
:10046000FB6001E030BF00BF064B1A68FB68D31A7F
:100470007A689A42F6D800BF00BF1437BD465DF8CF
:10048000047B70472400002080B582B000AF786004
:10049000042000F0E9FA002000F042FA02467B68EE
:1004A000B2FBF3F3013B184600F0D8FA00F0F4FA7F
:1004B0000F21FF2000F0FEFA00F0E0FA00F0E5FA6C
:1004C00000BF0837BD4680BD80B400AF044B1B6839
:1004D0000133034A136000BFBD465DF8047B7047DB
:1004E0002400002081617047090481617047006920
:1004F00008407047436901EA030221EA030141EA27
:100500000241816170472DE9F04105680026C46809
:100510004FF0030E43FA06F7FF070DD577000EFAEA
:1005200007FC01FA07F802FA07F725EA0C0524EAA6
:100530000C0448EA05053C430136102EEAD105605B
:10054000C460BDE8F081012941680CBF194399439B
:10055000F0B5416000248168032643FA04F5ED07F5
:1005600007D5650006FA05F702FA05F521EA070145
:1005700029430134102CF0D18160F0BD2DE9F04306
:1005800091F800C0BCF1000F00F0A580012A26D030
:10059000574B9E1F022A18BF1E46013A554D002395
:1005A000B1F8028045F8323008F1FF3355F8324097
:1005B0002343D4B245F83230A700B0FBFCF34E48D9
:1005C000FFB2B3FBF0FCACF1030001284B4808D8A4
:1005D0000423D0F82CE4BB404EEA03030DE0484E60
:1005E000DBE7ACF1050EBEF1030F76D80823D0F897
:1005F0002C9403FA07FE4EEA0903C0F82C340CFBD6
:1006000008F3B3F5D27F09D8DFF8F0C00220DCF898
:100610002CE4B84040EA0E00CCF82C0467000879BE
:1006200004EB4404E4B2B0B155F832C000F1FF3E2F
:100630004CEA4E2CDFF8C4E045F832C04FF4803C61
:10064000DEF82C840CFA04FCB3FBF0F04CEA080C46
:10065000CEF82CC430804879B0B155F832C000F1E2
:10066000FF3E4CEA0E4CDFF894E045F832C04FF400
:10067000003CDEF82C840CFA04FCB3FBF0F04CEAEE
:10068000080CCEF82CC47080897999B155F83200E5
:1006900001F1FF3C40EA0C6045F832004FF4802243
:1006A0001648A240D0F82C54B3FBF1F32A43C0F80B
:1006B0002C24B380114AFFB24FF08073D2F800149B
:1006C000BB400B43C2F800344FF00073BB40D2F87C
:1006D00000141942FBD0BDE8F083DFF828E0734531
:1006E0008DD94FF00C0ED0F82C340EFA07FE73E7BC
:1006F0001A0000203044025840420F0000400258C7
:100700000E0000203F548900F8B5814B0446D3F811
:10071000002442F00102C3F80024D3F8102422F090
:100720000702C3F81024D3F8102412F0380FFAD1BE
:100730000122C3F8002494F8291094F8280000F04E
:100740002FFA94F8270000F057FA94F8260000F0EA
:10075000D3F994F82630002B00F0C58000F0BCF9E6
:1007600063688BB16A4BD3F8002442F48032C3F83B
:100770000024D3F800249203FBD563684FF47A7207
:10078000B3FBF2F3634A1384237C227A1B03617860
:1007900043EA0213227E0B4343EA02535C4AC2F847
:1007A0002834002900F0A2806568002304F10801C4
:1007B0002846C2F82C340122FFF7E0FE022204F1A1
:1007C00010012846FFF7DAFE2846032204F118013B
:1007D000FFF7D4FE23784F48002B40F08980C3896F
:1007E00094F8245000264A4F94F8201094F82120C1
:1007F00003800729C7F818644FEA0516D7F818C40C
:1008000046EA012646EA020646EA0C06C7F81864DC
:1008100006D90B2994BF0739063943FA01F18BB287
:10082000072A438009D90B2A95BF073A911F43FA3B
:1008300002F20B4194BF93B29BB2032D94F82310A4
:10084000334E8CBFEA1E1A464FF00005838084BFEA
:1008500043FA02F292B20329428194F82220C6F8A8
:100860001C544FEA01258CBF0339194645EA02158D
:10087000D6F81C7488BF43FA01F145EA070588BF22
:1008800089B2032AC6F81C548CBF033A1A46018168
:1008900088BF43FA02F294F8251088BF92B2032968
:1008A000C2801B4AD2F820444FF00004C2F8204412
:1008B000D2F8204444EA011484BF033943FA01F119
:1008C000C2F8204488BF8BB28381D2F8103443F041
:1008D0000303C2F81034D2F810340D4AC3F3C20334
:1008E000032B0FD1F8BD00F0FFF839E70A4D5CE7A4
:1008F000012B09BF63684023084AB3FBF2F308BF2A
:100900009BB26DE7D2F81034C3F3C203E8E700BF2F
:1009100000400258000000200090D00340420F0029
:1009200008B509282CD8DFE800F00A051C0A0D0DCF
:1009300010131619154B1888154B584308BD134B47
:100940005888F9E7114B9888F6E7104BD888F3E7F9
:100950000E4B1889F0E70D4B5889EDE70B4B988942
:10096000EAE70C4BD3F84C3413F0405FC3F3017249
:1009700008D0022A08D1054B188C4FF47A73DCE7B3
:1009800000F0A8F80448D9E70020D7E700000020CD
:1009900040420F00004002580090D003430901225A
:1009A00000F01F0003F1B043824003F511331968D2
:1009B0000A431A607047FEE77047000038B51D4AC9
:1009C0001D4B1E498B4220D31D4A0021934221D347
:1009D0004FF0E0231B4C1C4DD3F8142D42F4007251
:1009E000C3F8142DD3F8882D42F47002C3F8882D73
:1009F000AC4212D3154C164DAC4212D3154CFFF736
:100A00007BFC154DAC4210D338BD52F8040B43F8B3
:100A1000040BD7E743F8041BD8E754F8043B984786
:100A2000E6E754F8043B9847E6E754F8043B984758
:100A3000E8E700BF380D0008000000202400002077
:100A400028000020380D0008380D0008380D000877
:100A5000380D0008380D0008380D000820F07F40E0
:100A60004FF0E023586170474FF0E02200F004009F
:100A7000136923F004030343136170474FF0E0222E
:100A8000136943F00203136170474FF0E0221369CA
:100A900043F00103136170474FF0E02300229A6195
:100AA000704740F0BF604FF0E02340F40030C3F8DF
:100AB0000C0D7047952804D900F00F00044BC15469
:100AC000704700F1604000F564400170704700BF5E
:100AD00014ED00E0FEE70000024A136843F480735F
:100AE0001360704700200052024A136823F4807399
:100AF0001360704700200052034A136823F00F036D
:100B000003431360704700BF00200052044AD2F82C
:100B10000C3823F0070343F00203C2F80C38704787
:100B200000400258044AD2F80C3823F0070343F07F
:100B30000603C2F80C3870470040025808B50B0194
:100B400070B943F0040309485242D0F80C1802F07F
:100B5000020221F03F010A431A43C0F80C2808BDE5
:100B600009B9FFF7B7FF43F00C03ECE70040025868
:100B7000044AD2F80C3823F0070343F00103C2F80B
:100B80000C38704700400258044AD2F80C3823F061
:100B9000070343F00503C2F80C38704700400258C1
:100BA00008B5072807D8DFE800F0040C0F12121D63
:100BB0001D21FFF7B7FF0F4AD2F804389B04FBD57D
:100BC00008BDFFF7E1FFF6E7FFF7A0FFF3E7A0F1AD
:100BD000040C0021DCF1000242EB0C020020FFF7C4
:100BE000ADFFE8E7053842424241F7E7FFF7C0FFB3
:100BF000E1E700BF00400258F8B5074608B9FFF723
:100C000069FF204B421E204E1B68C3F30B03B3F554
:100C1000906F0FD1D6F818381C4923F440438A5CF2
:100C200043EA8233C6F81838174AD2F818389B04BA
:100C3000FBD5F8BD1649B3F58A6FD6F818588C5C09
:100C400025F440454FEA843418D141F68160FFF71E
:100C5000A5FE012F4FF0B0430AD145F44045C6F838
:100C60001858D3F82C2442F00102C3F82C24DBE7F7
:100C7000D3F82C2422F00102C3F82C242C43C6F80C
:100C80001848D1E70010005C00400258340D0008FD
:100C9000300D0008830730B546D08418844604E040
:100CA00003F8011B9D0704D09C46A4456346F7D179
:100CB00030BD013A0244A2EB0C02032A29D9CCB27E
:100CC00004EB04240F2A04EB04442FD9A2F1100CE6
:100CD0002CF00F0C03F11005AC44C3E90044C3E948
:100CE000024410336345F8D112F00C0F02F00F0EDE
:100CF00018D02EF0030C9C44AEF104051A4642F8BD
:100D0000044B6245FBD125F0030404330EF00302CB
:100D10002344002ACCD0C9B21A4403F8011B9342E1
:100D2000FBD130BD7246F4E70346C6E79646E0E7DE
:080D30000003020103020100AF
:100D380040004000400040004000400040000000EB
:100D4800000000000000000000000000000000009B
:040D58000000000097
:04000005080009BD29
:00000001FF

1902
1gpio/bin/gpio.list Executable file

File diff suppressed because it is too large Load Diff

1018
1gpio/bin/gpio.map Normal file

File diff suppressed because it is too large Load Diff

217
1gpio/bin/gpio.srec Executable file
View File

@@ -0,0 +1,217 @@
S02B00002F686F6D652F74696D652F646F632F636F646566696C652F656D62652F426C6F672F73746D33322FBD
S3150800000000000220BD090008B9090008B709000860
S31508000010B7090008B7090008B7090008000000007A
S31508000020000000000000000000000000B9090008F8
S31508000030B909000800000000B9090008C904000849
S31508000040B7090008B7090008B7090008B709000882
S31508000050B7090008B7090008B7090008B709000872
S31508000060B7090008B7090008B7090008B709000862
S31508000070B7090008B7090008B7090008B709000852
S31508000080B7090008B7090008B7090008B709000842
S31508000090B7090008B7090008B7090008B709000832
S315080000A0B7090008B7090008B7090008B709000822
S315080000B0B7090008B7090008B7090008B709000812
S315080000C0B7090008B7090008B7090008B709000802
S315080000D0B7090008B7090008B7090008B7090008F2
S315080000E0B7090008B7090008B7090008B7090008E2
S315080000F0B7090008B7090008B7090008B7090008D2
S31508000100B7090008B7090008B7090008B7090008C1
S31508000110B7090008B7090008B7090008B7090008B1
S31508000120B7090008B7090008B7090008B7090008A1
S31508000130B7090008B7090008B7090008B709000891
S31508000140B7090008B7090008B7090008B709000881
S31508000150B7090008B7090008B7090008B709000871
S31508000160B7090008B7090008B7090008B709000861
S31508000170B7090008B7090008B7090008B709000851
S31508000180B7090008B7090008B7090008B709000841
S31508000190B7090008B7090008B7090008B709000831
S315080001A0B7090008B7090008B7090008B709000821
S315080001B0B7090008B7090008B7090008B709000811
S315080001C0B7090008B7090008B7090008B709000801
S315080001D0B7090008B7090008B7090008B7090008F1
S315080001E0B7090008B7090008B7090008B7090008E1
S315080001F0B7090008B7090008B7090008B7090008D1
S31508000200B7090008B7090008B7090008B7090008C0
S31508000210B7090008B7090008B7090008B7090008B0
S31508000220B7090008B7090008B7090008B7090008A0
S31508000230B7090008B7090008B7090008B709000890
S31508000240B7090008B7090008B7090008B709000880
S31508000250B7090008B7090008B7090008B709000870
S31508000260B7090008B7090008B7090008B709000860
S31508000270B7090008B7090008B7090008B709000850
S31508000280B7090008B7090008B7090008B709000840
S31508000290B7090008B709000880B500AF41F6044061
S315080002A000F07CFB082300220121104800F02BF9FE
S315080002B00823002200210D4800F045F908210B48C3
S315080002C000F012F90A4B1B68094A43F4807313605D
S315080002D041F6024000F062FB4FF40053022200216F
S315080002E0044800F010F900BF80BD00BF0010025896
S315080002F0004802580008025880B500AF4FF4407015
S3150800030000F0CFFB00F02CF84FF47A7000F0BCF840
S31508000310FFF7C2FF4FF400510F4800F0E8F8034614
S31508000320002BF7D0142000F095F84FF400510A4836
S3150800033000F0DDF80346002B03D00821074800F03B
S31508000340D9F800BF4FF40051034800F0D0F803462F
S31508000350002BF7D1DEE700BF00080258001002584C
S3150800036080B58CB000AF3B462C220021184600F021
S3150800037091FC41F6074000F011FB41F6816000F060
S315080003800DFB022301220121304800F0BCF80223AC
S31508000390022200212D4800F0D6F80023FB6203E074
S315080003A000BFFB6A0133FB62FB6A132BF8D90221F3
S315080003B0264800F097F800233B7002237B70244BF5
S315080003C07B6005233B72C0237B8102233B73022398
S315080003D07B730223BB7320233B7481237B82022316
S315080003E03B7502237B750223BB7520233B7681234D
S315080003F07B8302233B7702237B770223BB77002389
S3150800040087F82030082387F82130042387F822301C
S31508000410042387F82330042387F82430042387F835
S315080004202530042387F82630012387F8273002234E
S3150800043087F82830002387F829303B46184600F00D
S3150800044063F900BF3037BD4680BD00BF001C0258A7
S3150800045040787D0180B485B000AF7860094B1B6891
S31508000460FB6001E030BF00BF064B1A68FB68D31A71
S315080004707A689A42F6D800BF00BF1437BD465DF8C1
S31508000480047B70472400002080B582B000AF7860F6
S31508000490042000F0E9FA002000F042FA02467B68E0
S315080004A0B2FBF3F3013B184600F0D8FA00F0F4FA71
S315080004B00F21FF2000F0FEFA00F0E0FA00F0E5FA5E
S315080004C000BF0837BD4680BD80B400AF044B1B682B
S315080004D00133034A136000BFBD465DF8047B7047CD
S315080004E02400002081617047090481617047006912
S315080004F008407047436901EA030221EA030141EA19
S315080005000241816170472DE9F04105680026C468FB
S315080005104FF0030E43FA06F7FF070DD577000EFADC
S3150800052007FC01FA07F802FA07F725EA0C0524EA98
S315080005300C0448EA05053C430136102EEAD105604D
S31508000540C460BDE8F081012941680CBF194399438D
S31508000550F0B5416000248168032643FA04F5ED07E7
S3150800056007D5650006FA05F702FA05F521EA070137
S3150800057029430134102CF0D18160F0BD2DE9F043F8
S3150800058091F800C0BCF1000F00F0A580012A26D022
S31508000590574B9E1F022A18BF1E46013A554D002387
S315080005A0B1F8028045F8323008F1FF3355F8324089
S315080005B02343D4B245F83230A700B0FBFCF34E48CB
S315080005C0FFB2B3FBF0FCACF1030001284B4808D896
S315080005D00423D0F82CE4BB404EEA03030DE0484E52
S315080005E0DBE7ACF1050EBEF1030F76D80823D0F889
S315080005F02C9403FA07FE4EEA0903C0F82C340CFBC8
S3150800060008F3B3F5D27F09D8DFF8F0C00220DCF88A
S315080006102CE4B84040EA0E00CCF82C0467000879B0
S3150800062004EB4404E4B2B0B155F832C000F1FF3E21
S315080006304CEA4E2CDFF8C4E045F832C04FF4803C53
S31508000640DEF82C840CFA04FCB3FBF0F04CEA080C38
S31508000650CEF82CC430804879B0B155F832C000F1D4
S31508000660FF3E4CEA0E4CDFF894E045F832C04FF4F2
S31508000670003CDEF82C840CFA04FCB3FBF0F04CEAE0
S31508000680080CCEF82CC47080897999B155F83200D7
S3150800069001F1FF3C40EA0C6045F832004FF4802235
S315080006A01648A240D0F82C54B3FBF1F32A43C0F8FD
S315080006B02C24B380114AFFB24FF08073D2F800148D
S315080006C0BB400B43C2F800344FF00073BB40D2F86E
S315080006D000141942FBD0BDE8F083DFF828E0734523
S315080006E08DD94FF00C0ED0F82C340EFA07FE73E7AE
S315080006F01A0000203044025840420F0000400258B9
S315080007000E0000203F548900F8B5814B0446D3F803
S31508000710002442F00102C3F80024D3F8102422F082
S315080007200702C3F81024D3F8102412F0380FFAD1B0
S315080007300122C3F8002494F8291094F8280000F040
S315080007402FFA94F8270000F057FA94F8260000F0DC
S31508000750D3F994F82630002B00F0C58000F0BCF9D8
S3150800076063688BB16A4BD3F8002442F48032C3F82D
S315080007700024D3F800249203FBD563684FF47A72F9
S31508000780B3FBF2F3634A1384237C227A1B03617852
S3150800079043EA0213227E0B4343EA02535C4AC2F839
S315080007A02834002900F0A2806568002304F10801B6
S315080007B02846C2F82C340122FFF7E0FE022204F193
S315080007C010012846FFF7DAFE2846032204F118012D
S315080007D0FFF7D4FE23784F48002B40F08980C38961
S315080007E094F8245000264A4F94F8201094F82120B3
S315080007F003800729C7F818644FEA0516D7F818C4FE
S3150800080046EA012646EA020646EA0C06C7F81864CE
S3150800081006D90B2994BF0739063943FA01F18BB279
S31508000820072A438009D90B2A95BF073A911F43FA2D
S3150800083002F20B4194BF93B29BB2032D94F8231096
S31508000840334E8CBFEA1E1A464FF00005838084BFDC
S3150800085043FA02F292B20329428194F82220C6F89A
S315080008601C544FEA01258CBF0339194645EA02157F
S31508000870D6F81C7488BF43FA01F145EA070588BF14
S3150800088089B2032AC6F81C548CBF033A1A4601815A
S3150800089088BF43FA02F294F8251088BF92B203295A
S315080008A0C2801B4AD2F820444FF00004C2F8204404
S315080008B0D2F8204444EA011484BF033943FA01F10B
S315080008C0C2F8204488BF8BB28381D2F8103443F033
S315080008D00303C2F81034D2F810340D4AC3F3C20326
S315080008E0032B0FD1F8BD00F0FFF839E70A4D5CE796
S315080008F0012B09BF63684023084AB3FBF2F308BF1C
S315080009009BB26DE7D2F81034C3F3C203E8E700BF21
S3150800091000400258000000200090D00340420F001B
S3150800092008B509282CD8DFE800F00A051C0A0D0DC1
S3150800093010131619154B1888154B584308BD134B39
S315080009405888F9E7114B9888F6E7104BD888F3E7EB
S315080009500E4B1889F0E70D4B5889EDE70B4B988934
S31508000960EAE70C4BD3F84C3413F0405FC3F301723B
S3150800097008D0022A08D1054B188C4FF47A73DCE7A5
S3150800098000F0A8F80448D9E70020D7E700000020BF
S3150800099040420F00004002580090D003430901224C
S315080009A000F01F0003F1B043824003F511331968C4
S315080009B00A431A607047FEE77047000038B51D4ABB
S315080009C01D4B1E498B4220D31D4A0021934221D339
S315080009D04FF0E0231B4C1C4DD3F8142D42F4007243
S315080009E0C3F8142DD3F8882D42F47002C3F8882D65
S315080009F0AC4212D3154C164DAC4212D3154CFFF728
S31508000A007BFC154DAC4210D338BD52F8040B43F8A5
S31508000A10040BD7E743F8041BD8E754F8043B984778
S31508000A20E6E754F8043B9847E6E754F8043B98474A
S31508000A30E8E700BF380D0008000000202400002069
S31508000A4028000020380D0008380D0008380D000869
S31508000A50380D0008380D0008380D000820F07F40D2
S31508000A604FF0E023586170474FF0E02200F0040091
S31508000A70136923F004030343136170474FF0E02220
S31508000A80136943F00203136170474FF0E0221369BC
S31508000A9043F00103136170474FF0E02300229A6187
S31508000AA0704740F0BF604FF0E02340F40030C3F8D1
S31508000AB00C0D7047952804D900F00F00044BC1545B
S31508000AC0704700F1604000F564400170704700BF50
S31508000AD014ED00E0FEE70000024A136843F4807351
S31508000AE01360704700200052024A136823F480738B
S31508000AF01360704700200052034A136823F00F035F
S31508000B0003431360704700BF00200052044AD2F81E
S31508000B100C3823F0070343F00203C2F80C38704779
S31508000B2000400258044AD2F80C3823F0070343F071
S31508000B300603C2F80C3870470040025808B50B0186
S31508000B4070B943F0040309485242D0F80C1802F071
S31508000B50020221F03F010A431A43C0F80C2808BDD7
S31508000B6009B9FFF7B7FF43F00C03ECE7004002585A
S31508000B70044AD2F80C3823F0070343F00103C2F8FD
S31508000B800C38704700400258044AD2F80C3823F053
S31508000B90070343F00503C2F80C38704700400258B3
S31508000BA008B5072807D8DFE800F0040C0F12121D55
S31508000BB01D21FFF7B7FF0F4AD2F804389B04FBD56F
S31508000BC008BDFFF7E1FFF6E7FFF7A0FFF3E7A0F19F
S31508000BD0040C0021DCF1000242EB0C020020FFF7B6
S31508000BE0ADFFE8E7053842424241F7E7FFF7C0FFA5
S31508000BF0E1E700BF00400258F8B5074608B9FFF715
S31508000C0069FF204B421E204E1B68C3F30B03B3F546
S31508000C10906F0FD1D6F818381C4923F440438A5CE4
S31508000C2043EA8233C6F81838174AD2F818389B04AC
S31508000C30FBD5F8BD1649B3F58A6FD6F818588C5CFB
S31508000C4025F440454FEA843418D141F68160FFF710
S31508000C50A5FE012F4FF0B0430AD145F44045C6F82A
S31508000C601858D3F82C2442F00102C3F82C24DBE7E9
S31508000C70D3F82C2422F00102C3F82C242C43C6F8FE
S31508000C801848D1E70010005C00400258340D0008EF
S31508000C90300D0008830730B546D08418844604E032
S31508000CA003F8011B9D0704D09C46A4456346F7D16B
S31508000CB030BD013A0244A2EB0C02032A29D9CCB270
S31508000CC004EB04240F2A04EB04442FD9A2F1100CD8
S31508000CD02CF00F0C03F11005AC44C3E90044C3E93A
S31508000CE0024410336345F8D112F00C0F02F00F0ED0
S31508000CF018D02EF0030C9C44AEF104051A4642F8AF
S31508000D00044B6245FBD125F0030404330EF00302BD
S31508000D102344002ACCD0C9B21A4403F8011B9342D3
S31508000D20FBD130BD7246F4E70346C6E79646E0E7D0
S30D08000D300003020103020100A1
S31508000D3840004000400040004000400040000000DD
S31508000D48000000000000000000000000000000008D
S30908000D580000000089
S705080009BD2C

117
1gpio/cortex-m-generic.ld Normal file
View File

@@ -0,0 +1,117 @@
MEMORY
{
rom (rx) : ORIGIN = 0x08000000, LENGTH = 0x200000 /* Flash 2MB */
ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x20000 /* 128 KB */
ram2 (rwx) : ORIGIN = 0x24000000, LENGTH = 0x80000 /* 512 KB */
}
/* Enforce emmition of the vector table. */
EXTERN (vector_table)
/* Define the entry point of the output file. */
ENTRY(reset_handler)
/* Define sections. */
SECTIONS
{
.text : {
*(.vectors) /* Vector table */
*(.text*) /* Program code */
. = ALIGN(4);
*(.rodata*) /* Read-only data */
. = ALIGN(4);
} >rom
/* C++ Static constructors/destructors, also used for __attribute__
* ((constructor)) and the likes */
.preinit_array : {
. = ALIGN(4);
__preinit_array_start = .;
KEEP (*(.preinit_array))
__preinit_array_end = .;
} >rom
.init_array : {
. = ALIGN(4);
__init_array_start = .;
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
__init_array_end = .;
} >rom
.fini_array : {
. = ALIGN(4);
__fini_array_start = .;
KEEP (*(.fini_array))
KEEP (*(SORT(.fini_array.*)))
__fini_array_end = .;
} >rom
/*
* Another section used by C++ stuff, appears when using newlib with
* 64bit (long long) printf support
*/
.ARM.extab : {
*(.ARM.extab*)
} >rom
.ARM.exidx : {
__exidx_start = .;
*(.ARM.exidx*)
__exidx_end = .;
} >rom
. = ALIGN(4);
_etext = .;
/* ram, but not cleared on reset, eg boot/app comms */
.noinit (NOLOAD) : {
*(.noinit*)
} >ram
. = ALIGN(4);
.data : {
_data = .;
*(.data*) /* Read-write initialized data */
*(.ramtext*) /* "text" functions to run in ram */
. = ALIGN(4);
_edata = .;
} >ram AT >rom
_data_loadaddr = LOADADDR(.data);
.bss : {
*(.bss*) /* Read-write zero initialized data */
*(COMMON)
. = ALIGN(4);
_ebss = .;
} >ram
/*
* The .eh_frame section appears to be used for C++ exception handling.
* You may need to fix this if you're using C++.
*/
/DISCARD/ : { *(.eh_frame) }
/* Heap 分配到第二块 RAM */
.heap : {
_sheap = .;
. = ORIGIN(ram2) + LENGTH(ram2);
_eheap = .;
} >ram2
/* 第二块 RAM,用于大数组或 heap */
/*
.ext_ram (NOLOAD) : {
_sext_ram = .;
*(.ext_ram*)
*(.bss_ext_ram*)
. = ALIGN(4);
_eext_ram = .;
} > ram2
*/
. = ALIGN(4);
end = .;
}
PROVIDE(_stack = ORIGIN(ram) + LENGTH(ram));
PROVIDE(_sheap = ORIGIN(ram2));
PROVIDE(_eheap = ORIGIN(ram2) + LENGTH(ram2));

68
1gpio/makefile Normal file
View File

@@ -0,0 +1,68 @@
# this is the build file for project stm32h7
# it is autogenerated by the xmake build system.
# do not edit by hand.
ifneq ($(VERBOSE),1)
VV=@
endif
CXX=/usr/bin/g++
CU=/usr/bin/clang
MM=/usr/bin/gcc
GC=/usr/local/go/bin/go
AS=/usr/bin/gcc
CC=/usr/bin/gcc
RC=/home/time/.cargo/bin/rustc
MXX=/usr/bin/g++
LD=/usr/bin/g++
RCLD=/home/time/.cargo/bin/rustc
GCLD=/usr/local/go/bin/go
SH=/usr/bin/g++
RCSH=/home/time/.cargo/bin/rustc
AR=/usr/bin/ar
RCAR=/home/time/.cargo/bin/rustc
GCAR=/usr/local/go/bin/go
gpio_LD=/home/time/doc/mybin/arm-none-eabi/bin/arm-none-eabi-g++
gpio_CC=/home/time/doc/mybin/arm-none-eabi/bin/arm-none-eabi-gcc
gpio_CCFLAGS=-g -O0 -Iuser/inc -I../../libopencm3/include -DSTM32H7 -mthumb -mcpu=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard
gpio_LDFLAGS=-L../../libopencm3/lib -lopencm3_stm32h7 -lc -lgcc -lnosys -mthumb -mcpu=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard -T./cortex-m-generic.ld --static -nostartfiles -Wl,--gc-sections -Wl,-Map=/home/time/doc/codefile/embe/Blog/stm32/stm32h7/1gpio_xmake/bin/gpio.map
default: gpio
all: gpio
.PHONY: default all gpio
gpio: bin/gpio.elf
bin/gpio.elf: build/.objs/gpio/linux/arm32/release/user/src/gpio.c.o build/.objs/gpio/linux/arm32/release/user/src/main.c.o build/.objs/gpio/linux/arm32/release/user/src/systick.c.o
@echo linking.release gpio.elf
@mkdir -p bin
$(VV)$(gpio_LD) -o bin/gpio.elf build/.objs/gpio/linux/arm32/release/user/src/gpio.c.o build/.objs/gpio/linux/arm32/release/user/src/main.c.o build/.objs/gpio/linux/arm32/release/user/src/systick.c.o $(gpio_LDFLAGS)
build/.objs/gpio/linux/arm32/release/user/src/gpio.c.o: user/src/gpio.c
@echo compiling.release user/src/gpio.c
@mkdir -p build/.objs/gpio/linux/arm32/release/user/src
$(VV)$(gpio_CC) -c $(gpio_CCFLAGS) -o build/.objs/gpio/linux/arm32/release/user/src/gpio.c.o user/src/gpio.c
build/.objs/gpio/linux/arm32/release/user/src/main.c.o: user/src/main.c
@echo compiling.release user/src/main.c
@mkdir -p build/.objs/gpio/linux/arm32/release/user/src
$(VV)$(gpio_CC) -c $(gpio_CCFLAGS) -o build/.objs/gpio/linux/arm32/release/user/src/main.c.o user/src/main.c
build/.objs/gpio/linux/arm32/release/user/src/systick.c.o: user/src/systick.c
@echo compiling.release user/src/systick.c
@mkdir -p build/.objs/gpio/linux/arm32/release/user/src
$(VV)$(gpio_CC) -c $(gpio_CCFLAGS) -o build/.objs/gpio/linux/arm32/release/user/src/systick.c.o user/src/systick.c
clean: clean_gpio
clean_gpio:
@rm -rf bin/gpio.elf
@rm -rf bin/gpio.sym
@rm -rf build/.objs/gpio/linux/arm32/release/user/src/gpio.c.o
@rm -rf build/.objs/gpio/linux/arm32/release/user/src/main.c.o
@rm -rf build/.objs/gpio/linux/arm32/release/user/src/systick.c.o

8
1gpio/user/inc/gpio.h Normal file
View File

@@ -0,0 +1,8 @@
#ifndef _GPIO_H
#define _GPIO_H
#include "main.h"
void user_gpio_setup(void);
#endif

17
1gpio/user/inc/main.h Normal file
View File

@@ -0,0 +1,17 @@
#ifndef _MAIN_H
#define _MAIN_H
#include <stdint.h>
// 包含libopencm3内核的相关头文件
#include <libopencm3/cm3/systick.h> // 系统滴答定时器相关定义
#include <libopencm3/cm3/scb.h> // 系统控制块相关定义
// 包含STM32 H系列微控制器的相关头文件
#include <libopencm3/stm32/rcc.h> // 复位和时钟控制相关定义
#include <libopencm3/stm32/pwr.h> // 电源控制相关定义
#include <libopencm3/stm32/gpio.h> // 通用输入输出相关定义
#include <libopencm3/stm32/flash.h> // 闪存控制相关定义
#include <libopencm3/stm32/h7/nvic.h> // 中断向量控制器相关定义
#endif

11
1gpio/user/inc/systick.h Normal file
View File

@@ -0,0 +1,11 @@
#ifndef _SYSTICK_H
#define _SYSTICK_H
#include "main.h"
extern volatile uint32_t systick;
void user_delay_ms(uint32_t ms);
void systick_init(uint32_t ticks);
#endif

47
1gpio/user/src/gpio.c Normal file
View File

@@ -0,0 +1,47 @@
#include "gpio.h"
/**
* @brief 初始化用户GPIO引脚配置
*
* @details 该函数用于初始化和配置用户所需的GPIO引脚,主要包括以下配置:
* 1. 使能GPIOE时钟,配置PE3引脚为推挽输出模式,速度为2MHz,初始状态为低电平
* 2. 使能备份区域寄存器访问通过设置PWR_CR1_DBP位
* 3. 使能GPIOC时钟,配置PC13引脚为输入模式,并启用下拉电阻
* 这些配置通常用于设置LED控制引脚和按钮输入引脚等常见外设接口。
*
* @note 该函数应在系统初始化阶段调用,确保GPIO引脚在使用前已正确配置。
* PE3引脚配置为输出模式,可用于驱动LED或其他输出设备。
* PC13引脚配置为输入模式并启用下拉电阻,适合连接按钮或开关等输入设备。
* PWR_CR1_DBP位的设置允许访问备份寄存器,这在某些应用中可能是必要的。
*
* @warning 在调用此函数前,应确保系统时钟已经正确配置。
* 修改GPIO配置可能会影响连接到这些引脚的外设功能。
* 在多任务系统中,如果多个任务访问同一GPIO,可能需要添加同步机制。
*
* @see rcc_periph_clock_enable(), gpio_mode_setup(), gpio_set_output_options(), gpio_clear()
*/
void user_gpio_setup(void)
{
// 使能GPIOE端口的时钟,必须先使能时钟才能配置和使用该端口的引脚
rcc_periph_clock_enable(RCC_GPIOE);
// 配置GPIOE端口的引脚3为输出模式,不使用上拉或下拉电阻
gpio_mode_setup(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO3);
// 设置GPIOE端口引脚3的输出选项推挽输出类型,速度为2MHz
gpio_set_output_options(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, GPIO3);
// 将GPIOE端口引脚3设置为低电平,也就是灯灭
gpio_clear(GPIOE, GPIO3);
// 使能备份域访问,通过设置电源控制寄存器1的DBP位
// 这是访问RTC、备份寄存器等备份域外设的必要步骤
// PC13-PC15是备份域的GPIO引脚,需要使能备份域访问才能配置这些引脚
PWR_CR1 |= PWR_CR1_DBP;
// 使能GPIOC端口的时钟,必须先使能时钟才能配置和使用该端口的引脚
rcc_periph_clock_enable(RCC_GPIOC);
// 配置GPIOC端口的引脚13为输入模式,并启用下拉电阻
gpio_mode_setup(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_PULLDOWN, GPIO13);
}

174
1gpio/user/src/main.c Normal file
View File

@@ -0,0 +1,174 @@
#include "main.h"
#include "gpio.h"
#include "systick.h"
static void system_clock_setup(void);
/**
* @brief 主函数,程序入口点
*
* @details 该函数是程序的入口点,负责系统的初始化和主循环。主要执行以下步骤:
* 1. 设置中断优先级分组为16个优先级,无子优先级
* 2. 初始化系统时钟配置
* 3. 初始化SysTick定时器,设置为每毫秒产生一次中断
* 4. 初始化用户GPIO引脚配置
* 5. 进入主循环,检测按钮状态并控制LED
* 主循环中检测PC13引脚按钮的状态,当检测到按钮按下时,
* 进行消抖处理,然后切换PE3引脚LED的状态,并等待按钮释放。
*
* @note 该函数不会返回,除非发生严重错误。
* 主循环中的按钮检测包含了简单的消抖处理,通过延时和再次检测实现。
* 程序使用了轮询方式检测按钮状态,适用于简单的嵌入式应用。
*
* @warning 在修改此函数时,应确保系统初始化顺序正确,特别是时钟配置。
* 按钮消抖延时时间(20ms)可能需要根据实际硬件特性进行调整。
* 如果使用RTOS,此函数结构需要重新设计以适应任务调度。
*
* @see scb_set_priority_grouping(), system_clock_setup(), systick_init(),
* user_gpio_setup(), user_delay_ms(), gpio_get(), gpio_toggle()
*/
int main(void)
{
// 设置中断优先级分组为16个主优先级,无子优先级
// 这意味着每个中断都有独立的优先级,没有子优先级用于同一优先级中断的排序
scb_set_priority_grouping(SCB_AIRCR_PRIGROUP_GROUP16_NOSUB);
// 初始化系统时钟配置
system_clock_setup();
// 初始化SysTick定时器,参数1000U表示每秒产生1000次中断,即每1ms一次
systick_init(1000U);
// 初始化用户GPIO引脚配置
// 根据gpio的代码,这包括配置PE3为输出LED和PC13为输入按钮
user_gpio_setup();
// 主循环,程序将在此无限循环
while (1)
{
// 检测PC13引脚按钮的状态,如果为高电平(按钮按下)则执行以下代码
if(gpio_get(GPIOC, GPIO13))
{
// 延时20ms,用于按钮消抖
// 按钮在按下和释放时会产生机械抖动,延时可以避免误检测
user_delay_ms(20);
// 再次检测按钮状态,确认按钮确实被按下(不是抖动)
if(gpio_get(GPIOC, GPIO13))
{
// 切换PE3引脚LED的状态
// 如果LED当前是亮的状态,则熄灭;如果是灭的状态,则点亮
gpio_toggle(GPIOE, GPIO3);
}
// 等待按钮释放
// 这是一个空循环,一直检测直到按钮被释放PC13变为低电平
// 这样可以防止在按钮按住期间多次触发LED切换
while(gpio_get(GPIOC, GPIO13));
}
}
// 理论上不会执行到这里,因为上面是无限循环
// 这行代码主要是为了满足C语言标准中main函数应有返回值的要求
return 0;
}
/**
* @brief 系统时钟配置函数
*
* @details 该函数用于初始化和配置系统的时钟树,包括PLL锁相环、系统时钟分频、Flash等待状态
* 和电源管理设置。函数执行以下主要步骤:
* 1. 初始化GPIOH和SYSCFG时钟,配置GPIOH1引脚为输出模式
* 2. 设置PLL配置结构体的各个参数,包括时钟源选择、PLL分频系数等
* 3. 配置系统时钟分频参数,确定各个总线的时钟频率
* 4. 设置Flash等待状态,确保Flash访问速度与系统时钟频率匹配
* 5. 配置电压缩放比例和电源模式
* 6. 应用PLL配置,完成系统时钟设置
* 这些配置参数与STM32CubeMX工具生成的配置可以一一对应,便于调试和验证。
*
* @note 该函数应在系统启动初期调用,确保系统时钟正确配置后再进行其他初始化。
* 函数中配置的GPIOH1引脚可能用于指示时钟配置状态或调试目的。
* PLL配置基于25MHz的外部高速晶振(HSE),通过PLL1产生系统时钟。
* PLL2和PLL3可用于为特定外设提供时钟。
* 系统时钟配置完成后,CPU将运行在较高频率(约480MHz),具体取决于PLL1配置。
*
* @warning 修改此函数中的时钟配置参数时,应确保不超过芯片的最大工作频率限制。
* 不正确的时钟配置可能导致系统不稳定或无法正常工作。
* 修改时钟配置可能会影响依赖于精确时序的外设(如UART、SPI等)。
* 在多任务系统中,修改系统时钟可能需要重新调整定时器和调度器的配置。
*
* @see rcc_periph_clock_enable(), gpio_mode_setup(), gpio_set_output_options(),
* gpio_set(), rcc_clock_setup_pll()
*/
static void system_clock_setup(void)
{
// 初始化PLL配置结构体,所有成员清零
struct rcc_pll_config pll_config = {0};
// 使能GPIOH端口时钟,用于配置GPIOH1引脚
// OSC_IN是GPIOH0,OSC_OUT是GPIOH1
rcc_periph_clock_enable(RCC_GPIOH);
// 使能SYSCFG时钟,用于系统配置
rcc_periph_clock_enable(RCC_SYSCFG);
// 配置GPIOH1引脚为输出模式,启用上拉电阻
gpio_mode_setup(GPIOH, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO1);
// 设置GPIOH1引脚为推挽输出,速度为50MHz
gpio_set_output_options(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO1);
// 短暂延时,确保GPIO配置稳定
for (unsigned i = 0; i < 20; i++)
{
__asm__("nop"); // 空操作指令,用于延时
}
// 将GPIOH1引脚设置为高电平
gpio_set(GPIOH, GPIO1);
// 设置系统时钟源为PLL
pll_config.sysclock_source = RCC_PLL;
// 设置PLL时钟源为外部高速晶振(HSE)
pll_config.pll_source = RCC_PLLCKSELR_PLLSRC_HSE;
// 设置HSE频率为25MHz
pll_config.hse_frequency = 25000000U;
// 配置PLL1参数,这一部分可以和CubeMX进行一一对应
// 系统时钟频率 = HSE / M * N / P = 25MHz / 5 * 192 / 2 = 480MHz
pll_config.pll1.divm = 5;
pll_config.pll1.divn = 192;
pll_config.pll1.divp = 2;
pll_config.pll1.divq = 2;
pll_config.pll1.divr = 2;
// 配置PLL2参数
pll_config.pll2.divm = 32;
pll_config.pll2.divn = 129;
pll_config.pll2.divp = 2;
pll_config.pll2.divq = 2;
pll_config.pll2.divr = 2;
// 配置PLL3参数
pll_config.pll3.divm = 32;
pll_config.pll3.divn = 129;
pll_config.pll3.divp = 2;
pll_config.pll3.divq = 2;
pll_config.pll3.divr = 2;
// 配置系统时钟分频参数,还是可以和CubeMX进行一一对应
pll_config.core_pre = RCC_D1CFGR_D1CPRE_BYP; // CPU核心时钟不分频
pll_config.hpre = RCC_D1CFGR_D1HPRE_DIV2; // AHB总线时钟2分频
pll_config.ppre1 = RCC_D2CFGR_D2PPRE_DIV2; // APB1总线时钟2分频
pll_config.ppre2 = RCC_D2CFGR_D2PPRE_DIV2; // APB2总线时钟2分频
pll_config.ppre3 = RCC_D1CFGR_D1PPRE_DIV2; // APB3总线时钟2分频
pll_config.ppre4 = RCC_D3CFGR_D3PPRE_DIV2; // APB4总线时钟2分频
// 设置Flash等待状态为4个周期,确保在480MHz系统时钟下能正确访问Flash
pll_config.flash_waitstates = FLASH_ACR_LATENCY_4WS;
// 配置电压缩放和电源模式
pll_config.voltage_scale = PWR_VOS_SCALE_0; // 电压缩放级别0,最高性能模式
pll_config.power_mode = PWR_SYS_LDO; // 使用LDO(低压差线性稳压器)电源模式
pll_config.smps_level = 0; // SMPS(开关模式电源)级别
// 应用PLL配置,完成系统时钟设置
rcc_clock_setup_pll(&pll_config);
}

145
1gpio/user/src/systick.c Normal file
View File

@@ -0,0 +1,145 @@
#include "systick.h"
/**
* @brief 系统毫秒计数器
*
* @details 这是一个全局变量,用于记录系统运行的毫秒数。
* 该变量在SysTick定时器中断服务程序(sys_tick_handler)中递增,
* 通常用于实现系统计时和延时功能如user_delay_ms函数
* 变量被声明为volatile,确保编译器不会优化掉对它的访问,
* 因为它可以在中断上下文中被修改,而主程序可能需要读取它的值。
*
* @note 该变量的初始值为0,表示系统启动后经过的毫秒数。
* 变量的递增频率取决于SysTick定时器的配置,通常为每毫秒递增一次。
* 在32位系统上,该变量约每49.7天会溢出一次从2^32-1回到0
*
* @warning 在多任务或多线程环境中访问此变量时,可能需要添加适当的同步机制,
* 如禁用中断或使用原子操作,以避免竞态条件。
* 不应直接修改此变量的值,除非有特殊需求并了解其影响。
*
* @see sys_tick_handler(), user_delay_ms(), systick_init()
*/
volatile uint32_t systick = 0;
/**
* @brief 执行WFI(Wait For Interrupt)指令,使处理器进入低功耗状态
*
* @details 该函数使用内联汇编执行ARM Cortex-M处理器的WFI指令。
* WFI指令会使处理器进入低功耗状态,直到下一个中断发生时才会唤醒处理器。
* 该函数被声明为静态内联(always_inline),确保总是被内联展开以减少函数调用开销。
* 使用volatile关键字防止编译器优化掉看似"无用"的指令。
*
* @note 该函数不会改变处理器状态,只是暂停执行直到中断发生。
* 在中断发生时,处理器会恢复执行WFI指令之后的代码。
* 该函数通常用于在等待事件或延时期间降低系统功耗。
*
* @warning 使用该函数时,确保系统中存在能够唤醒处理器的中断源,
* 否则处理器可能会一直保持低功耗状态。
*/
static inline __attribute__((always_inline)) void __WFI(void)
{
__asm volatile("wfi");
}
/**
* @brief 实现毫秒级延时的函数
*
* @details 该函数使用SysTick定时器实现精确的毫秒级延时。函数记录当前的SysTick值作为起始时间,
* 然后进入循环等待,直到经过的时间达到指定的毫秒数。在等待期间,CPU会通过WFI指令
* 进入低功耗状态,以降低系统功耗。该函数适用于裸机系统中的简单延时需求。
*
* @param ms 要延时的毫秒数,取值范围为1到(2^32-1)毫秒。
*
* @note 该函数是阻塞式的,在延时期间CPU无法执行其他任务。
* 函数依赖于全局变量systick的正确更新,通常systick在SysTick中断服务程序中递增。
* SysTick定时器应配置为每毫秒产生一次中断。
* 函数内部使用了WFI指令降低功耗,但实际延时的精度取决于中断的频率和响应时间。
*
* @warning 如果系统中没有中断或中断被禁用,使用此函数可能导致系统死锁。
* 在实时性要求高的系统中,应谨慎使用阻塞式延时函数。
* 最大延时时间受限于32位无符号整数的最大值(约49.7天)。
*
* @see systick, __WFI()
*/
void user_delay_ms(uint32_t ms)
{
// 记录开始延时的时刻systick的当前值
uint32_t start = systick;
// 循环等待,直到经过的时间达到指定的毫秒数
while (systick - start < ms)
{
// 进入低功耗模式,等待中断唤醒,有助于在延时时降低CPU功耗
__WFI();
}
}
/**
* @brief 初始化SysTick定时器
*
* @details 该函数用于初始化和配置ARM Cortex-M的SysTick定时器,使其能够以指定的频率产生中断。
* 函数执行以下配置步骤:
* 1. 设置SysTick时钟源为AHB总线时钟
* 2. 根据指定的中断频率计算并设置重载值
* 3. 清除当前计数值
* 4. 设置中断优先级
* 5. 使能中断和计数器
* 配置完成后,SysTick定时器将开始工作,并在每次计数到0时产生中断。
*
* @param ticks 指定SysTick定时器的中断频率,单位为Hz每秒中断次数
* 例如,传入1000表示定时器每1秒产生1000次中断,即每1毫秒产生一次中断。
*
* @note 该函数依赖于rcc_get_bus_clk_freq()函数获取CPU时钟频率。
* SysTick中断优先级被设置为15最低优先级,在需要更高实时性的应用中可能需要调整。
* 函数使用了库函数封装的方式操作SysTick寄存器,而不是直接寄存器访问。
* 重载值的计算方式为:(CPU时钟频率 / ticks) - 1,确保ticks值不能导致计算结果超过24位最大值(16,777,215)。
*
* @warning 如果ticks参数过大,可能导致重载值小于1,此时定时器可能无法正常工作。
* 在调用此函数前,应确保CPU时钟已经正确配置。
* 此函数会覆盖任何之前的SysTick配置,包括中断处理函数的注册。
*
* @see sys_tick_handler(), systick, user_delay_ms()
*/
void systick_init(uint32_t ticks)
{
// 设置SysTick时钟源为AHB总线时钟
systick_set_clocksource(STK_CSR_CLKSOURCE_AHB);
// 计算重载值总线频率除以定时器周期数减1
systick_set_reload((rcc_get_bus_clk_freq(RCC_CPUCLK) / ticks) - 1UL);
// 清除SysTick当前值寄存器被注释掉的代码
//STK_CVR = 0UL;
// 使用函数方式清除SysTick计数器
systick_clear();
// 设置SysTick中断优先级为15最低优先级
nvic_set_priority(NVIC_SYSTICK_IRQ, 15);
// 使用函数方式配置SysTick控制寄存器被注释掉的代码
// STK_CSR = STK_CSR_CLKSOURCE | STK_CSR_TICKINT | STK_CSR_ENABLE;
// 分别使能SysTick中断和计数器
systick_interrupt_enable();
systick_counter_enable();
}
/**
* @brief SysTick定时器中断服务函数
*
* @details 该函数是SysTick定时器的中断服务程序(ISR),每当SysTick定时器计数到0时触发。
* 函数的主要功能是递增全局变量systick,该变量通常用于系统计时和延时功能。
*
* @note 该函数应保持简短高效,因为它是中断服务程序,执行时间过长可能影响系统实时性。
* systick变量通常定义为全局变量,用于记录系统运行的毫秒数假设SysTick配置为1ms中断一次
* 在多任务系统中,此函数可能需要添加任务切换相关的代码。
*
* @warning 此函数不应被用户代码直接调用,它是由硬件自动调用的中断服务程序。
* 在函数内部应避免调用可能导致长时间阻塞的函数或复杂的计算。
* 如果systick变量在多线程/多任务环境中被访问,可能需要添加适当的同步机制。
*
* @see systick, systick_init(), user_delay_ms()
*/
void sys_tick_handler(void)
{
systick++;
}

101
1gpio/xmake.lua Normal file
View File

@@ -0,0 +1,101 @@
-- 工程名
set_project("stm32h7")
-- 定义工具链
toolchain("arm-none-eabi")
set_kind("standalone")
set_sdkdir("/home/time/doc/mybin/arm-none-eabi")
toolchain_end()
-- 使用自定义的 arm-none-eabi 工具链
set_toolchains("arm-none-eabi")
-- 设置平台与架构
set_plat("linux")
set_arch("arm32")
-- 编译优化与调试
set_optimize("none")
set_symbols("debug")
-- 目标程序
target("gpio")
-- 设置目标类型,编译为可执行文件
set_kind("binary")
-- 添加源文件
add_files("user/src/*.c")
-- 设置头文件路径
add_includedirs("user/inc", {public = true})
-- 设置输出目录
set_targetdir("$(projectdir)/bin")
-- 让 elf 文件名跟随 target 名
on_load(function (target)
target:set("filename", target:name() .. ".elf")
-- 同时设置 map 文件输出到 bin
target:add("ldflags",
"-Wl,-Map=" .. path.join(target:targetdir(), target:name() .. ".map"),
{force = true}
)
end)
-- 架构 & FPU
add_cxflags("-mthumb", "-mcpu=cortex-m7", "-mfpu=fpv5-d16", "-mfloat-abi=hard", {force = true})
add_asflags("-mthumb", "-mcpu=cortex-m7", "-mfpu=fpv5-d16", "-mfloat-abi=hard", {force = true})
add_ldflags("-mthumb", "-mcpu=cortex-m7", "-mfpu=fpv5-d16", "-mfloat-abi=hard", {force = true})
-- 头文件路径 (libopencm3)
add_includedirs("../../libopencm3/include", {public = true})
-- 链接 libopencm3
add_linkdirs("../../libopencm3/lib")
add_links("opencm3_stm32h7")
-- 额外链接选项
add_ldflags("-T./cortex-m-generic.ld", "--static", "-nostartfiles", "-Wl,--gc-sections", {force = true})
add_syslinks("c", "gcc", "nosys")
-- 预处理宏
add_defines("STM32H7")
-- 生成额外的二进制文件
after_build(function (target)
local elf = target:targetfile()
local bindir = target:targetdir()
local name = target:name()
os.execv("arm-none-eabi-objcopy", {"-Obinary", elf, path.join(bindir, name .. ".bin")})
os.execv("arm-none-eabi-objcopy", {"-Oihex", elf, path.join(bindir, name .. ".hex")})
os.execv("arm-none-eabi-objcopy", {"-Osrec", elf, path.join(bindir, name .. ".srec")})
os.execv("arm-none-eabi-objdump", {"-S", elf}, {stdout = path.join(bindir, name .. ".list")})
end)
-- 自定义清理逻辑
on_clean(function (target)
os.rm("build")
os.rm("bin")
end)
-- 定义 flash 任务(使用 openocd
task("flash")
set_menu {
usage = "xmake flash [options]",
description = "Flash firmware to STM32H7 using OpenOCD.",
options = {
{'t', "target", "kv", nil, "Set the target name"}
}
}
on_run(function (args)
import("core.project.project")
local tname = args.target or (project.targets()[1] and project.targets()[1]:name())
assert(tname, "No target found!")
local t = project.target(tname)
assert(t, "Target " .. tname .. " not found!")
local elf = t:targetfile()
os.execv("openocd", {
"-f", "interface/stlink.cfg",
"-f", "target/stm32h7x.cfg",
"-c", "program " .. elf .. " verify reset exit"
})
end)