Refs #816. Added S32K144 EVB demo programs for the IAR Embedded Workbench.

git-svn-id: https://svn.code.sf.net/p/openblt/code/trunk@764 5dc33758-31d5-4daf-9ae8-b24bf3d40d73
This commit is contained in:
Frank Voorburg 2020-03-20 16:51:43 +00:00
parent eca185dd01
commit d78ae71cdb
54 changed files with 49890 additions and 1 deletions

View File

@ -0,0 +1,121 @@
/*
** ###################################################################
** Processor: S32K144 with 64 KB SRAM
** Compiler: IAR ANSI C/C++ Compiler for ARM
**
** Abstract:
** Linker file for the IAR ANSI C/C++ Compiler for ARM
**
** Copyright (c) 2015-2016 Freescale Semiconductor, Inc.
** Copyright 2017 NXP
** All rights reserved.
**
** THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
** IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
** INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
** STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
** IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
** THE POSSIBILITY OF SUCH DAMAGE.
**
** http: www.freescale.com
** mail: support@freescale.com
**
** ###################################################################
*/
/* If symbol __flash_vector_table__=1 is defined at link time
* the interrupt vector will not be copied to RAM.
* Warning: Using the interrupt vector from FLASH will not allow
* INT_SYS_InstallHandler because the section is Read Only.
*/
define symbol __ram_vector_table_size__ = isdefinedsymbol(__flash_vector_table__) ? 0 : 0x00000400;
define symbol __ram_vector_table_offset__ = isdefinedsymbol(__flash_vector_table__) ? 0 : 0x000003FF;
/* Flash */
define symbol m_interrupts_start = 0x00000000;
define symbol m_interrupts_end = 0x000003FF;
define symbol m_flash_config_start = 0x00000400;
define symbol m_flash_config_end = 0x0000040F;
define symbol m_text_start = 0x00000410;
define symbol m_text_end = 0x00001FFF;
/* SRAM_L */
define symbol m_interrupts_ram_start = 0x1FFF8000;
define symbol m_interrupts_ram_end = 0x1FFF8000 + __ram_vector_table_offset__;
define symbol m_data_start = m_interrupts_ram_start + __ram_vector_table_size__;
define symbol m_data_end = 0x1FFFFFFF;
/* SRAM_U */
define symbol m_data_2_start = 0x20000000;
define symbol m_data_2_end = 0x20006FFF;
/* Sizes */
if (isdefinedsymbol(__stack_size__)) {
define symbol __size_cstack__ = __stack_size__;
} else {
define symbol __size_cstack__ = 0x00000400;
}
if (isdefinedsymbol(__heap_size__)) {
define symbol __size_heap__ = __heap_size__;
} else {
define symbol __size_heap__ = 0x00000400;
}
define exported symbol __VECTOR_TABLE = m_interrupts_start;
define exported symbol __VECTOR_RAM = isdefinedsymbol(__flash_vector_table__) ? m_interrupts_start : m_interrupts_ram_start;
define exported symbol __RAM_VECTOR_TABLE_SIZE = __ram_vector_table_size__;
define exported symbol __RAM_START = m_interrupts_ram_start;
define exported symbol __RAM_END = m_data_2_end;
define memory mem with size = 4G;
define region m_flash_config_region = mem:[from m_flash_config_start to m_flash_config_end];
define region TEXT_region = mem:[from m_interrupts_start to m_interrupts_end]
| mem:[from m_text_start to m_text_end];
define region DATA_region = mem:[from m_data_start to m_data_end];
define region DATA_region_2 = mem:[from m_data_2_start to m_data_2_end-__size_cstack__];
define region CSTACK_region = mem:[from m_data_2_end-__size_cstack__+1 to m_data_2_end];
define region m_interrupts_ram_region = mem:[from m_interrupts_ram_start to m_interrupts_ram_end];
define block CSTACK with alignment = 8, size = __size_cstack__ { };
define block HEAP with alignment = 8, size = __size_heap__ { };
define block RW { readwrite };
define block ZI { zi };
/* Custom Section Block that can be used to place data at absolute address. */
/* Use __attribute__((section (".customSection"))) to place data here. */
define block customSectionBlock { section .customSection };
define block __CODE_ROM { section .textrw_init };
define block __CODE_RAM { section .textrw };
initialize manually { section .textrw };
initialize manually { section .bss };
initialize manually { section .customSection };
initialize manually { section .data };
initialize manually { section __DLIB_PERTHREAD };
do not initialize { section .noinit, section .bss, section .data, section __DLIB_PERTHREAD, section .customSection };
place at address mem: m_interrupts_start { readonly section .intvec };
place in m_flash_config_region { section FlashConfig };
place in TEXT_region { readonly };
place in TEXT_region { block __CODE_ROM };
place in DATA_region { block RW };
place in DATA_region { block __CODE_RAM };
place in DATA_region_2 { first block customSectionBlock };
place in DATA_region_2 { block ZI };
place in DATA_region_2 { last block HEAP };
place in CSTACK_region { block CSTACK };
place in m_interrupts_ram_region { section m_interrupts_ram };

View File

@ -0,0 +1,486 @@
S01700006F70656E626C745F7333326B3134342E73726563DE
S1130000007000205D1C0000530A0000C70A0000B5
S11300108B100000C71700009B1D000000000000AB
S1130020000000000000000000000000C31D0000EC
S1130030CF1D000000000000291E0000391E000032
S1130040351E0000351E0000351E0000351E000060
S1130050351E0000351E0000351E0000351E000050
S1130060351E0000351E0000351E0000351E000040
S1130070351E0000351E0000351E0000351E000030
S1130080351E0000351E0000351E0000351E000020
S1130090351E0000351E0000351E0000351E000010
S11300A0351E0000351E0000351E0000351E000000
S11300B0351E0000351E0000351E0000351E0000F0
S11300C0351E0000351E0000351E0000351E0000E0
S11300D0351E0000351E0000351E0000351E0000D0
S11300E0351E0000351E0000351E0000351E0000C0
S11300F0351E0000351E0000351E0000351E0000B0
S1130100351E0000351E0000351E0000351E00009F
S1130110351E0000351E0000351E0000351E00008F
S1130120351E0000351E0000351E0000351E00007F
S1130130351E0000351E0000351E0000351E00006F
S1130140351E0000351E0000351E0000351E00005F
S1130150351E0000351E0000351E0000351E00004F
S1130160351E0000351E0000351E0000351E00003F
S1130170351E0000351E0000351E0000351E00002F
S1130180351E0000351E0000351E0000351E00001F
S1130190351E0000351E0000351E0000351E00000F
S11301A0351E0000351E0000351E0000351E0000FF
S11301B0351E0000351E0000351E0000351E0000EF
S11301C0351E0000351E0000351E0000351E0000DF
S11301D0351E0000351E0000351E0000351E0000CF
S11301E0351E0000351E0000351E0000351E0000BF
S11301F0351E0000351E0000351E0000351E0000AF
S1130200351E0000351E0000351E0000351E00009E
S1130210351E0000351E0000351E0000351E00008E
S1130220351E0000351E0000351E0000351E00007E
S1130230351E0000351E0000351E0000351E00006E
S1130240351E0000351E0000351E0000351E00005E
S1130250351E0000351E0000351E0000351E00004E
S1130260351E0000351E0000351E0000351E00003E
S1130270351E0000351E0000351E0000351E00002E
S1130280351E0000351E0000351E0000351E00001E
S1130290351E0000351E0000351E0000351E00000E
S11302A0351E0000351E0000351E0000351E0000FE
S11302B0351E0000351E0000351E0000351E0000EE
S11302C0351E0000351E0000351E0000351E0000DE
S11302D0351E0000351E0000351E0000351E0000CE
S11302E0351E0000351E0000351E0000351E0000BE
S11302F0351E0000351E0000351E0000351E0000AE
S1130300351E0000351E0000351E0000351E00009D
S1130310351E0000351E0000351E0000351E00008D
S1130320351E0000351E0000351E0000351E00007D
S1130330351E0000351E0000351E0000351E00006D
S1130340351E0000351E0000351E0000351E00005D
S1130350351E0000351E0000351E0000351E00004D
S1130360351E0000351E0000351E0000351E00003D
S1130370351E0000351E0000351E0000351E00002D
S1130380351E0000351E0000351E0000351E00001D
S1130390351E0000351E0000351E0000351E00000D
S11303A0351E0000351E0000351E0000351E0000FD
S11303B0351E0000351E0000351E0000351E0000ED
S11303C0351E0000351E0000351E0000351E0000DD
S11303D0351E0000351E0000351E0000351E0000CD
S11303E0351E0000351E0000351E0000351E0000BD
S11303F0351E0000351E0000351E0000FFFFFFFF04
S1130400FFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFF79
S1130410DFF800F00184FF1F5FF0FF30DFF878158C
S11304200860DFF87815086070472DE9F041040092
S11304300D0016005FF00108DFF86475D7F8F010BE
S1130440D7F8F4004118491E091B681E814201D2E5
S11304505FF000084046C0B201280CD1200000F033
S113046074FAFF2805D02819401E00F06EFAFF2800
S113047001D15FF000084046C0B2012818D1210024
S1130480890A4FF4806041433868814208D12B00C7
S113049032002100DFF8040500F006F9804607E089
S11304A02B0032002100DFF8F00400F0FDF8804654
S11304B04046C0B2BDE8F081F8B504000D00012645
S11304C0DFF8DC14D1F8F020D1F8F4108A18521EA9
S11304D0121B691E8A4200D200263100C9B20129CA
S11304E011D1200000F031FA07002C19641E2000FD
S11304F000F02BFA3900C9B2FF2903D00100C9B2B8
S1130500FF2900D100263100C9B2012906D101001A
S1130510C9B23800C0B200F09DF906003000C0B284
S1130520F2BD80B5012000210091DFF870140A6843
S113053012F1010F2ED00200D2B2012A2AD1009A60
S1130540486882180092009A886882180092009A7B
S1130550C86882180092009A086982180092009A6A
S1130560486982180092009A886982180092009A59
S1130570C869821800920098C04300900098401CFB
S113058000906A460421DFF81804006810F57E70B4
S1130590FFF74BFFC0B202BD01200022DFF8003498
S11305A0196809688A181968091D09688A18196878
S11305B0083109688A1819680C3109688A18196899
S11305C0103109688A181968143109688A18196879
S11305D0183109688A18196811F57E7109688A1832
S11305E0002A00D00020C0B2704710B50124DFF803
S11305F0AC03016811F1010F04D000F0A9F8002840
S113060000D100242000C0B201280AD1DFF88803F9
S1130610016811F1010F04D000F09AF8002800D10C
S113062000242000C0B210BDDFF8740300687047D6
S113063010B501248A0500D000242200D2B2012A78
S113064008D102688A4205D001604FF48062001D1F
S113065000F0E6F92000C0B210BD70B505000E0030
S11306600020DFF83803854203D1DFF82C532C0037
S11306700FE0DFF82C130A68964203D105000E68D8
S11306802C0006E02C00280000F062F8002800D1BD
S11306900024002C06D031002800FFF7C9FF0028F1
S11306A000D10024200070BD2DE9F84304008946E0
S11306B090461D0001274E46B60A4FF4806046431B
S11306C0206810F1010F06D131002000FFF7B0FFC0
S11306D0002800D100273800C0B201280AD12068C0
S11306E0B04207D031002000FFF7B7FF0400002C10
S11306F000D100273800C0B2012825D12068B9EB09
S1130700000904EB090010F1040900F09EF9201D12
S1130710B9EB0000B0F5806F09D316F580612000B5
S1130720FFF79BFF0400002C0DD014F1040998F886
S1130730000089F8000019F1010918F101086D1E83
S1130740002DE2D100E000273800C0B2BDE8F283FA
S11307502DE9F047040001260825206800F0F5F88B
S1130760FF2800D100263000C0B201286CD1002738
S113077012E0401C01002A00C9B2D2B291420AD24E
S11307800100C9B219F801100200D2B218F802200F
S11307909142EED000267F1C4FF480602900C9B23C
S11307A090FBF1F087424FD22068A9465FFA89F99D
S11307B009FB07092800C0B200FB07F0204410F130
S11307C0040800F042F9DFF8DCA19AF80000000602
S11307D039D570208AF8000007207349087048460C
S11307E0000C724908704846000A71490870714843
S11307F080F8009098F800006F49087098F801009C
S11308006E49087098F802006D49087098F8030062
S11308106C49087098F804006B49087098F8050052
S11308206A49087098F806006949087098F8070042
S113083068490870FFF7ECFD9AF8000010F0710F9A
S113084006D1002096E700263000C0B2BDE8F0874C
S11308500026F9E72DE9F04781460E000125300016
S11308604946C0B2C9B2884200D200252800C0B2AD
S1130870012804D13000C0B2152800D30025280077
S1130880C0B201285DD101E019F1010930004946E7
S1130890C0B2C9B2884254D300F0D7F80C20404902
S11308A04A46D2B242438F584A46D2B200FB02F0C3
S11308B00844446817F1010F09D0002C07D038050B
S11308C007D1200507D1240B5FF000081EE00025A6
S11308D037E0002535E0002533E070208AF8000079
S11308E00920314A10700800000C304A10700800CA
S11308F0000A2F4A10702F480170FFF789FD9AF8FB
S1130900000010F0710F17D118F1010840462100C2
S1130910C0B2C9B2884210D200F097F84146C9B2B9
S11309204FF4805000FB0171DFF878A09AF80000C2
S11309300006D2D4002500E000252800C0B200281B
S1130940A2D12800C0B2BDE8F08770B50400FF252D
S1130950002600E0761C3000C0B2152817D200F043
S113096074F80C200E493200D2B242438A589442A1
S1130970F0D33200D2B242438A583300DBB200FBD8
S113098003F00844406882189442E3D235002800FA
S1130990C0B270BD000000004C00002050040020D4
S11309A08C1A0000000002400700024006000240CA
S11309B00500024004000240080002400900024011
S11309C00A0002400B0002400C0002400D000240ED
S11309D00E0002400F00024080B500F03BF801BD5C
S11309E080B500F047F8002814D000F055F800282E
S11309F010D000F095F800F0F3F800F03FF8064945
S1130A0008400649086000F027F800F037F8001D98
S1130A100068804701BD000080FFFF1F08ED00E073
S1130A2070B504000D00160005E0287820706D1CD8
S1130A30641C00F00AF83000461E80B20028F4D18D
S1130A4070BD80B500F036F801BD80B500F037F810
S1130A5001BDFEE762B6704762B6704780B5FFF726
S1130A60DBFC01BD80B5FFF7E0FC02BD80B5FFF7FC
S1130A7023FD02BD80B5FFF78FFD02BD80B5FFF7F2
S1130A80D3FD02BD80B5FFF74CFD002801D1002045
S1130A9001E0FFF7AAFD02BD80B505480068C00467
S1130AA001D5002002E000F0ECF8012002BD0000B6
S1130AB090F00F4080B5642000F0B0F801BD80B51F
S1130AC000F0BEF801BDFEE710B500F0EFF800F04D
S1130AD099FB344C0120207000F02CFD0020207084
S1130AE010BD1CB5304C6946200000F0C6FC01283E
S1130AF007D101202B4908709DF80010200000F058
S1130B00F5F86946200000F088FD012807D100208F
S1130B10244908709DF80010200000F0E7F813BD88
S1130B20704770B504000D001E4E3078012804D1C2
S1130B302900C9B2200000F034FC3078002804D128
S1130B402900C9B2200000F047FD00F0C9F870BDCB
S1130B5014480078002805D0022807D004D30328BD
S1130B6006D007E0402006E0082004E0002002E070
S1130B70002000E0402080B270470A480078002836
S1130B8005D0022807D004D3032806D007E040206C
S1130B9006E0082004E0002002E0002000E04020FD
S1130BA080B270471C84FF1F0C00002010B5002485
S1130BB000F08DF8002800D001242000C0B210BD40
S1130BC080B500F00DF81048104908600020104965
S1130BD0086005200F49086000200F49086001BD26
S1130BE000200C49086070470A480068C00303D518
S1130BF009480168491C0160704780B5FFF7F4FF9C
S1130C000548006802BD00007F38010014E000E0E0
S1130C1018E000E010E000E0A00800201C490A6889
S1130C2052F480720A601B490A6852F001020A6099
S1130C3019490A6852F001020A601849088070478D
S1130C4010B5FFF7DAFF164C2168884218D315490E
S1130C500878002807D1012008701348016851F072
S1130C600101016006E0002008700B48016851F0A2
S1130C7001010160FFF7C1FF08490988401820609D
S1130C8010BD0548016851F0010101607047000082
S1130C9000C00440D4F00F40C4F00F40F00800201E
S1130CA054080020F3080020C8F00F40DFF8C80300
S1130CB00021017000218164002180F8431000218B
S1130CC0A0F8441000218170002141707047DFF8C2
S1130CD0A8030078002801D1002000E0012070471B
S1130CE00020DFF8941381F84300704710B50178B1
S1130CF0FF2917D100F08CF8DFF87C4394F8430007
S1130D00012802D1102000F07BF8B4F94400012836
S1130D1007DB012084F84300B4F94410E01C00F020
S1130D2053F810BDDFF85013097801294BD101782D
S1130D30C92932D0CC293FD0CF293AD0D0292FD0BD
S1130D40D12933D0D2292ED0F32917D0F4290FD0AA
S1130D50F5290AD0F6290ED0FA2912D0FC2913D08D
S1130D60FD2914D0FE2915D029E000F0B5F8C3E719
S1130D7000F0D1F8C0E700F0A6F8BDE700F0ECF809
S1130D80BAE700F08EF8B7E700F086F8B4E700F0B1
S1130D9072F8B1E700F063F8AEE700F004F9ABE7EE
S1130DA000F020F9A8E700F0E9F8A5E700F048F919
S1130DB0A2E700F057F99FE700F062F99CE72020D2
S1130DC000F01EF898E7ACE780B589B2FFF7A9FEFA
S1130DD001BDF8B504000D001600002704E02078DA
S1130DE0C719641CFFF731FE2800451E0028F6D100
S1130DF0FFB237600120F2BD00209F494870704760
S1130E009D49FE22CA7008710220A1F8440070476F
S1130E1010B5FFF7F1FF984C01202070FF20E0701F
S1130E2000202071207950F01000207100206071A2
S1130E3060796071FFF78CFEA071FFF79EFEE07190
S1130E40FFF79BFE80B2000A20720120607201202D
S1130E50A0720820A4F84400FFF700FE10BD10B5EE
S1130E60854C00202070FFF7C7FFFF20E0700120B1
S1130E70A4F8440010BD8048FF21C1700021017115
S1130E8041784171002181710021C17100210172F9
S1130E900621A0F84410704780B50020FFF7B0FF8A
S1130EA001BD7548FF21C17074498164002101713D
S1130EB000214171002181710721C0F80710082128
S1130EC0A0F8441070476C49FF22CA7040688864D7
S1130ED00120A1F84400704738B50400FFF738FE3C
S1130EE080B2401E6178884203DA2220FFF788FF2F
S1130EF010E06278604D281D92B2A96CFFF790FD56
S1130F00FF20E870A86C61784018A8646078401CE1
S1130F10A5F8440031BD38B50400FFF719FE80B2CE
S1130F20401E6178884203DA2220FFF769FF12E04D
S1130F30514D6068A8646278281D92B2A96CFFF7CD
S1130F406FFDFF20E870A86C61784018A864607891
S1130F50401CA5F8440031BD10B5474CFF21E17099
S1130F60E21D4168A06CFFF734FF2071002060711E
S1130F700020A0710820A4F8440010BD10B53E4C18
S1130F80FF20E0700020207100206071FFF7E0FD79
S1130F90A0710020E0710020207200206072072000
S1130FA0A4F8440010BD38B50400FFF7D1FD0100DA
S1130FB0314D621C89B2491EA86CFFF753FD00280D
S1130FC003D13120FFF71CFF0BE0FF20E870FFF78F
S1130FD0BFFDA96C80B2401E4018A8640120A5F88A
S1130FE0440031BD38B50400FFF7B2FD80B2801E65
S1130FF06178884203DA2220FFF702FF1FE01E4DCA
S1131000FF20E8700120A5F844006078002807D18B
S1131010FFF738FD002802D13120FFF7F1FE0EE082
S1131020A21C6178A86CFFF71DFD002803D13120B4
S1131030FFF7E6FE03E0A86C61784018A86431BDB0
S113104010B50D4C4168A06CFFF710FD002803D1CA
S11310503120FFF7D5FE04E0FF20E0700120A4F862
S1131060440010BD80B5FFF7BBFC0348FF21C170ED
S11310700121A0F8441001BDA4080020181E00009E
S113108080B53120FFF7BCFE01BDFEE7FCB40300D0
S11310906846DFF84444D4E90056C0E90056DFF856
S11310A03C442068C0F30220002804D1012005023A
S11310B015F4E06525604FF4FA546D46285CB4FBE2
S11310C0F0F5002600E0761C3000C0B2122826D2CB
S11310D0DFF80C74180080B23400E4B217F824402E
S11310E06043B5FBF0F400FB14500028EBD11C0066
S11310F0A4B23000C0B217F820004443B5FBF4F0AA
S1131100088008880028DED0088840F20114A04234
S1131110D9D2F6B257F826001060012000E0002072
S1131120F6BC704738B5DFF8BC532868002804D5EE
S1131130DE21DFF8B40300F005FB286850F080409E
S11311402860286850F080502860FFF756FD04009E
S1131150FA342868C00105D4FFF777FCFFF74DFD8A
S11311608442F6D231BD38B5DFF8785328680028B8
S113117004D5FE21DFF8700300F0E4FA286830F0AB
S113118080402860286830F080502860FFF735FDE3
S11311900400FA342868C00105D5FFF756FCFFF7B0
S11311A02CFD8442F6D231BD38B5CE4D28680028D6
S11311B010D4286850F000402860FFF71EFD04009A
S11311C0FA342868C00205D4FFF73FFCFFF715FD89
S11311D08442F6D231BD38B5C24D2868002810D5F6
S11311E0286820F000402860FFF707FD0400FA3467
S11311F02868C00205D5FFF728FCFFF7FEFC8442EF
S1131200F6D231BD7CB50020ADF8040004220021E3
S1131210684600F09BFA40F26765B448016851F0F3
S113122080410160FFF7D7FFFFF77CFFFFF7BCFFAA
S1131230AF4C206830F400502060FFF7CCFFFFF77C
S113124071FF6A4601A94FF4FA70FFF71FFF0028E7
S113125004D140F28711A44800F074FA21684FF6D3
S11312607870014021602068BDF80410491E50EADE
S11312700160206020689DF80110491E11F00701EB
S11312800843206020689DF80210491EC90411F427
S113129060110843206020689DF80310491E09046A
S11312A011F4E021084320609DF80200042802DACA
S11312B09DF8020000E004202168C0B2401E8005B1
S11312C010F4400008432060206850F08000206043
S11312D0002006E00021874A03009BB242F8231055
S11312E0401C010089B28029F4D3002006E00021CB
S11312F0814A03009BB242F82310401C010089B2CA
S11313002029F4D3774E3068C009C00150F01F0083
S11313103060306850F400303060306850F4803011
S11313203060306830F0005030607FF02040734906
S1131330086073485FF080610160002D0AD525F0D4
S11313400045016851F40011016025F060456D48C5
S1131350056004E0AD0425F060456A48056000209E
S1131360694908605FF0FF30684908606848694966
S11313700860306830F4000030602168664801403D
S11313802160FFF7F0FEFFF738FC0400FA34306800
S1131390000105D5FFF759FBFFF72FFC8442F6D275
S11313A073BDF8B5002340F2E172002A02D522F0A1
S11313B000420123554C4FF480752560574D2E682B
S11313C026F060462E602E6836F440162E602E6895
S11313D056F480062E602E6836F470262E602E6831
S11313E00F00FFB23F0417F470273E432E604C4EAB
S11313F0002717E0BC465FFA8CFC5FEA9C0C5FEAAE
S11314008C0C1CF1030CBE465FFA8EFE1EF0030E1C
S1131410BCEB0E0CBE465FFA8EFE10F80EE006F82A
S11314200CE07F1CBC468E465FFA8CFC5FFA8EFE95
S1131430F445DFD3DBB2002B05D1920422F06042E5
S11314403848026007E0286850F40010286022F051
S1131450604234480260286850F040602860FFF71A
S1131460CCFB050032352068C00505D4FFF7EDFA42
S1131470FFF7C3FB8542F6D2F1BD70B40022234BC3
S11314801C68A40524D51E4A1268120C12F00F021F
S11314900A70254A00240EE02500EDB2AD08AD0027
S11314A0ED1C2600F6B216F00306AD1B555D2600B2
S11314B0F6B28555641C25000E78EDB2B542EBD327
S11314C04FF4007018601948006819490860012237
S11314D01000C0B270BC7047081E000004410640F2
S11314E0B41C0000004002403C1D00009050064027
S11314F0044002408040024080480240A448024028
S11315001041024014410240284002403040024051
S113151006003B0020400240F7EFFFFF004102407D
S11315200841024004410240184102400840024080
S11315300800002082B068466E49D1E90023C0E962
S113154000236D48016831F080410160016851F069
S11315508441016069490868C0F30220002806D16B
S113156001200A68030213F4E0631A430A60644921
S1131570644A1268D20700D463496A46105CB1FB1E
S1131580F0F04FF46141B0FBF1F0C01DC008C0049D
S1131590C00C80B2C004C00C50F0E0605B4908602D
S11315A05B485C4908605C480021016000215B4A9B
S11315B0116000215A4A11605A495FF470320A607E
S11315C00A6852F088020A600121574A11605FF4E8
S11315D04021016002B0704770B504000D0028007E
S11315E0C0B2412803DBC821504800F0ABF8280002
S11315F0C0B200F069F8002607E0FFF726FA3000D1
S113160080B2205C00F060F8761C30002900C9B27A
S113161080B289B28842F0D370BD2DE9F041050053
S11316200E00434C2078002815D1424D280000F0CC
S11316303DF8012837D12878002834D0287841286B
S113164031DAFFF7DAFA3C49086000203B490870B8
S11316500120207027E0394FDFF8D88038784044E3
S1131660401C00F023F8012814D13878401C38704D
S1131670387898F80010884215D13A7892B218F167
S113168001012800FFF7CCF9002020703878307071
S1131690012009E0FFF7B1FA274909686431814262
S11316A001D2002020700020BDE8F081020000205B
S11316B018490968C1F34051002903D02048006843
S11316C010700120C0B2704710B5C0B21C49086048
S11316D0FFF793FA04000A340E480068C0F3C050C0
S11316E0002805D1FFF7B1F9FFF787FA8442F3D256
S11316F010BD0000101E0000AC510640044206401C
S113170000127A000842064080841E0010B0064091
S113171000C01FC014B0064018B0064020B00640F8
S113172024B0064028B006402CB00640FC1C000043
S1131730F5080020580800209C080020F408002028
S11317401CB0064080B5FFF780F9FCE710B50446ED
S113175010460A460146204600F002F8204610BD15
S113176062F30F2262F31F42401810F0030308D003
S1131770C91A1FD3DB0748BF00F8012D28BF20F882
S1131780022D130030B414461546103928BF20E941
S11317903C00FAD8490728BF20E90C0048BF40F8AC
S11317A0042D890028BF20F8022D48BF00F8012D20
S11317B030BC7047C91818BF00F8012DCB0728BFEB
S11317C000F8012D7047FEE780B500F005F800F041
S11317D0A1F800F0ADF8FCE780B500F037F839481F
S11317E0016851F0804101603748016851F080413F
S11317F001603648016851F0804101603448016855
S113180051F480710160016831F0020101603148D6
S1131810016831F4805101602F48016831F480512E
S113182001602E48016851F4007101602C48016880
S113183051F4007101602B48016851F4A06101600A
S11318402948016851F4A061016001BD10B540F25E
S11318500111264801602420254A106025480268A9
S11318601202FBD4012202600268D201FCD5224A92
S113187010680002FBD410684008400010601F4B41
S11318801C6840F2023004431C605FF4C0101C4B1F
S1131890186010680002FCD4106850F00100106059
S11318A01068C001FCD51748016017481749086043
S11318B017480068C0F303600628F9D100F059F80E
S11318C010BD00002C5106403051064034510640F2
S11318D030B0044094F00F4098F00F4018B004402A
S11318E01CB0044010D0044014D00440044106400D
S11318F008410640004106400046064004460640B2
S11319000846064004420640120001061440064000
S11319101040064080B5FFF75FF8FFF792F8FFF735
S11319204FF9FFF79BF8FFF7CFF800F07DF801BD02
S113193080B5FFF78AF8FFF757F9FFF7D2F800F000
S11319407CF801BD2B48016851F4700101602A48FC
S1131950016831F08041016028482949016000682C
S113196042F22010274908604FF6FF7026490860AC
S1131970704710B40023012024490A68C2F30342CB
S1131980521C0968090E11F00F01012906D0022921
S113199006D003290CD0062912D020E01C4B1FE0EE
S11319A01C49096811F00101002900D0184B17E007
S11319B01949096811F00301184B53F821300FE05D
S11319C01349174C2368C3F302235B1C2468C4F334
S11319D00444103461435B00B1FBF3F300E00020E6
S11319E0C0B2002803D0B3FBF2F00E49086010BC6B
S11319F07047000088ED00E034EF00E0042005406B
S1131A0020C528D900200540082005401040064084
S1131A1000127A000842064008430640301E0000C7
S1131A20084606401884FF1F80B501201449087039
S1131A3000F01CF800F001F801BD10B5FFF7B6F88E
S1131A40012812D00E4C207801280ED1FFF7D5F8CA
S1131A500C490A680C4909688A1812F5FA7290420E
S1131A6003D300202070FEF7BBFF10BD80B50448EF
S1131A700078012803D1FFF7C0F80349086001BDCD
S1131A80F2080020040000200000002000200000D4
S1131A9000100000020000000030000000100000F0
S1131AA003000000004000000010000004000000DB
S1131AB0005000000010000005000000006000005D
S1131AC0001000000600000000700000001000007C
S1131AD007000000008000000080000008000000F3
S1131AE000000100008000000900000000800100E7
S1131AF0008000000A0000000000020000800000D6
S1131B000B00000000800200008000000C000000B8
S1131B1000000300008000000D00000000800300AE
S1131B20008000000E00000000000400008000009F
S1131B300F0000000080040000800000100000007E
S1131B400000050000800000110000000080050076
S1131B500080000012000000000006000080000069
S1131B601300000000800600008000001400000044
S1131B70000007000080000015000000008007003E
S1131B8000800000160000002DE9F043244B254E90
S1131B90254F264CDFF898C0DFF898E0264DDFF893
S1131BA09C8027482749284A05E096F8009083F846
S1131BB000905B1C761CB742F7D1E64509D09CF82F
S1131BC000302370641C1CF1010CF6E700232B7019
S1131BD06D1CA845FAD18A4204D00B780370491CC5
S1131BE0401CF8E70021194A194B934210D00020F9
S1131BF004E052F8204043F82040401C154CB0EB60
S1131C00940FF6D31448C9B250F82100036004E0DD
S1131C101148C9B250F821000260BDE8F08300BF4A
S1131C201884FF1F201E0000281E00000084FF1FD0
S1131C30E41D0000FC1D000000000020F608002048
S1131C400000000000000000000000000000000090
S1131C500080FF1F000400002C1E000072B600214B
S1131C60002200230024002500260027B846B94698
S1131C70BA46BB46BC460A490A4A521A013A05DD2D
S1131C800020042308601944043AFBDA0648854618
S1131C90064880470648804762B6FFF795FDFEE791
S1131CA00080FF1FFF6F0020007000204519000016
S1131CB0891B000008030202090303020A03030349
S1131CC00B0403030C0404030D0504030E050404B0
S1131CD00F06040410060504110705041207050580
S1131CE01308050514080605150807051608070650
S1131CF0170808061808080719080808433A5C5723
S1131D006F726B5C736F6674776172655C4F70653C
S1131D106E424C545C5461726765745C536F7572A7
S1131D2063655C41524D434D345F5333324B313420
S1131D305C72733233322E6300000000433A5C5706
S1131D406F726B5C736F6674776172655C4F7065FC
S1131D506E424C545C5461726765745C536F757267
S1131D6063655C41524D434D345F5333324B3134E0
S1131D705C63616E2E6300004EF68851CEF2000162
S1131D80086840F470000860BFF34F8FBFF36F8F93
S1131D904FF00070E1EE100A7047FEE700F00DF816
S1131DA0002801D0AFF30080AFF300800020AFF330
S1131DB00080FFF709FD00F002F80120704700F0F1
S1131DC001B8FEE70746384600F002F8FBE7FEE7F5
S1131DD080B5AFF30080024A11001820ABBEFBE7C8
S1131DE0260002000448017851F080010170017856
S1131DF00906FCD5704700BF00000240AFF3008025
S1131E00FFF7BAFFFFF7CAFF0001020408102040E1
S1131E1000010204081020404F70656E424C5400CB
S1131E20006CDC0204000000FEE7000008ED00E0A6
S10D1E30006CDC02FFF7FEBFFEE7C2
S9031DFDE2

View File

@ -0,0 +1,176 @@
/************************************************************************************//**
* \file Demo/ARMCM4_S32K14_S32K144EVB_IAR/Boot/blt_conf.h
* \brief Bootloader configuration header file.
* \ingroup Boot_ARMCM4_S32K14_S32K144EVB_IAR
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
#ifndef BLT_CONF_H
#define BLT_CONF_H
/****************************************************************************************
* C P U D R I V E R C O N F I G U R A T I O N
****************************************************************************************/
/* To properly initialize the baudrate clocks of the communication interface, typically
* the speed of the crystal oscillator and/or the speed at which the system runs is
* needed. Set these through configurables BOOT_CPU_XTAL_SPEED_KHZ and
* BOOT_CPU_SYSTEM_SPEED_KHZ, respectively. To enable data exchange with the host that is
* not dependent on the targets architecture, the byte ordering needs to be known.
* Setting BOOT_CPU_BYTE_ORDER_MOTOROLA to 1 selects big endian mode and 0 selects
* little endian mode.
*
* Set BOOT_CPU_USER_PROGRAM_START_HOOK to 1 if you would like a hook function to be
* called the moment the user program is about to be started. This could be used to
* de-initialize application specific parts, for example to stop blinking an LED, etc.
*/
/** \brief Frequency of the external crystal oscillator. */
#define BOOT_CPU_XTAL_SPEED_KHZ (8000)
/** \brief Desired system speed. */
#define BOOT_CPU_SYSTEM_SPEED_KHZ (80000)
/** \brief Motorola or Intel style byte ordering. */
#define BOOT_CPU_BYTE_ORDER_MOTOROLA (0)
/** \brief Enable/disable hook function call right before user program start. */
#define BOOT_CPU_USER_PROGRAM_START_HOOK (1)
/****************************************************************************************
* C O M M U N I C A T I O N I N T E R F A C E C O N F I G U R A T I O N
****************************************************************************************/
/* The UART communication interface is selected by setting the BOOT_COM_UART_ENABLE
* configurable to 1. Configurable BOOT_COM_UART_BAUDRATE selects the communication speed
* in bits/second. The maximum amount of data bytes in a message for data transmission
* and reception is set through BOOT_COM_UART_TX_MAX_DATA and BOOT_COM_UART_RX_MAX_DATA,
* respectively. It is common for a microcontroller to have more than 1 UART interface
* on board. The zero-based BOOT_COM_UART_CHANNEL_INDEX selects the UART interface.
*
*/
/** \brief Enable/disable UART transport layer. */
#define BOOT_COM_RS232_ENABLE (1)
/** \brief Configure the desired communication speed. */
#define BOOT_COM_RS232_BAUDRATE (57600)
/** \brief Configure number of bytes in the target->host data packet. */
#define BOOT_COM_RS232_TX_MAX_DATA (64)
/** \brief Configure number of bytes in the host->target data packet. */
#define BOOT_COM_RS232_RX_MAX_DATA (64)
/** \brief Select the desired UART peripheral as a zero based index. */
#define BOOT_COM_RS232_CHANNEL_INDEX (1)
/* The CAN communication interface is selected by setting the BOOT_COM_CAN_ENABLE
* configurable to 1. Configurable BOOT_COM_CAN_BAUDRATE selects the communication speed
* in bits/second. Two CAN messages are reserved for communication with the host. The
* message identifier for sending data from the target to the host is configured with
* BOOT_COM_CAN_TXMSG_ID. The one for receiving data from the host is configured with
* BOOT_COM_CAN_RXMSG_ID. Note that an extended 29-bit CAN identifier is configured by
* OR-ing with mask 0x80000000. The maximum amount of data bytes in a message for data
* transmission and reception is set through BOOT_COM_CAN_TX_MAX_DATA and
* BOOT_COM_CAN_RX_MAX_DATA, respectively. It is common for a microcontroller to have more
* than 1 CAN controller on board. The zero-based BOOT_COM_CAN_CHANNEL_INDEX selects the
* CAN controller channel.
*
*/
/** \brief Enable/disable CAN transport layer. */
#define BOOT_COM_CAN_ENABLE (1)
/** \brief Configure the desired CAN baudrate. */
#define BOOT_COM_CAN_BAUDRATE (500000)
/** \brief Configure CAN message ID target->host. */
#define BOOT_COM_CAN_TX_MSG_ID (0x7E1 /*| 0x80000000*/)
/** \brief Configure number of bytes in the target->host CAN message. */
#define BOOT_COM_CAN_TX_MAX_DATA (8)
/** \brief Configure CAN message ID host->target. */
#define BOOT_COM_CAN_RX_MSG_ID (0x667 /*| 0x80000000*/)
/** \brief Configure number of bytes in the host->target CAN message. */
#define BOOT_COM_CAN_RX_MAX_DATA (8)
/** \brief Select the desired CAN peripheral as a zero based index. */
#define BOOT_COM_CAN_CHANNEL_INDEX (0)
/****************************************************************************************
* B A C K D O O R E N T R Y C O N F I G U R A T I O N
****************************************************************************************/
/* It is possible to implement an application specific method to force the bootloader to
* stay active after a reset. Such a backdoor entry into the bootloader is desired in
* situations where the user program does not run properly and therefore cannot
* reactivate the bootloader. By enabling these hook functions, the application can
* implement the backdoor, which overrides the default backdoor entry that is programmed
* into the bootloader. When desired for security purposes, these hook functions can
* also be implemented in a way that disables the backdoor entry altogether.
*/
/** \brief Enable/disable the backdoor override hook functions. */
#define BOOT_BACKDOOR_HOOKS_ENABLE (0)
/****************************************************************************************
* N O N - V O L A T I L E M E M O R Y D R I V E R C O N F I G U R A T I O N
****************************************************************************************/
/* The NVM driver typically supports erase and program operations of the internal memory
* present on the microcontroller. Through these hook functions the NVM driver can be
* extended to support additional memory types such as external flash memory and serial
* eeproms. The size of the internal memory in kilobytes is specified with configurable
* BOOT_NVM_SIZE_KB. If desired the internal checksum writing and verification method can
* be overridden with a application specific method by enabling configuration switch
* BOOT_NVM_CHECKSUM_HOOKS_ENABLE.
*/
/** \brief Enable/disable the NVM hook function for supporting additional memory devices. */
#define BOOT_NVM_HOOKS_ENABLE (0)
/** \brief Configure the size of the default memory device (typically flash EEPROM). */
#define BOOT_NVM_SIZE_KB (512)
/** \brief Enable/disable hooks functions to override the user program checksum handling. */
#define BOOT_NVM_CHECKSUM_HOOKS_ENABLE (0)
/****************************************************************************************
* W A T C H D O G D R I V E R C O N F I G U R A T I O N
****************************************************************************************/
/* The COP driver cannot be configured internally in the bootloader, because its use
* and configuration is application specific. The bootloader does need to service the
* watchdog in case it is used. When the application requires the use of a watchdog,
* set BOOT_COP_HOOKS_ENABLE to be able to initialize and service the watchdog through
* hook functions.
*/
/** \brief Enable/disable the hook functions for controlling the watchdog. */
#define BOOT_COP_HOOKS_ENABLE (1)
/****************************************************************************************
* S E E D / K E Y S E C U R I T Y C O N F I G U R A T I O N
****************************************************************************************/
/* A security mechanism can be enabled in the bootloader's XCP module by setting configu-
* rable BOOT_XCP_SEED_KEY_ENABLE to 1. Before any memory erase or programming
* operations can be performed, access to this resource need to be unlocked.
* In the Microboot settings on tab "XCP Protection" you need to specify a DLL that
* implements the unlocking algorithm. The demo programs are configured for the (simple)
* algorithm in "libseednkey.dll". The source code for this DLL is available so it can be
* customized to your needs.
* During the unlock sequence, Microboot requests a seed from the bootloader, which is in
* the format of a byte array. Using this seed the unlock algorithm in the DLL computes
* a key, which is also a byte array, and sends this back to the bootloader. The
* bootloader then verifies this key to determine if programming and erase operations are
* permitted.
* After enabling this feature the hook functions XcpGetSeedHook() and XcpVerifyKeyHook()
* are called by the bootloader to obtain the seed and to verify the key, respectively.
*/
#define BOOT_XCP_SEED_KEY_ENABLE (0)
#endif /* BLT_CONF_H */
/*********************************** end of blt_conf.h *********************************/

View File

@ -0,0 +1,7 @@
/**
\defgroup Boot_ARMCM4_S32K14_S32K144EVB_IAR Bootloader
\brief Bootloader.
\ingroup ARMCM4_S32K14_S32K144EVB_IAR
*/

View File

@ -0,0 +1,307 @@
/************************************************************************************//**
* \file Demo/ARMCM4_S32K14_S32K144EVB_IAR/Boot/hooks.c
* \brief Bootloader callback source file.
* \ingroup Boot_ARMCM4_S32K14_S32K144EVB_IAR
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
/****************************************************************************************
* Include files
****************************************************************************************/
#include "boot.h" /* bootloader generic header */
#include "led.h" /* LED driver header */
#include "device_registers.h" /* device registers */
/****************************************************************************************
* B A C K D O O R E N T R Y H O O K F U N C T I O N S
****************************************************************************************/
#if (BOOT_BACKDOOR_HOOKS_ENABLE > 0)
/************************************************************************************//**
** \brief Initializes the backdoor entry option.
** \return none.
**
****************************************************************************************/
void BackDoorInitHook(void)
{
} /*** end of BackDoorInitHook ***/
/************************************************************************************//**
** \brief Checks if a backdoor entry is requested.
** \return BLT_TRUE if the backdoor entry is requested, BLT_FALSE otherwise.
**
****************************************************************************************/
blt_bool BackDoorEntryHook(void)
{
/* default implementation always activates the bootloader after a reset */
return BLT_TRUE;
} /*** end of BackDoorEntryHook ***/
#endif /* BOOT_BACKDOOR_HOOKS_ENABLE > 0 */
/****************************************************************************************
* C P U D R I V E R H O O K F U N C T I O N S
****************************************************************************************/
#if (BOOT_CPU_USER_PROGRAM_START_HOOK > 0)
/************************************************************************************//**
** \brief Callback that gets called when the bootloader is about to exit and
** hand over control to the user program. This is the last moment that
** some final checking can be performed and if necessary prevent the
** bootloader from activiting the user program.
** \return BLT_TRUE if it is okay to start the user program, BLT_FALSE to keep
** keep the bootloader active.
**
****************************************************************************************/
blt_bool CpuUserProgramStartHook(void)
{
/* additional and optional backdoor entry through the pushbutton (SW2) on the board. to
* force the bootloader to stay active after reset, keep it pressed during reset.
*/
if ((PTC->PDIR & GPIO_PDIR_PDI(1 << 12U)) != 0U)
{
/* pushbutton pressed, so do not start the user program and keep the
* bootloader active instead.
*/
return BLT_FALSE;
}
/* clean up the LED driver */
LedBlinkExit();
/* okay to start the user program */
return BLT_TRUE;
} /*** end of CpuUserProgramStartHook ***/
#endif /* BOOT_CPU_USER_PROGRAM_START_HOOK > 0 */
/****************************************************************************************
* W A T C H D O G D R I V E R H O O K F U N C T I O N S
****************************************************************************************/
#if (BOOT_COP_HOOKS_ENABLE > 0)
/************************************************************************************//**
** \brief Callback that gets called at the end of the internal COP driver
** initialization routine. It can be used to configure and enable the
** watchdog.
** \return none.
**
****************************************************************************************/
void CopInitHook(void)
{
/* this function is called upon initialization. might as well use it to initialize
* the LED driver. It is kind of a visual watchdog anyways.
*/
LedBlinkInit(100);
} /*** end of CopInitHook ***/
/************************************************************************************//**
** \brief Callback that gets called at the end of the internal COP driver
** service routine. This gets called upon initialization and during
** potential long lasting loops and routine. It can be used to service
** the watchdog to prevent a watchdog reset.
** \return none.
**
****************************************************************************************/
void CopServiceHook(void)
{
/* run the LED blink task. this is a better place to do it than in the main() program
* loop. certain operations such as flash erase can take a long time, which would cause
* a blink interval to be skipped. this function is also called during such operations,
* so no blink intervals will be skipped when calling the LED blink task here.
*/
LedBlinkTask();
} /*** end of CopServiceHook ***/
#endif /* BOOT_COP_HOOKS_ENABLE > 0 */
/****************************************************************************************
* N O N - V O L A T I L E M E M O R Y D R I V E R H O O K F U N C T I O N S
****************************************************************************************/
#if (BOOT_NVM_HOOKS_ENABLE > 0)
/************************************************************************************//**
** \brief Callback that gets called at the start of the internal NVM driver
** initialization routine.
** \return none.
**
****************************************************************************************/
void NvmInitHook(void)
{
} /*** end of NvmInitHook ***/
/************************************************************************************//**
** \brief Callback that gets called at the start of a firmware update to reinitialize
** the NVM driver.
** \return none.
**
****************************************************************************************/
void NvmReinitHook(void)
{
} /*** end of NvmReinitHook ***/
/************************************************************************************//**
** \brief Callback that gets called at the start of the NVM driver write
** routine. It allows additional memory to be operated on. If the address
** is not within the range of the additional memory, then
** BLT_NVM_NOT_IN_RANGE must be returned to indicate that the data hasn't
** been written yet.
** \param addr Start address.
** \param len Length in bytes.
** \param data Pointer to the data buffer.
** \return BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is
** not within the supported memory range, or BLT_NVM_ERROR is the write
** operation failed.
**
****************************************************************************************/
blt_int8u NvmWriteHook(blt_addr addr, blt_int32u len, blt_int8u *data)
{
return BLT_NVM_NOT_IN_RANGE;
} /*** end of NvmWriteHook ***/
/************************************************************************************//**
** \brief Callback that gets called at the start of the NVM driver erase
** routine. It allows additional memory to be operated on. If the address
** is not within the range of the additional memory, then
** BLT_NVM_NOT_IN_RANGE must be returned to indicate that the memory
** hasn't been erased yet.
** \param addr Start address.
** \param len Length in bytes.
** \return BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is
** not within the supported memory range, or BLT_NVM_ERROR is the erase
** operation failed.
**
****************************************************************************************/
blt_int8u NvmEraseHook(blt_addr addr, blt_int32u len)
{
return BLT_NVM_NOT_IN_RANGE;
} /*** end of NvmEraseHook ***/
/************************************************************************************//**
** \brief Callback that gets called at the end of the NVM programming session.
** \return BLT_TRUE is successful, BLT_FALSE otherwise.
**
****************************************************************************************/
blt_bool NvmDoneHook(void)
{
return BLT_TRUE;
} /*** end of NvmDoneHook ***/
#endif /* BOOT_NVM_HOOKS_ENABLE > 0 */
#if (BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0)
/************************************************************************************//**
** \brief Verifies the checksum, which indicates that a valid user program is
** present and can be started.
** \return BLT_TRUE if successful, BLT_FALSE otherwise.
**
****************************************************************************************/
blt_bool NvmVerifyChecksumHook(void)
{
return BLT_TRUE;
} /*** end of NvmVerifyChecksum ***/
/************************************************************************************//**
** \brief Writes a checksum of the user program to non-volatile memory. This is
** performed once the entire user program has been programmed. Through
** the checksum, the bootloader can check if a valid user programming is
** present and can be started.
** \return BLT_TRUE if successful, BLT_FALSE otherwise.
**
****************************************************************************************/
blt_bool NvmWriteChecksumHook(void)
{
return BLT_TRUE;
}
#endif /* BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0 */
/****************************************************************************************
* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S
****************************************************************************************/
#if (BOOT_XCP_SEED_KEY_ENABLE > 0)
/************************************************************************************//**
** \brief Provides a seed to the XCP master that will be used for the key
** generation when the master attempts to unlock the specified resource.
** Called by the GET_SEED command.
** \param resource Resource that the seed if requested for (XCP_RES_XXX).
** \param seed Pointer to byte buffer wher the seed will be stored.
** \return Length of the seed in bytes.
**
****************************************************************************************/
blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed)
{
/* request seed for unlocking ProGraMming resource */
if ((resource & XCP_RES_PGM) != 0)
{
seed[0] = 0x55;
}
/* return seed length */
return 1;
} /*** end of XcpGetSeedHook ***/
/************************************************************************************//**
** \brief Called by the UNLOCK command and checks if the key to unlock the
** specified resource was correct. If so, then the resource protection
** will be removed.
** \param resource resource to unlock (XCP_RES_XXX).
** \param key pointer to the byte buffer holding the key.
** \param len length of the key in bytes.
** \return 1 if the key was correct, 0 otherwise.
**
****************************************************************************************/
blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len)
{
/* suppress compiler warning for unused parameter */
len = len;
/* the example key algorithm in "libseednkey.dll" works as follows:
* - PGM will be unlocked if key = seed - 1
*/
/* check key for unlocking ProGraMming resource */
if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1)))
{
/* correct key received for unlocking PGM resource */
return 1;
}
/* still here so key incorrect */
return 0;
} /*** end of XcpVerifyKeyHook ***/
#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */
/*********************************** end of hooks.c ************************************/

View File

@ -0,0 +1,695 @@
<?xml version="1.0" encoding="UTF-8"?>
<project>
<fileVersion>4</fileVersion>
<fileChecksum>684628677</fileChecksum>
<configuration>
<name>Debug</name>
<outputs>
<file>$PROJ_DIR$\..\main.c</file>
<file>$PROJ_DIR$\..\..\..\..\Source\assert.c</file>
<file>$PROJ_DIR$\..\blt_conf.h</file>
<file>$PROJ_DIR$\..\hooks.c</file>
<file>$PROJ_DIR$\..\..\..\..\Source\ARMCM4_S32K14\IAR\cpu_comp.c</file>
<file>$PROJ_DIR$\..\lib\device_registers.h</file>
<file>$PROJ_DIR$\..\startup_S32K144.s</file>
<file>$PROJ_DIR$\..\led.c</file>
<file>$PROJ_DIR$\..\..\..\..\Source\ARMCM4_S32K14\can.c</file>
<file>$PROJ_DIR$\..\lib\system_S32K144.c</file>
<file>$PROJ_DIR$\..\lib\S32K144_features.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\ARMCM4_S32K14\cpu.c</file>
<file>$PROJ_DIR$\..\lib\startup.c</file>
<file>$PROJ_DIR$\..\..\..\..\Source\ARMCM4_S32K14\flash.c</file>
<file>$PROJ_DIR$\..\led.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\ARMCM4_S32K14\flash.h</file>
<file>$PROJ_DIR$\..\lib\startup.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\ARMCM4_S32K14\rs232.c</file>
<file>$PROJ_DIR$\..\..\..\..\Source\ARMCM4_S32K14\timer.c</file>
<file>$PROJ_DIR$\..\..\..\..\Source\ARMCM4_S32K14\types.h</file>
<file>$PROJ_DIR$\..\lib\S32K144.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\ARMCM4_S32K14\nvm.c</file>
<file>$PROJ_DIR$\..\lib\devassert.h</file>
<file>$PROJ_DIR$\..\lib\s32_core_cm4.h</file>
<file>$PROJ_DIR$\..\lib\system_S32K144.h</file>
<file>$PROJ_DIR$\..\obj\hooks.__cstat.et</file>
<file>$PROJ_DIR$\..\obj\rs232.__cstat.et</file>
<file>$PROJ_DIR$\..\obj\com.xcl</file>
<file>$PROJ_DIR$\..\obj\nvm.__cstat.et</file>
<file>$PROJ_DIR$\..\obj\cop.__cstat.et</file>
<file>$TOOLKIT_DIR$\inc\c\string.h</file>
<file>$TOOLKIT_DIR$\inc\c\ysizet.h</file>
<file>$PROJ_DIR$\..\obj\cpu.xcl</file>
<file>$PROJ_DIR$\..\obj\assert.__cstat.et</file>
<file>$PROJ_DIR$\..\obj\can.__cstat.et</file>
<file>$PROJ_DIR$\..\obj\can.xcl</file>
<file>$PROJ_DIR$\..\obj\nvm.xcl</file>
<file>$PROJ_DIR$\..\obj\cop.xcl</file>
<file>$PROJ_DIR$\..\obj\file.xcl</file>
<file>$PROJ_DIR$\..\obj\cpu_comp.__cstat.et</file>
<file>$TOOLKIT_DIR$\inc\c\DLib_Product_string.h</file>
<file>$PROJ_DIR$\..\obj\backdoor.__cstat.et</file>
<file>$PROJ_DIR$\..\obj\file.__cstat.et</file>
<file>$PROJ_DIR$\..\obj\xcp.__cstat.et</file>
<file>$TOOLKIT_DIR$\inc\c\ctype.h</file>
<file>$PROJ_DIR$\..\obj\can.o</file>
<file>$PROJ_DIR$\..\obj\assert.xcl</file>
<file>$PROJ_DIR$\..\obj\cpu_comp.xcl</file>
<file>$PROJ_DIR$\..\obj\backdoor.xcl</file>
<file>$PROJ_DIR$\..\obj\flash.__cstat.et</file>
<file>$PROJ_DIR$\..\obj\net.__cstat.et</file>
<file>$PROJ_DIR$\..\obj\cpu.__cstat.et</file>
<file>$PROJ_DIR$\..\obj\hooks.xcl</file>
<file>$PROJ_DIR$\..\obj\com.__cstat.et</file>
<file>$PROJ_DIR$\..\obj\hooks.o</file>
<file>$PROJ_DIR$\..\obj\rs232.xcl</file>
<file>$PROJ_DIR$\..\obj\net.xcl</file>
<file>$PROJ_DIR$\..\obj\net.o</file>
<file>$PROJ_DIR$\..\obj\file.o</file>
<file>$PROJ_DIR$\..\obj\cpu_comp.o</file>
<file>$PROJ_DIR$\..\obj\cop.o</file>
<file>$PROJ_DIR$\..\obj\xcp.o</file>
<file>$PROJ_DIR$\..\obj\flash.xcl</file>
<file>$PROJ_DIR$\..\obj\flash.o</file>
<file>$PROJ_DIR$\..\obj\cpu.o</file>
<file>$PROJ_DIR$\..\obj\backdoor.o</file>
<file>$PROJ_DIR$\..\obj\rs232.o</file>
<file>$PROJ_DIR$\..\obj\assert.o</file>
<file>$PROJ_DIR$\..\obj\nvm.o</file>
<file>$PROJ_DIR$\..\obj\com.o</file>
<file>$PROJ_DIR$\..\obj\startup_S32K144.o</file>
<file>$PROJ_DIR$\..\obj\s32k144.pbd</file>
<file>$PROJ_DIR$\..\obj\boot.__cstat.et</file>
<file>$PROJ_DIR$\..\obj\timer.xcl</file>
<file>$PROJ_DIR$\..\obj\boot.xcl</file>
<file>$PROJ_DIR$\..\obj\led.o</file>
<file>$PROJ_DIR$\..\obj\startup.__cstat.et</file>
<file>$PROJ_DIR$\..\bin\openblt_s32k144.out</file>
<file>$PROJ_DIR$\..\obj\xcp.xcl</file>
<file>$PROJ_DIR$\..\obj\timer.o</file>
<file>$TOOLKIT_DIR$\inc\c\yvals.h</file>
<file>$PROJ_DIR$\..\timer.c</file>
<file>$TOOLKIT_DIR$\inc\c\DLib_Product.h</file>
<file>$TOOLKIT_DIR$\inc\c\DLib_Defaults.h</file>
<file>$PROJ_DIR$\..\obj\led.xcl</file>
<file>$PROJ_DIR$\..\bin\demoprog_s32k144.srec</file>
<file>$PROJ_DIR$\..\obj\main.xcl</file>
<file>$PROJ_DIR$\..\header.h</file>
<file>$PROJ_DIR$\..\obj\openblt_s32k144.map</file>
<file>$PROJ_DIR$\..\obj\main.o</file>
<file>$PROJ_DIR$\..\S32K144_64_flash.icf</file>
<file>$TOOLKIT_DIR$\inc\c\stdbool.h</file>
<file>$PROJ_DIR$\..\obj\system_S32K144.o</file>
<file>$PROJ_DIR$\..\obj\startup.xcl</file>
<file>$PROJ_DIR$\..\obj\boot.o</file>
<file>$PROJ_DIR$\..\obj\system_S32K144.__cstat.et</file>
<file>$TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h</file>
<file>$PROJ_DIR$\..\obj\timer.__cstat.et</file>
<file>$TOOLKIT_DIR$\lib\shb_l.a</file>
<file>$PROJ_DIR$\..\obj\main.__cstat.et</file>
<file>$TOOLKIT_DIR$\inc\c\ycheck.h</file>
<file>$PROJ_DIR$\..\boot.c</file>
<file>$PROJ_DIR$\..\..\..\..\Source\com.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\xcp.c</file>
<file>$PROJ_DIR$\..\..\..\..\Source\cop.c</file>
<file>$PROJ_DIR$\..\..\..\..\Source\rs232.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\usb.h</file>
<file>$PROJ_DIR$\..\obj\system_S32K144.xcl</file>
<file>$PROJ_DIR$\..\..\..\..\Source\timer.h</file>
<file>$PROJ_DIR$\..\obj\startup.o</file>
<file>$PROJ_DIR$\..\boot.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\boot.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\com.c</file>
<file>$PROJ_DIR$\..\..\..\..\Source\net.c</file>
<file>$TOOLKIT_DIR$\lib\m7M_tls.a</file>
<file>$TOOLKIT_DIR$\lib\rt7M_tl.a</file>
<file>$PROJ_DIR$\..\obj\led.__cstat.et</file>
<file>$TOOLKIT_DIR$\inc\c\stdint.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\assert.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\boot.c</file>
<file>$PROJ_DIR$\..\..\..\..\Source\can.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\backdoor.c</file>
<file>$PROJ_DIR$\..\..\..\..\Source\cop.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\cpu.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\file.c</file>
<file>$PROJ_DIR$\..\..\..\..\Source\file.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\net.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\nvm.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\backdoor.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\plausibility.h</file>
<file>$PROJ_DIR$\..\timer.h</file>
<file>$PROJ_DIR$\..\..\..\..\Source\xcp.h</file>
<file>$TOOLKIT_DIR$\lib\dl7M_tln.a</file>
<file>$PROJ_DIR$\..\bin\openblt_s32k144.srec</file>
</outputs>
<file>
<name>[ROOT_NODE]</name>
<outputs>
<tool>
<name>ILINK</name>
<file> 77 88</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\main.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 89</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 86</file>
</tool>
<tool>
<name>__cstat</name>
<file> 99</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131 5 23 20 117 100 80 83 96 82 10 22 91 24</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\assert.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 67</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 46</file>
</tool>
<tool>
<name>__cstat</name>
<file> 33</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\hooks.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 54</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 52</file>
</tool>
<tool>
<name>__cstat</name>
<file> 25</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131 14 5 23 20 117 100 80 83 96 82 10 22 91</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\ARMCM4_S32K14\IAR\cpu_comp.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 59</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 47</file>
</tool>
<tool>
<name>__cstat</name>
<file> 39</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\startup_S32K144.s</name>
<outputs>
<tool>
<name>AARM</name>
<file> 70</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\led.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 75</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 84</file>
</tool>
<tool>
<name>__cstat</name>
<file> 116</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131 14 5 23 20 117 100 80 83 96 82 10 22 91</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\ARMCM4_S32K14\can.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 45</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 35</file>
</tool>
<tool>
<name>__cstat</name>
<file> 34</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131 5 23 20 117 100 80 83 96 82 10 22 91</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\lib\system_S32K144.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 92</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 107</file>
</tool>
<tool>
<name>__cstat</name>
<file> 95</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 5 23 20 117 100 80 83 96 82 10 22 91 24</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\ARMCM4_S32K14\cpu.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 64</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 32</file>
</tool>
<tool>
<name>__cstat</name>
<file> 51</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131 5 23 20 117 100 80 83 96 82 10 22 91</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\lib\startup.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 109</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 93</file>
</tool>
<tool>
<name>__cstat</name>
<file> 76</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 16 117 100 80 83 96 82 5 23 20 10 22 91</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\ARMCM4_S32K14\flash.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 63</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 62</file>
</tool>
<tool>
<name>__cstat</name>
<file> 49</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131 5 23 20 117 100 80 83 96 82 10 22 91</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\ARMCM4_S32K14\rs232.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 66</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 55</file>
</tool>
<tool>
<name>__cstat</name>
<file> 26</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131 5 23 20 117 100 80 83 96 82 10 22 91</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\ARMCM4_S32K14\timer.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 79</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 73</file>
</tool>
<tool>
<name>__cstat</name>
<file> 97</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131 5 23 20 117 100 80 83 96 82 10 22 91</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\ARMCM4_S32K14\nvm.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 68</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 36</file>
</tool>
<tool>
<name>__cstat</name>
<file> 28</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131 15</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\bin\openblt_s32k144.out</name>
<outputs>
<tool>
<name>ILINK</name>
<file> 88</file>
</tool>
<tool>
<name>OBJCOPY</name>
<file> 133</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ILINK</name>
<file> 90 67 65 94 45 69 60 64 59 58 63 54 75 89 57 68 66 109 70 92 79 61 98 115 114 132</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\timer.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 79</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 73</file>
</tool>
<tool>
<name>__cstat</name>
<file> 97</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 87 2 110 14 130 5 23 20 117 100 80 83 96 82 10 22 91 24</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\boot.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 94</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 74</file>
</tool>
<tool>
<name>__cstat</name>
<file> 72</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 87 2 110 14 130 5 23 20 117 100 80 83 96 82 10 22 91 24</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\xcp.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 61</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 78</file>
</tool>
<tool>
<name>__cstat</name>
<file> 43</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\cop.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 60</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 37</file>
</tool>
<tool>
<name>__cstat</name>
<file> 29</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\com.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 69</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 27</file>
</tool>
<tool>
<name>__cstat</name>
<file> 53</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131 120 105</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\net.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 57</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 56</file>
</tool>
<tool>
<name>__cstat</name>
<file> 50</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\boot.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 94</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 74</file>
</tool>
<tool>
<name>__cstat</name>
<file> 72</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\backdoor.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 65</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 48</file>
</tool>
<tool>
<name>__cstat</name>
<file> 41</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\file.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 58</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 38</file>
</tool>
<tool>
<name>__cstat</name>
<file> 42</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 111 19 118 2 129 123 122 127 108 128 125 102 131 30 100 80 83 96 82 31 40 44</file>
</tool>
</inputs>
</file>
</configuration>
<configuration>
<name>Release</name>
<outputs />
<forcedrebuild>
<name>[MULTI_TOOL]</name>
<tool>ILINK</tool>
</forcedrebuild>
</configuration>
</project>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<workspace>
<project>
<path>$WS_DIR$\s32k144.ewp</path>
</project>
<batchBuild />
</workspace>

View File

@ -0,0 +1,108 @@
/************************************************************************************//**
* \file Demo/ARMCM4_S32K14_S32K144EVB_IAR/Boot/led.c
* \brief LED driver source file.
* \ingroup Boot_ARMCM4_S32K14_S32K144EVB_IAR
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
/****************************************************************************************
* Include files
****************************************************************************************/
#include "boot.h" /* bootloader generic header */
#include "led.h" /* module header */
#include "device_registers.h" /* device registers */
/****************************************************************************************
* Local data declarations
****************************************************************************************/
/** \brief Holds the desired LED blink interval time. */
static blt_int16u ledBlinkIntervalMs;
/************************************************************************************//**
** \brief Initializes the LED blink driver.
** \param interval_ms Specifies the desired LED blink interval time in milliseconds.
** \return none.
**
****************************************************************************************/
void LedBlinkInit(blt_int16u interval_ms)
{
/* LED GPIO pin configuration. PD0 = GPIO, MUX = ALT1. */
PORTD->PCR[0] |= PORT_PCR_MUX(1);
/* configure Port D pin 0 GPIO as digital output */
PTD->PDDR |= GPIO_PDDR_PDD(0x00000001);
/* turn the LED off on Port D pin 0 */
PTD->PSOR |= GPIO_PSOR_PTSO(0x00000001);
/* store the interval time between LED toggles */
ledBlinkIntervalMs = interval_ms;
} /*** end of LedBlinkInit ***/
/************************************************************************************//**
** \brief Task function for blinking the LED as a fixed timer interval.
** \return none.
**
****************************************************************************************/
void LedBlinkTask(void)
{
static blt_bool ledOn = BLT_FALSE;
static blt_int32u nextBlinkEvent = 0;
/* check for blink event */
if (TimerGet() >= nextBlinkEvent)
{
/* toggle the LED state */
if (ledOn == BLT_FALSE)
{
ledOn = BLT_TRUE;
/* Turn the LED on. */
PTD->PCOR |= GPIO_PCOR_PTCO(0x00000001);
}
else
{
ledOn = BLT_FALSE;
/* Turn the LED off. */
PTD->PSOR |= GPIO_PSOR_PTSO(0x00000001);
}
/* schedule the next blink event */
nextBlinkEvent = TimerGet() + ledBlinkIntervalMs;
}
} /*** end of LedBlinkTask ***/
/************************************************************************************//**
** \brief Cleans up the LED blink driver. This is intended to be used upon program
** exit.
** \return none.
**
****************************************************************************************/
void LedBlinkExit(void)
{
/* Turn the LED off. */
PTD->PSOR |= GPIO_PSOR_PTSO(0x00000001);
} /*** end of LedBlinkExit ***/
/*********************************** end of led.c **************************************/

View File

@ -0,0 +1,40 @@
/************************************************************************************//**
* \file Demo/ARMCM4_S32K14_S32K144EVB_IAR/Boot/led.h
* \brief LED driver header file.
* \ingroup Boot_ARMCM4_S32K14_S32K144EVB_IAR
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
#ifndef LED_H
#define LED_H
/****************************************************************************************
* Function prototypes
****************************************************************************************/
void LedBlinkInit(blt_int16u interval_ms);
void LedBlinkTask(void);
void LedBlinkExit(void);
#endif /* LED_H */
/*********************************** end of led.h **************************************/

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,84 @@
/*
* Copyright (c) 2015, Freescale Semiconductor, Inc.
* Copyright 2016-2017 NXP
* All rights reserved.
*
* THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef DEVASSERT_H
#define DEVASSERT_H
#include <stdbool.h>
/**
* @page misra_violations MISRA-C:2012 violations
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 2.5, global macro not referenced.
* The macro is defined to be used by drivers to validate input parameters and can be disabled.
*
* @section [global]
* Violates MISRA 2012 Advisory Directive 4.9, Function-like macro defined.
* The macros are used to validate input parameters to driver functions.
*
*/
/**
\page Error_detection_and_reporting Error detection and reporting
S32 SDK drivers can use a mechanism to validate data coming from upper software layers (application code) by performing
a number of checks on input parameters' range or other invariants that can be statically checked (not dependent on
runtime conditions). A failed validation is indicative of a software bug in application code, therefore it is important
to use this mechanism during development.
The validation is performed by using DEV_ASSERT macro.
A default implementation of this macro is provided in this file. However, application developers can provide their own
implementation in a custom file. This requires defining the CUSTOM_DEVASSERT symbol with the specific file name in the
project configuration (for example: -DCUSTOM_DEVASSERT="custom_devassert.h")
The default implementation accommodates two behaviors, based on DEV_ERROR_DETECT symbol:
- When DEV_ERROR_DETECT symbol is defined in the project configuration (for example: -DDEV_ERROR_DETECT), the validation
performed by the DEV_ASSERT macro is enabled, and a failed validation triggers a software breakpoint and further execution is
prevented (application spins in an infinite loop)
This configuration is recommended for development environments, as it prevents further execution and allows investigating
potential problems from the point of error detection.
- When DEV_ERROR_DETECT symbol is not defined, the DEV_ASSERT macro is implemented as no-op, therefore disabling all validations.
This configuration can be used to eliminate the overhead of development-time checks.
It is the application developer's responsibility to decide the error detection strategy for production code: one can opt to
disable development-time checking altogether (by not defining DEV_ERROR_DETECT symbol), or one can opt to keep the checks
in place and implement a recovery mechanism in case of a failed validation, by defining CUSTOM_DEVASSERT to point
to the file containing the custom implementation.
*/
#if defined (CUSTOM_DEVASSERT)
/* If the CUSTOM_DEVASSERT symbol is defined, then add the custom implementation */
#include CUSTOM_DEVASSERT
#elif defined (DEV_ERROR_DETECT)
/* Implement default assert macro */
static inline void DevAssert(volatile bool x)
{
if(x) { } else { BKPT_ASM; for(;;) {} }
}
#define DEV_ASSERT(x) DevAssert(x)
#else
/* Assert macro does nothing */
#define DEV_ASSERT(x) ((void)0)
#endif
#endif /* DEVASSERT_H */
/*******************************************************************************
* EOF
******************************************************************************/

View File

@ -0,0 +1,70 @@
/*
** ###################################################################
** Abstract:
** Common include file for CMSIS register access layer headers.
**
** Copyright (c) 2015 Freescale Semiconductor, Inc.
** Copyright 2016-2017 NXP
** All rights reserved.
**
** THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
** IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
** INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
** STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
** IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
** THE POSSIBILITY OF SUCH DAMAGE.
**
** http: www.nxp.com
** mail: support@nxp.com
** ###################################################################
*/
#ifndef DEVICE_REGISTERS_H
#define DEVICE_REGISTERS_H
/**
* @page misra_violations MISRA-C:2012 violations
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 2.5, global macro not referenced.
* The macro defines the device currently in use and may be used by components for specific checks.
*
*/
/*
* Include the cpu specific register header files.
*
* The CPU macro should be declared in the project or makefile.
*/
#if (defined(CPU_S32K144HFT0VLLT) || defined(CPU_S32K144LFT0MLLT))
#define S32K14x_SERIES
/* Specific core definitions */
#include "s32_core_cm4.h"
#define S32K144_SERIES
/* Register definitions */
#include "S32K144.h"
/* CPU specific feature definitions */
#include "S32K144_features.h"
#else
#error "No valid CPU defined!"
#endif
#include "devassert.h"
#endif /* DEVICE_REGISTERS_H */
/*******************************************************************************
* EOF
******************************************************************************/

View File

@ -0,0 +1,209 @@
/*
* Copyright (c) 2015-2016 Freescale Semiconductor, Inc.
* Copyright 2016-2017 NXP
* All rights reserved.
*
* THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
*/
/*!
* @file s32_core_cm4.h
*
* @page misra_violations MISRA-C:2012 violations
*
* @section [global]
* Violates MISRA 2012 Advisory Directive 4.9, Function-like macro
* Function-like macros are used instead of inline functions in order to ensure
* that the performance will not be decreased if the functions will not be
* inlined by the compiler.
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 2.5, Global macro not referenced.
* The macros defined are used only on some of the drivers, so this might be reported
* when the analysis is made only on one driver.
*/
/*
* Tool Chains:
* GNUC flag is defined also by ARM compiler - it shows the current major version of the compatible GCC version
* __GNUC__ : GNU Compiler Collection
* __ghs__ : Green Hills ARM Compiler
* __ICCARM__ : IAR ARM Compiler
* __DCC__ : Wind River Diab Compiler
* __ARMCC_VERSION: ARM Compiler
*/
#if !defined (CORE_CM4_H)
#define CORE_CM4_H
#ifdef __cplusplus
extern "C" {
#endif
/** \brief BKPT_ASM
*
* Macro to be used to trigger an debug interrupt
*/
#define BKPT_ASM __asm("BKPT #0\n\t")
/** \brief Enable FPU
*
* ENABLE_FPU indicates whether SystemInit will enable the Floating point unit (FPU)
*/
#if defined (__GNUC__) || defined (__ARMCC_VERSION)
#if defined (__VFP_FP__) && !defined (__SOFTFP__)
#define ENABLE_FPU
#endif
#elif defined (__ICCARM__)
#if defined __ARMVFP__
#define ENABLE_FPU
#endif
#elif defined (__ghs__) || defined (__DCC__)
#if defined (__VFP__)
#define ENABLE_FPU
#endif
#endif /* if defined (__GNUC__) */
/** \brief Enable interrupts
*/
#if defined (__GNUC__)
#define ENABLE_INTERRUPTS() __asm volatile ("cpsie i" : : : "memory");
#else
#define ENABLE_INTERRUPTS() __asm("cpsie i")
#endif
/** \brief Disable interrupts
*/
#if defined (__GNUC__)
#define DISABLE_INTERRUPTS() __asm volatile ("cpsid i" : : : "memory");
#else
#define DISABLE_INTERRUPTS() __asm("cpsid i")
#endif
/** \brief Enter low-power standby state
* WFI (Wait For Interrupt) makes the processor suspend execution (Clock is stopped) until an IRQ interrupts.
*/
#if defined (__GNUC__)
#define STANDBY() __asm volatile ("wfi")
#else
#define STANDBY() __asm("wfi")
#endif
/** \brief No-op
*/
#define NOP() __asm volatile ("nop")
/** \brief Reverse byte order in a word.
*/
#if defined (__GNUC__) || defined (__ICCARM__) || defined (__ghs__) || defined (__ARMCC_VERSION)
#define REV_BYTES_32(a, b) __asm volatile ("rev %0, %1" : "=r" (b) : "r" (a))
#else
#define REV_BYTES_32(a, b) (b = ((a & 0xFF000000U) >> 24U) | ((a & 0xFF0000U) >> 8U) \
| ((a & 0xFF00U) << 8U) | ((a & 0xFFU) << 24U))
#endif
/** \brief Reverse byte order in each halfword independently.
*/
#if defined (__GNUC__) || defined (__ICCARM__) || defined (__ghs__) || defined (__ARMCC_VERSION)
#define REV_BYTES_16(a, b) __asm volatile ("rev16 %0, %1" : "=r" (b) : "r" (a))
#else
#define REV_BYTES_16(a, b) (b = ((a & 0xFF000000U) >> 8U) | ((a & 0xFF0000U) << 8U) \
| ((a & 0xFF00U) >> 8U) | ((a & 0xFFU) << 8U))
#endif
/** \brief Places a function in RAM.
*/
#if defined ( __GNUC__ ) || defined (__ARMCC_VERSION)
#define START_FUNCTION_DECLARATION_RAMSECTION
#define END_FUNCTION_DECLARATION_RAMSECTION __attribute__((section (".code_ram")));
#elif defined ( __ghs__ )
#define START_FUNCTION_DECLARATION_RAMSECTION _Pragma("ghs callmode=far")
#define END_FUNCTION_DECLARATION_RAMSECTION __attribute__((section (".code_ram")));\
_Pragma("ghs callmode=default")
#elif defined ( __ICCARM__ )
#define START_FUNCTION_DECLARATION_RAMSECTION __ramfunc
#define END_FUNCTION_DECLARATION_RAMSECTION ;
#elif defined ( __DCC__ )
#define START_FUNCTION_DECLARATION_RAMSECTION _Pragma("section CODE \".code_ram\"") \
_Pragma("use_section CODE")
#define END_FUNCTION_DECLARATION_RAMSECTION ; \
_Pragma("section CODE \".text\"")
#else
/* Keep compatibility with software analysis tools */
#define START_FUNCTION_DECLARATION_RAMSECTION
#define END_FUNCTION_DECLARATION_RAMSECTION ;
#endif
/* For GCC, IAR, GHS, Diab and ARMC there is no need to specify the section when
defining a function, it is enough to specify it at the declaration. This
also enables compatibility with software analysis tools. */
#define START_FUNCTION_DEFINITION_RAMSECTION
#define END_FUNCTION_DEFINITION_RAMSECTION
#if defined (__ICCARM__)
#define DISABLE_CHECK_RAMSECTION_FUNCTION_CALL _Pragma("diag_suppress=Ta022")
#define ENABLE_CHECK_RAMSECTION_FUNCTION_CALL _Pragma("diag_default=Ta022")
#else
#define DISABLE_CHECK_RAMSECTION_FUNCTION_CALL
#define ENABLE_CHECK_RAMSECTION_FUNCTION_CALL
#endif
/** \brief Get Core ID
*
* GET_CORE_ID returns the processor identification number for cm4
*/
#define GET_CORE_ID() 0U
/** \brief Data alignment.
*/
#if defined ( __GNUC__ ) || defined ( __ghs__ ) || defined ( __DCC__ ) || defined (__ARMCC_VERSION)
#define ALIGNED(x) __attribute__((aligned(x)))
#elif defined ( __ICCARM__ )
#define stringify(s) tostring(s)
#define tostring(s) #s
#define ALIGNED(x) _Pragma(stringify(data_alignment=x))
#else
/* Keep compatibility with software analysis tools */
#define ALIGNED(x)
#endif
/** \brief Section placement.
*/
#if defined ( __GNUC__ ) || defined ( __ghs__ ) || defined ( __DCC__ ) || defined (__ARMCC_VERSION)
#define PLACE_IN_SECTION(x) __attribute__((section(x)))
#elif defined ( __ICCARM__ )
#define PLACE_IN_SECTION(x) _Pragma(stringify(section=x))
#else
/* Keep compatibility with software analysis tools */
#define PLACE_IN_SECTION(x)
#endif
/** \brief Endianness.
*/
#define CORE_LITTLE_ENDIAN
#ifdef __cplusplus
}
#endif
#endif /* CORE_CM4_H */
/*******************************************************************************
* EOF
******************************************************************************/

View File

@ -0,0 +1,248 @@
/*
* Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc.
* Copyright 2016-2018 NXP
* All rights reserved.
*
* THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @page misra_violations MISRA-C:2012 violations
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block
* scope if its identifier only appears in a single function.
* All variables with this problem are defined in the linker files.
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 8.11, When an array with external linkage
* is declared, its size should be explicitly specified.
* The size of the arrays can not be explicitly determined.
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 11.4, A conversion should not be performed
* between a pointer to object and an integer type.
* The cast is required to initialize a pointer with an unsigned int define,
* representing an address.
*
* @section [global]
* Violates MISRA 2012 Required Rule 11.6, A cast shall not be performed
* between pointer to void and an arithmetic type.
* The cast is required to initialize a pointer with an unsigned int define,
* representing an address.
*
* @section [global]
* Violates MISRA 2012 Required Rule 2.1, A project shall not contain unreachable
* code.
* The condition compares two address defined in linker files that can be different.
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 8.7, External could be made static.
* Function is defined for usage by application code.
*
* @section [global]
* Violates MISRA 2012 Mandatory Rule 17.3, Symbol 'MFSPR' undeclared, assumed
* to return int.
* This is an e200 Power Architecture Assembly instruction used to retrieve
* the core number.
*
*/
#include "startup.h"
#include <stdint.h>
/*******************************************************************************
* Static Variables
******************************************************************************/
static volatile uint32_t * const s_vectors[NUMBER_OF_CORES] = FEATURE_INTERRUPT_INT_VECTORS;
/*******************************************************************************
* Code
******************************************************************************/
/*FUNCTION**********************************************************************
*
* Function Name : init_data_bss
* Description : Make necessary initializations for RAM.
* - Copy the vector table from ROM to RAM.
* - Copy initialized data from ROM to RAM.
* - Copy code that should reside in RAM from ROM
* - Clear the zero-initialized data section.
*
* Tool Chains:
* __GNUC__ : GNU Compiler Collection
* __ghs__ : Green Hills ARM Compiler
* __ICCARM__ : IAR ARM Compiler
* __DCC__ : Wind River Diab Compiler
* __ARMCC_VERSION : ARMC Compiler
*
* Implements : init_data_bss_Activity
*END**************************************************************************/
void init_data_bss(void)
{
uint32_t n;
uint8_t coreId;
/* For ARMC we are using the library method of initializing DATA, Custom Section and
* Code RAM sections so the below variables are not needed */
#if !defined(__ARMCC_VERSION)
/* Declare pointers for various data sections. These pointers
* are initialized using values pulled in from the linker file */
uint8_t * data_ram;
uint8_t * code_ram;
uint8_t * bss_start;
uint8_t * custom_ram;
const uint8_t * data_rom, * data_rom_end;
const uint8_t * code_rom, * code_rom_end;
const uint8_t * bss_end;
const uint8_t * custom_rom, * custom_rom_end;
#endif
/* Addresses for VECTOR_TABLE and VECTOR_RAM come from the linker file */
#if defined(__ARMCC_VERSION)
extern uint32_t __RAM_VECTOR_TABLE_SIZE;
extern uint32_t __VECTOR_ROM;
extern uint32_t __VECTOR_RAM;
#else
extern uint32_t __RAM_VECTOR_TABLE_SIZE[];
extern uint32_t __VECTOR_TABLE[];
extern uint32_t __VECTOR_RAM[];
#endif
/* Get section information from linker files */
#if defined(__ICCARM__)
/* Data */
data_ram = __section_begin(".data");
data_rom = __section_begin(".data_init");
data_rom_end = __section_end(".data_init");
/* CODE RAM */
#pragma section = "__CODE_ROM"
#pragma section = "__CODE_RAM"
code_ram = __section_begin("__CODE_RAM");
code_rom = __section_begin("__CODE_ROM");
code_rom_end = __section_end("__CODE_ROM");
/* BSS */
bss_start = __section_begin(".bss");
bss_end = __section_end(".bss");
custom_ram = __section_begin(".customSection");
custom_rom = __section_begin(".customSection_init");
custom_rom_end = __section_end(".customSection_init");
#elif defined (__ARMCC_VERSION)
/* VECTOR TABLE*/
uint8_t * vector_table_size = (uint8_t *)__RAM_VECTOR_TABLE_SIZE;
uint32_t * vector_rom = (uint32_t *)__VECTOR_ROM;
uint32_t * vector_ram = (uint32_t *)__VECTOR_RAM;
#else
extern uint32_t __DATA_ROM[];
extern uint32_t __DATA_RAM[];
extern uint32_t __DATA_END[];
extern uint32_t __CODE_RAM[];
extern uint32_t __CODE_ROM[];
extern uint32_t __CODE_END[];
extern uint32_t __BSS_START[];
extern uint32_t __BSS_END[];
extern uint32_t __CUSTOM_ROM[];
extern uint32_t __CUSTOM_END[];
/* Data */
data_ram = (uint8_t *)__DATA_RAM;
data_rom = (uint8_t *)__DATA_ROM;
data_rom_end = (uint8_t *)__DATA_END;
/* CODE RAM */
code_ram = (uint8_t *)__CODE_RAM;
code_rom = (uint8_t *)__CODE_ROM;
code_rom_end = (uint8_t *)__CODE_END;
/* BSS */
bss_start = (uint8_t *)__BSS_START;
bss_end = (uint8_t *)__BSS_END;
/* Custom section */
custom_ram = CUSTOMSECTION_SECTION_START;
custom_rom = (uint8_t *)__CUSTOM_ROM;
custom_rom_end = (uint8_t *)__CUSTOM_END;
#endif
#if !defined(__ARMCC_VERSION)
/* Copy initialized data from ROM to RAM */
while (data_rom_end != data_rom)
{
*data_ram = *data_rom;
data_ram++;
data_rom++;
}
/* Copy functions from ROM to RAM */
while (code_rom_end != code_rom)
{
*code_ram = *code_rom;
code_ram++;
code_rom++;
}
/* Clear the zero-initialized data section */
while(bss_end != bss_start)
{
*bss_start = 0;
bss_start++;
}
/* Copy customsection rom to ram */
while(custom_rom_end != custom_rom)
{
*custom_ram = *custom_rom;
custom_rom++;
custom_ram++;
}
#endif
coreId = (uint8_t)GET_CORE_ID();
#if defined (__ARMCC_VERSION)
/* Copy the vector table from ROM to RAM */
/* Workaround */
for (n = 0; n < (((uint32_t)(vector_table_size))/sizeof(uint32_t)); n++)
{
vector_ram[n] = vector_rom[n];
}
/* Point the VTOR to the position of vector table */
*s_vectors[coreId] = (uint32_t) __VECTOR_RAM;
#else
/* Check if VECTOR_TABLE copy is needed */
if (__VECTOR_RAM != __VECTOR_TABLE)
{
/* Copy the vector table from ROM to RAM */
for (n = 0; n < (((uint32_t)__RAM_VECTOR_TABLE_SIZE)/sizeof(uint32_t)); n++)
{
__VECTOR_RAM[n] = __VECTOR_TABLE[n];
}
/* Point the VTOR to the position of vector table */
*s_vectors[coreId] = (uint32_t)__VECTOR_RAM;
}
else
{
/* Point the VTOR to the position of vector table */
*s_vectors[coreId] = (uint32_t)__VECTOR_TABLE;
}
#endif
}
/*******************************************************************************
* EOF
******************************************************************************/

View File

@ -0,0 +1,133 @@
/*
* Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc.
* Copyright 2016-2019 NXP
* All rights reserved.
*
* THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef STARTUP_H
#define STARTUP_H
#include <stdint.h>
#include "device_registers.h"
/**
* @page misra_violations MISRA-C:2012 violations
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 2.5, Local macro not referenced.
* The defined macro is used as include guard.
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block
* scope if its identifier only appears in a single function.
* All variables with this problem are defined in the linker files.
*
*/
/*******************************************************************************
* API
******************************************************************************/
/*!
* @brief define symbols that specific start and end addres of some basic sections.
*/
#if (defined(S32K14x_SERIES) || defined(S32K11x_SERIES) || defined(S32V234_SERIES) || defined(MPC574x_SERIES) || defined(S32R_SERIES) || defined(S32MTV_SERIES) || defined(SJA1110_SERIES)) || defined (S32K144W_M4_SERIES)
#if (defined(__ICCARM__))
#define INTERRUPTS_SECTION_START __section_begin(".intvec")
#define INTERRUPTS_SECTION_END __section_end(".intvec")
#define BSS_SECTION_START __section_begin(".bss")
#define BSS_SECTION_END __section_end(".bss")
#define DATA_SECTION_START __section_begin(".data")
#define DATA_SECTION_END __section_end(".data")
#define CUSTOMSECTION_SECTION_START __section_begin(".customSection")
#define CUSTOMSECTION_SECTION_END __section_end(".customSection")
#define CODE_RAM_SECTION_START __section_begin("__CODE_RAM")
#define CODE_RAM_SECTION_END __section_end("__CODE_RAM")
#define DATA_INIT_SECTION_START __section_begin(".data_init")
#define DATA_INIT_SECTION_END __section_end(".data_init")
#define CODE_ROM_SECTION_START __section_begin("__CODE_ROM")
#define CODE_ROM_SECTION_END __section_end("__CODE_ROM")
#elif (defined(__ARMCC_VERSION))
#define INTERRUPTS_SECTION_START (uint8_t *)__VECTOR_ROM_START
#define INTERRUPTS_SECTION_END (uint8_t *)__VECTOR_ROM_END
#define BSS_SECTION_START (uint8_t *)__BSS_START
#define BSS_SECTION_END (uint8_t *)__BSS_END
#define DATA_SECTION_START (uint8_t *)__DATA_RAM_START
#define DATA_SECTION_END (uint8_t *)__DATA_RAM_END
#define CUSTOMSECTION_SECTION_START (uint8_t *)__CUSTOM_SECTION_START
#define CUSTOMSECTION_SECTION_END (uint8_t *)__CUSTOM_SECTION_END
#define CODE_RAM_SECTION_START (uint8_t *)__CODE_RAM_START
#define CODE_RAM_SECTION_END (uint8_t *)__CODE_RAM_END
extern uint32_t __VECTOR_ROM_START;
extern uint32_t __VECTOR_ROM_END;
extern uint32_t __BSS_START;
extern uint32_t __BSS_END;
extern uint32_t __DATA_RAM_START;
extern uint32_t __DATA_RAM_END;
extern uint32_t __CUSTOM_SECTION_START;
extern uint32_t __CUSTOM_SECTION_END;
extern uint32_t __CODE_RAM_START;
extern uint32_t __CODE_RAM_END;
#else
#define INTERRUPTS_SECTION_START (uint8_t *)&__interrupts_start__
#define INTERRUPTS_SECTION_END (uint8_t *)&__interrupts_end__
#define BSS_SECTION_START (uint8_t *)&__bss_start__
#define BSS_SECTION_END (uint8_t *)&__bss_end__
#define DATA_SECTION_START (uint8_t *)&__data_start__
#define DATA_SECTION_END (uint8_t *)&__data_end__
#define CUSTOMSECTION_SECTION_START (uint8_t *)&__customSection_start__
#define CUSTOMSECTION_SECTION_END (uint8_t *)&__customSection_end__
#define CODE_RAM_SECTION_START (uint8_t *)&__code_ram_start__
#define CODE_RAM_SECTION_END (uint8_t *)&__code_ram_end__
extern uint32_t __interrupts_start__;
extern uint32_t __interrupts_end__;
extern uint32_t __bss_start__;
extern uint32_t __bss_end__;
extern uint32_t __data_start__;
extern uint32_t __data_end__;
extern uint32_t __customSection_start__;
extern uint32_t __customSection_end__;
extern uint32_t __code_ram_start__;
extern uint32_t __code_ram_end__;
#endif
#endif
#if (defined(__ICCARM__))
#pragma section = ".data"
#pragma section = ".data_init"
#pragma section = ".bss"
#pragma section = ".intvec"
#pragma section = ".customSection"
#pragma section = ".customSection_init"
#pragma section = "__CODE_RAM"
#pragma section = "__CODE_ROM"
#endif
/*!
* @brief Make necessary initializations for RAM.
*
* - Copy initialized data from ROM to RAM.
* - Clear the zero-initialized data section.
* - Copy the vector table from ROM to RAM. This could be an option.
*/
void init_data_bss(void);
#endif /* STARTUP_H*/
/*******************************************************************************
* EOF
******************************************************************************/

View File

@ -0,0 +1,197 @@
/*
* Copyright (c) 2015 Freescale Semiconductor, Inc.
* Copyright 2016-2017 NXP
* All rights reserved.
*
* THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @page misra_violations MISRA-C:2012 violations
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block
* scope if its identifier only appears in a single function.
* An object with static storage duration declared at block scope cannot be
* accessed directly from outside the block.
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 11.4, A conversion should not be performed
* between a pointer to object and an integer type.
* The cast is required to initialize a pointer with an unsigned int define,
* representing an address.
*
* @section [global]
* Violates MISRA 2012 Required Rule 11.6, A cast shall not be performed
* between pointer to void and an arithmetic type.
* The cast is required to initialize a pointer with an unsigned int define,
* representing an address.
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 8.7, External could be made static.
* Function is defined for usage by application code.
*
*/
#include "device_registers.h"
#include "system_S32K144.h"
#include "stdbool.h"
/* ----------------------------------------------------------------------------
-- Core clock
---------------------------------------------------------------------------- */
uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK;
/*FUNCTION**********************************************************************
*
* Function Name : SystemInit
* Description : This function disables the watchdog, enables FPU
* and the power mode protection if the corresponding feature macro
* is enabled. SystemInit is called from startup_device file.
*
* Implements : SystemInit_Activity
*END**************************************************************************/
void SystemInit(void)
{
/**************************************************************************/
/* FPU ENABLE*/
/**************************************************************************/
#ifdef ENABLE_FPU
/* Enable CP10 and CP11 coprocessors */
S32_SCB->CPACR |= (S32_SCB_CPACR_CP10_MASK | S32_SCB_CPACR_CP11_MASK);
#ifdef ERRATA_E6940
/* Disable lazy context save of floating point state by clearing LSPEN bit
* Workaround for errata e6940 */
S32_SCB->FPCCR &= ~(S32_SCB_FPCCR_LSPEN_MASK);
#endif
#endif /* ENABLE_FPU */
/**************************************************************************/
/* WDOG DISABLE*/
/**************************************************************************/
#if (DISABLE_WDOG)
/* Write of the WDOG unlock key to CNT register, must be done in order to allow any modifications*/
WDOG->CNT = (uint32_t ) FEATURE_WDOG_UNLOCK_VALUE;
/* The dummy read is used in order to make sure that the WDOG registers will be configured only
* after the write of the unlock value was completed. */
(void)WDOG->CNT;
/* Initial write of WDOG configuration register:
* enables support for 32-bit refresh/unlock command write words,
* clock select from LPO, update enable, watchdog disabled */
WDOG->CS = (uint32_t ) ( (1UL << WDOG_CS_CMD32EN_SHIFT) |
(FEATURE_WDOG_CLK_FROM_LPO << WDOG_CS_CLK_SHIFT) |
(0U << WDOG_CS_EN_SHIFT) |
(1U << WDOG_CS_UPDATE_SHIFT) );
/* Configure timeout */
WDOG->TOVAL = (uint32_t )0xFFFF;
#endif /* (DISABLE_WDOG) */
/**************************************************************************/
/* ENABLE CACHE */
/**************************************************************************/
#if defined(I_CACHE) && (ICACHE_ENABLE == 1)
/* Invalidate and enable code cache */
LMEM->PCCCR = LMEM_PCCCR_INVW0(1) | LMEM_PCCCR_INVW1(1) | LMEM_PCCCR_GO(1) | LMEM_PCCCR_ENCACHE(1);
#endif /* defined(I_CACHE) && (ICACHE_ENABLE == 1) */
}
/*FUNCTION**********************************************************************
*
* Function Name : SystemCoreClockUpdate
* Description : This function must be called whenever the core clock is changed
* during program execution. It evaluates the clock register settings and calculates
* the current core clock.
*
* Implements : SystemCoreClockUpdate_Activity
*END**************************************************************************/
void SystemCoreClockUpdate(void)
{
uint32_t SCGOUTClock = 0U; /* Variable to store output clock frequency of the SCG module */
uint32_t regValue; /* Temporary variable */
uint32_t divider, prediv, multi;
bool validSystemClockSource = true;
static const uint32_t fircFreq[] = {
FEATURE_SCG_FIRC_FREQ0,
};
divider = ((SCG->CSR & SCG_CSR_DIVCORE_MASK) >> SCG_CSR_DIVCORE_SHIFT) + 1U;
switch ((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT) {
case 0x1:
/* System OSC */
SCGOUTClock = CPU_XTAL_CLK_HZ;
break;
case 0x2:
/* Slow IRC */
regValue = (SCG->SIRCCFG & SCG_SIRCCFG_RANGE_MASK) >> SCG_SIRCCFG_RANGE_SHIFT;
if (regValue != 0U)
{
SCGOUTClock = FEATURE_SCG_SIRC_HIGH_RANGE_FREQ;
}
break;
case 0x3:
/* Fast IRC */
regValue = (SCG->FIRCCFG & SCG_FIRCCFG_RANGE_MASK) >> SCG_FIRCCFG_RANGE_SHIFT;
SCGOUTClock= fircFreq[regValue];
break;
case 0x6:
/* System PLL */
SCGOUTClock = CPU_XTAL_CLK_HZ;
prediv = ((SCG->SPLLCFG & SCG_SPLLCFG_PREDIV_MASK) >> SCG_SPLLCFG_PREDIV_SHIFT) + 1U;
multi = ((SCG->SPLLCFG & SCG_SPLLCFG_MULT_MASK) >> SCG_SPLLCFG_MULT_SHIFT) + 16U;
SCGOUTClock = SCGOUTClock * multi / (prediv * 2U);
break;
default:
validSystemClockSource = false;
break;
}
if (validSystemClockSource == true) {
SystemCoreClock = (SCGOUTClock / divider);
}
}
/*FUNCTION**********************************************************************
*
* Function Name : SystemSoftwareReset
* Description : This function is used to initiate a system reset
*
* Implements : SystemSoftwareReset_Activity
*END**************************************************************************/
void SystemSoftwareReset(void)
{
uint32_t regValue;
/* Read Application Interrupt and Reset Control Register */
regValue = S32_SCB->AIRCR;
/* Clear register key */
regValue &= ~( S32_SCB_AIRCR_VECTKEY_MASK);
/* Configure System reset request bit and Register Key */
regValue |= S32_SCB_AIRCR_VECTKEY(FEATURE_SCB_VECTKEY);
regValue |= S32_SCB_AIRCR_SYSRESETREQ(0x1u);
/* Write computed register value */
S32_SCB->AIRCR = regValue;
}
/*******************************************************************************
* EOF
******************************************************************************/

View File

@ -0,0 +1,111 @@
/*
* Copyright (c) 2015 Freescale Semiconductor, Inc.
* Copyright 2016-2017 NXP
* All rights reserved.
*
* THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
/*! @addtogroup soc_support_S32K144*/
/*! @{*/
/*!
* @file system_S32K144.h
* @brief Device specific configuration file for S32K144
*/
#ifndef SYSTEM_S32K144_H_
#define SYSTEM_S32K144_H_ /**< Symbol preventing repeated inclusion */
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/******************************************************************************
* CPU Settings.
*****************************************************************************/
/* Watchdog disable */
#ifndef DISABLE_WDOG
#define DISABLE_WDOG 1
#endif
/* Cache enablement */
#ifndef ICACHE_ENABLE
#define ICACHE_ENABLE 0
#endif
/* Value of the external crystal or oscillator clock frequency in Hz */
#ifndef CPU_XTAL_CLK_HZ
#define CPU_XTAL_CLK_HZ 8000000u
#endif
/* Value of the fast internal oscillator clock frequency in Hz */
#ifndef CPU_INT_FAST_CLK_HZ
#define CPU_INT_FAST_CLK_HZ 48000000u
#endif
/* Default System clock value */
#ifndef DEFAULT_SYSTEM_CLOCK
#define DEFAULT_SYSTEM_CLOCK 48000000u
#endif
/**
* @brief System clock frequency (core clock)
*
* The system clock frequency supplied to the SysTick timer and the processor
* core clock. This variable can be used by the user application to setup the
* SysTick timer or configure other parameters. It may also be used by debugger to
* query the frequency of the debug timer or configure the trace clock speed
* SystemCoreClock is initialized with a correct predefined value.
*/
extern uint32_t SystemCoreClock;
/**
* @brief Setup the SoC.
*
* This function disables the watchdog, enables FPU.
* if the corresponding feature macro is enabled.
* SystemInit is called from startup_device file.
*/
void SystemInit(void);
/**
* @brief Updates the SystemCoreClock variable.
*
* It must be called whenever the core clock is changed during program
* execution. SystemCoreClockUpdate() evaluates the clock register settings and calculates
* the current core clock.
* This function must be called when user does not want to use clock manager component.
* If clock manager is used, the CLOCK_SYS_GetFreq function must be used with CORE_CLOCK
* parameter.
*
*/
void SystemCoreClockUpdate(void);
/**
* @brief Initiates a system reset.
*
* This function is used to initiate a system reset
*/
void SystemSoftwareReset(void);
#ifdef __cplusplus
}
#endif
/*! @}*/
#endif /* #if !defined(SYSTEM_S32K144_H_) */

View File

@ -0,0 +1,208 @@
/************************************************************************************//**
* \file Demo/ARMCM4_S32K14_S32K144EVB_IAR/Boot/main.c
* \brief Bootloader application source file.
* \ingroup Boot_ARMCM4_S32K14_S32K144EVB_IAR
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
/****************************************************************************************
* Include files
****************************************************************************************/
#include "boot.h" /* bootloader generic header */
#include "device_registers.h" /* device registers */
#include "system_S32K144.h" /* device sconfiguration */
/****************************************************************************************
* Function prototypes
****************************************************************************************/
static void Init(void);
static void SystemClockConfig(void);
/************************************************************************************//**
** \brief This is the entry point for the bootloader application and is called
** by the reset interrupt vector after the C-startup routines executed.
** \return none.
**
****************************************************************************************/
int main(void)
{
/* Initialize the microcontroller. */
Init();
/* Initialize the bootloader. */
BootInit();
/* Start the infinite program loop. */
while (1)
{
/* Run the bootloader task. */
BootTask();
}
} /*** end of main ***/
/************************************************************************************//**
** \brief Initializes the microcontroller.
** \return none.
**
****************************************************************************************/
static void Init(void)
{
/* Configure the system clock. */
SystemClockConfig();
/* Enable the peripheral clock for the ports that are used. */
PCC->PCCn[PCC_PORTC_INDEX] |= PCC_PCCn_CGC_MASK;
PCC->PCCn[PCC_PORTD_INDEX] |= PCC_PCCn_CGC_MASK;
PCC->PCCn[PCC_PORTE_INDEX] |= PCC_PCCn_CGC_MASK;
/* Configure SW2 (PC12) GPIO pin for (optional) backdoor entry input. */
/* Input GPIO pin configuration. PC12 = GPIO, MUX = ALT1. */
PORTC->PCR[12] |= PORT_PCR_MUX(1);
/* Disable pull device, as SW2 already has a pull down resistor on the board. */
PORTC->PCR[12] &= ~PORT_PCR_PE(1);
/* Configure and enable Port C pin 12 GPIO as digital input */
PTC->PDDR &= ~GPIO_PDDR_PDD(1 << 12U);
PTC->PIDR &= ~GPIO_PIDR_PID(1 << 12U);
#if (BOOT_COM_RS232_ENABLE > 0)
/* UART RX GPIO pin configuration. PC6 = UART1 RX, MUX = ALT2. */
PORTC->PCR[6] |= PORT_PCR_MUX(2);
/* UART TX GPIO pin configuration. PC7 = UART1 TX, MUX = ALT2. */
PORTC->PCR[7] |= PORT_PCR_MUX(2);
#endif
#if (BOOT_COM_CAN_ENABLE > 0)
/* CAN RX GPIO pin configuration. PE4 = CAN0 RX, MUX = ALT5. */
PORTE->PCR[4] |= PORT_PCR_MUX(5);
/* CAN TX GPIO pin configuration. PE5 = CAN0 TX, MUX = ALT5. */
PORTE->PCR[5] |= PORT_PCR_MUX(5);
#endif
} /*** end of Init ***/
/************************************************************************************//**
** \brief System Clock Configuration. This code was derived from a S32 Design Studio
** example program. It uses the 8 MHz external crystal as a source for the
** PLL and configures the normal RUN mode for the following clock settings:
** - SPLL_CLK = 160 MHz
** - CORE_CLK = 80 MHz
** - SYS_CLK = 80 MHz
** - BUS_CLK = 40 MHz
** - FLASH_CLK = 26.67 MHz
** - SIRCDIV1_CLK = 8 MHz
** - SIRCDIV2_CLK = 8 MHz
** \return none.
**
****************************************************************************************/
static void SystemClockConfig(void)
{
/* --------- SOSC Initialization (8 MHz) ------------------------------------------- */
/* SOSCDIV1 & SOSCDIV2 =1: divide by 1. */
SCG->SOSCDIV = SCG_SOSCDIV_SOSCDIV1(1) | SCG_SOSCDIV_SOSCDIV2(1);
/* Range=2: Medium freq (SOSC betw 1MHz-8MHz).
* HGO=0: Config xtal osc for low power.
* EREFS=1: Input is external XTAL.
*/
SCG->SOSCCFG = SCG_SOSCCFG_RANGE(2) | SCG_SOSCCFG_EREFS_MASK;
/* Ensure SOSCCSR unlocked. */
while (SCG->SOSCCSR & SCG_SOSCCSR_LK_MASK)
{
;
}
/* LK=0: SOSCCSR can be written.
* SOSCCMRE=0: OSC CLK monitor IRQ if enabled.
* SOSCCM=0: OSC CLK monitor disabled.
* SOSCERCLKEN=0: Sys OSC 3V ERCLK output clk disabled.
* SOSCLPEN=0: Sys OSC disabled in VLP modes.
* SOSCSTEN=0: Sys OSC disabled in Stop modes.
* SOSCEN=1: Enable oscillator.
*/
SCG->SOSCCSR = SCG_SOSCCSR_SOSCEN_MASK;
/* Wait for system OSC clock to become valid. */
while (!(SCG->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK))
{
;
}
/* --------- SPLL Initialization (160 MHz) ----------------------------------------- */
/* Ensure SPLLCSR is unlocked. */
while (SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK)
{
;
}
/* SPLLEN=0: SPLL is disabled (default). */
SCG->SPLLCSR &= ~SCG_SPLLCSR_SPLLEN_MASK;
/* SPLLDIV1 divide by 2 and SPLLDIV2 divide by 4. */
SCG->SPLLDIV |= SCG_SPLLDIV_SPLLDIV1(2) | SCG_SPLLDIV_SPLLDIV2(3);
/* PREDIV=0: Divide SOSC_CLK by 0+1=1.
* MULT=24: Multiply sys pll by 4+24=40.
* SPLL_CLK = 8MHz / 1 * 40 / 2 = 160 MHz.
*/
SCG->SPLLCFG = SCG_SPLLCFG_MULT(24);
/* Ensure SPLLCSR is unlocked. */
while (SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK)
{
;
}
/* LK=0: SPLLCSR can be written.
* SPLLCMRE=0: SPLL CLK monitor IRQ if enabled.
* SPLLCM=0: SPLL CLK monitor disabled.
* SPLLSTEN=0: SPLL disabled in Stop modes.
* SPLLEN=1: Enable SPLL.
*/
SCG->SPLLCSR |= SCG_SPLLCSR_SPLLEN_MASK;
/* Wait for SPLL to become valid. */
while (!(SCG->SPLLCSR & SCG_SPLLCSR_SPLLVLD_MASK))
{
;
}
/* --------- SIRC Initialization --------------------------------------------------- */
/* Slow IRC is enabled with high range (8 MHz) in reset. Enable SIRCDIV2_CLK and
* SIRCDIV1_CLK, divide by 1 = 8MHz asynchronous clock source.
*/
SCG->SIRCDIV = SCG_SIRCDIV_SIRCDIV1(1) | SCG_SIRCDIV_SIRCDIV2(1);
/* --------- Change to normal RUN mode with 8MHz SOSC, 80 MHz PLL ------------------ */
/* Note that flash memory should not be programmed or erased when the microcontroller
* is operating in VLPr or HSRUN mode. Therefore normal RUN mode is configured.
*/
/* Select PLL as clock source.
* DIVCORE=1, div. by 2: Core clock = 160/2 MHz = 80 MHz.
* DIVBUS=1, div. by 2: bus clock = 40 MHz.
* DIVSLOW=2, div. by 2: SCG slow, flash clock= 26 2/3 MHz.
*/
SCG->RCCR= SCG_RCCR_SCS(6) | SCG_RCCR_DIVCORE(1) | SCG_RCCR_DIVBUS(1) |
SCG_RCCR_DIVSLOW(2);
/* Wait until system clock source is SPLL. */
while (((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT ) != 6U)
{
;
}
/* Evaluate the clock register settings and calculates the current core clock. This
* function must be called when the clock manager component is not used.
*/
SystemCoreClockUpdate();
} /*** end of SystemClockConfig ***/
/*********************************** end of main.c *************************************/

View File

@ -0,0 +1,693 @@
; ---------------------------------------------------------------------------------------
; @file: startup_S32K144.s
; @purpose: IAR Startup File
; S32K144
; @version: 2.0
; @date: 2017-1-10
; @build: b170107
; ---------------------------------------------------------------------------------------
;
; Copyright (c) 1997 - 2016 , Freescale Semiconductor, Inc.
; Copyright 2016-2017 NXP
; All rights reserved.
;
; THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
; IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
; INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
; STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
; IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
; THE POSSIBILITY OF SUCH DAMAGE.
;
; The modules in this file are included in the libraries, and may be replaced
; by any user-defined modules that define the PUBLIC symbol _program_start or
; a user defined start symbol.
; To override the cstartup defined in the library, simply add your modified
; version to the workbench project.
;
; The vector table is normally located at address 0.
; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
; The name "__vector_table" has special meaning for C-SPY:
; it is where the SP start value is found, and the NVIC vector
; table register (VTOR) is initialized to this address if != 0.
;
; Cortex-M version
;
MODULE ?cstartup
;; Forward declaration of sections.
SECTION CSTACK:DATA:NOROOT(3)
SECTION .intvec:CODE:ROOT(2)
EXTERN main
EXTERN SystemInit
EXTERN init_data_bss
PUBLIC __vector_table
PUBLIC __vector_table_0x1c
PUBLIC __Vectors
PUBLIC __Vectors_End
PUBLIC __Vectors_Size
DATA
__vector_table
DCD sfe(CSTACK)
DCD Reset_Handler
DCD NMI_Handler ;NMI Handler
DCD HardFault_Handler ;Hard Fault Handler
DCD MemManage_Handler ;MPU Fault Handler
DCD BusFault_Handler ;Bus Fault Handler
DCD UsageFault_Handler ;Usage Fault Handler
__vector_table_0x1c
DCD 0 ;Reserved
DCD 0 ;Reserved
DCD 0 ;Reserved
DCD 0 ;Reserved
DCD SVC_Handler ;SVCall Handler
DCD DebugMon_Handler ;Debug Monitor Handler
DCD 0 ;Reserved
DCD PendSV_Handler ;PendSV Handler
DCD SysTick_Handler ;SysTick Handler
;External Interrupts
DCD DMA0_IRQHandler ;DMA channel 0 transfer complete
DCD DMA1_IRQHandler ;DMA channel 1 transfer complete
DCD DMA2_IRQHandler ;DMA channel 2 transfer complete
DCD DMA3_IRQHandler ;DMA channel 3 transfer complete
DCD DMA4_IRQHandler ;DMA channel 4 transfer complete
DCD DMA5_IRQHandler ;DMA channel 5 transfer complete
DCD DMA6_IRQHandler ;DMA channel 6 transfer complete
DCD DMA7_IRQHandler ;DMA channel 7 transfer complete
DCD DMA8_IRQHandler ;DMA channel 8 transfer complete
DCD DMA9_IRQHandler ;DMA channel 9 transfer complete
DCD DMA10_IRQHandler ;DMA channel 10 transfer complete
DCD DMA11_IRQHandler ;DMA channel 11 transfer complete
DCD DMA12_IRQHandler ;DMA channel 12 transfer complete
DCD DMA13_IRQHandler ;DMA channel 13 transfer complete
DCD DMA14_IRQHandler ;DMA channel 14 transfer complete
DCD DMA15_IRQHandler ;DMA channel 15 transfer complete
DCD DMA_Error_IRQHandler ;DMA error interrupt channels 0-15
DCD MCM_IRQHandler ;FPU sources
DCD FTFC_IRQHandler ;FTFC Command complete
DCD Read_Collision_IRQHandler ;FTFC Read collision
DCD LVD_LVW_IRQHandler ;PMC Low voltage detect interrupt
DCD FTFC_Fault_IRQHandler ;FTFC Double bit fault detect
DCD WDOG_EWM_IRQHandler ;Single interrupt vector for WDOG and EWM
DCD RCM_IRQHandler ;RCM Asynchronous Interrupt
DCD LPI2C0_Master_IRQHandler ;LPI2C0 Master Interrupt
DCD LPI2C0_Slave_IRQHandler ;LPI2C0 Slave Interrupt
DCD LPSPI0_IRQHandler ;LPSPI0 Interrupt
DCD LPSPI1_IRQHandler ;LPSPI1 Interrupt
DCD LPSPI2_IRQHandler ;LPSPI2 Interrupt
DCD Reserved45_IRQHandler ;Reserved Interrupt 45
DCD Reserved46_IRQHandler ;Reserved Interrupt 46
DCD LPUART0_RxTx_IRQHandler ;LPUART0 Transmit / Receive Interrupt
DCD Reserved48_IRQHandler ;Reserved Interrupt 48
DCD LPUART1_RxTx_IRQHandler ;LPUART1 Transmit / Receive Interrupt
DCD Reserved50_IRQHandler ;Reserved Interrupt 50
DCD LPUART2_RxTx_IRQHandler ;LPUART2 Transmit / Receive Interrupt
DCD Reserved52_IRQHandler ;Reserved Interrupt 52
DCD Reserved53_IRQHandler ;Reserved Interrupt 53
DCD Reserved54_IRQHandler ;Reserved Interrupt 54
DCD ADC0_IRQHandler ;ADC0 interrupt request.
DCD ADC1_IRQHandler ;ADC1 interrupt request.
DCD CMP0_IRQHandler ;CMP0 interrupt request
DCD Reserved58_IRQHandler ;Reserved Interrupt 58
DCD Reserved59_IRQHandler ;Reserved Interrupt 59
DCD ERM_single_fault_IRQHandler ;ERM single bit error correction
DCD ERM_double_fault_IRQHandler ;ERM double bit error non-correctable
DCD RTC_IRQHandler ;RTC alarm interrupt
DCD RTC_Seconds_IRQHandler ;RTC seconds interrupt
DCD LPIT0_Ch0_IRQHandler ;LPIT0 channel 0 overflow interrupt
DCD LPIT0_Ch1_IRQHandler ;LPIT0 channel 1 overflow interrupt
DCD LPIT0_Ch2_IRQHandler ;LPIT0 channel 2 overflow interrupt
DCD LPIT0_Ch3_IRQHandler ;LPIT0 channel 3 overflow interrupt
DCD PDB0_IRQHandler ;PDB0 interrupt
DCD Reserved69_IRQHandler ;Reserved Interrupt 69
DCD Reserved70_IRQHandler ;Reserved Interrupt 70
DCD Reserved71_IRQHandler ;Reserved Interrupt 71
DCD Reserved72_IRQHandler ;Reserved Interrupt 72
DCD SCG_IRQHandler ;SCG bus interrupt request
DCD LPTMR0_IRQHandler ;LPTIMER interrupt request
DCD PORTA_IRQHandler ;Port A pin detect interrupt
DCD PORTB_IRQHandler ;Port B pin detect interrupt
DCD PORTC_IRQHandler ;Port C pin detect interrupt
DCD PORTD_IRQHandler ;Port D pin detect interrupt
DCD PORTE_IRQHandler ;Port E pin detect interrupt
DCD SWI_IRQHandler ;Software interrupt
DCD Reserved81_IRQHandler ;Reserved Interrupt 81
DCD Reserved82_IRQHandler ;Reserved Interrupt 82
DCD Reserved83_IRQHandler ;Reserved Interrupt 83
DCD PDB1_IRQHandler ;PDB1 interrupt
DCD FLEXIO_IRQHandler ;FlexIO Interrupt
DCD Reserved86_IRQHandler ;Reserved Interrupt 86
DCD Reserved87_IRQHandler ;Reserved Interrupt 87
DCD Reserved88_IRQHandler ;Reserved Interrupt 88
DCD Reserved89_IRQHandler ;Reserved Interrupt 89
DCD Reserved90_IRQHandler ;Reserved Interrupt 90
DCD Reserved91_IRQHandler ;Reserved Interrupt 91
DCD Reserved92_IRQHandler ;Reserved Interrupt 92
DCD Reserved93_IRQHandler ;Reserved Interrupt 93
DCD CAN0_ORed_IRQHandler ;CAN0 OR'ed [Bus Off OR Transmit Warning OR Receive Warning]
DCD CAN0_Error_IRQHandler ;CAN0 Interrupt indicating that errors were detected on the CAN bus
DCD CAN0_Wake_Up_IRQHandler ;CAN0 Interrupt asserted when Pretended Networking operation is enabled, and a valid message matches the selected filter criteria during Low Power mode
DCD CAN0_ORed_0_15_MB_IRQHandler ;CAN0 OR'ed Message buffer (0-15)
DCD CAN0_ORed_16_31_MB_IRQHandler ;CAN0 OR'ed Message buffer (16-31)
DCD Reserved99_IRQHandler ;Reserved Interrupt 99
DCD Reserved100_IRQHandler ;Reserved Interrupt 100
DCD CAN1_ORed_IRQHandler ;CAN1 OR'ed [Bus Off OR Transmit Warning OR Receive Warning]
DCD CAN1_Error_IRQHandler ;CAN1 Interrupt indicating that errors were detected on the CAN bus
DCD Reserved103_IRQHandler ;Reserved Interrupt 103
DCD CAN1_ORed_0_15_MB_IRQHandler ;CAN1 OR'ed Interrupt for Message buffer (0-15)
DCD Reserved105_IRQHandler ;Reserved Interrupt 105
DCD Reserved106_IRQHandler ;Reserved Interrupt 106
DCD Reserved107_IRQHandler ;Reserved Interrupt 107
DCD CAN2_ORed_IRQHandler ;CAN2 OR'ed [Bus Off OR Transmit Warning OR Receive Warning]
DCD CAN2_Error_IRQHandler ;CAN2 Interrupt indicating that errors were detected on the CAN bus
DCD Reserved110_IRQHandler ;Reserved Interrupt 110
DCD CAN2_ORed_0_15_MB_IRQHandler ;CAN2 OR'ed Message buffer (0-15)
DCD Reserved112_IRQHandler ;Reserved Interrupt 112
DCD Reserved113_IRQHandler ;Reserved Interrupt 113
DCD Reserved114_IRQHandler ;Reserved Interrupt 114
DCD FTM0_Ch0_Ch1_IRQHandler ;FTM0 Channel 0 and 1 interrupt
DCD FTM0_Ch2_Ch3_IRQHandler ;FTM0 Channel 2 and 3 interrupt
DCD FTM0_Ch4_Ch5_IRQHandler ;FTM0 Channel 4 and 5 interrupt
DCD FTM0_Ch6_Ch7_IRQHandler ;FTM0 Channel 6 and 7 interrupt
DCD FTM0_Fault_IRQHandler ;FTM0 Fault interrupt
DCD FTM0_Ovf_Reload_IRQHandler ;FTM0 Counter overflow and Reload interrupt
DCD FTM1_Ch0_Ch1_IRQHandler ;FTM1 Channel 0 and 1 interrupt
DCD FTM1_Ch2_Ch3_IRQHandler ;FTM1 Channel 2 and 3 interrupt
DCD FTM1_Ch4_Ch5_IRQHandler ;FTM1 Channel 4 and 5 interrupt
DCD FTM1_Ch6_Ch7_IRQHandler ;FTM1 Channel 6 and 7 interrupt
DCD FTM1_Fault_IRQHandler ;FTM1 Fault interrupt
DCD FTM1_Ovf_Reload_IRQHandler ;FTM1 Counter overflow and Reload interrupt
DCD FTM2_Ch0_Ch1_IRQHandler ;FTM2 Channel 0 and 1 interrupt
DCD FTM2_Ch2_Ch3_IRQHandler ;FTM2 Channel 2 and 3 interrupt
DCD FTM2_Ch4_Ch5_IRQHandler ;FTM2 Channel 4 and 5 interrupt
DCD FTM2_Ch6_Ch7_IRQHandler ;FTM2 Channel 6 and 7 interrupt
DCD FTM2_Fault_IRQHandler ;FTM2 Fault interrupt
DCD FTM2_Ovf_Reload_IRQHandler ;FTM2 Counter overflow and Reload interrupt
DCD FTM3_Ch0_Ch1_IRQHandler ;FTM3 Channel 0 and 1 interrupt
DCD FTM3_Ch2_Ch3_IRQHandler ;FTM3 Channel 2 and 3 interrupt
DCD FTM3_Ch4_Ch5_IRQHandler ;FTM3 Channel 4 and 5 interrupt
DCD FTM3_Ch6_Ch7_IRQHandler ;FTM3 Channel 6 and 7 interrupt
DCD FTM3_Fault_IRQHandler ;FTM3 Fault interrupt
DCD FTM3_Ovf_Reload_IRQHandler ;FTM3 Counter overflow and Reload interrupt
DCD DefaultISR ;139
DCD DefaultISR ;140
DCD DefaultISR ;141
DCD DefaultISR ;142
DCD DefaultISR ;143
DCD DefaultISR ;144
DCD DefaultISR ;145
DCD DefaultISR ;146
DCD DefaultISR ;147
DCD DefaultISR ;148
DCD DefaultISR ;149
DCD DefaultISR ;150
DCD DefaultISR ;151
DCD DefaultISR ;152
DCD DefaultISR ;153
DCD DefaultISR ;154
DCD DefaultISR ;155
DCD DefaultISR ;156
DCD DefaultISR ;157
DCD DefaultISR ;158
DCD DefaultISR ;159
DCD DefaultISR ;160
DCD DefaultISR ;161
DCD DefaultISR ;162
DCD DefaultISR ;163
DCD DefaultISR ;164
DCD DefaultISR ;165
DCD DefaultISR ;166
DCD DefaultISR ;167
DCD DefaultISR ;168
DCD DefaultISR ;169
DCD DefaultISR ;170
DCD DefaultISR ;171
DCD DefaultISR ;172
DCD DefaultISR ;173
DCD DefaultISR ;174
DCD DefaultISR ;175
DCD DefaultISR ;176
DCD DefaultISR ;177
DCD DefaultISR ;178
DCD DefaultISR ;179
DCD DefaultISR ;180
DCD DefaultISR ;181
DCD DefaultISR ;182
DCD DefaultISR ;183
DCD DefaultISR ;184
DCD DefaultISR ;185
DCD DefaultISR ;186
DCD DefaultISR ;187
DCD DefaultISR ;188
DCD DefaultISR ;189
DCD DefaultISR ;190
DCD DefaultISR ;191
DCD DefaultISR ;192
DCD DefaultISR ;193
DCD DefaultISR ;194
DCD DefaultISR ;195
DCD DefaultISR ;196
DCD DefaultISR ;197
DCD DefaultISR ;198
DCD DefaultISR ;199
DCD DefaultISR ;200
DCD DefaultISR ;201
DCD DefaultISR ;202
DCD DefaultISR ;203
DCD DefaultISR ;204
DCD DefaultISR ;205
DCD DefaultISR ;206
DCD DefaultISR ;207
DCD DefaultISR ;208
DCD DefaultISR ;209
DCD DefaultISR ;210
DCD DefaultISR ;211
DCD DefaultISR ;212
DCD DefaultISR ;213
DCD DefaultISR ;214
DCD DefaultISR ;215
DCD DefaultISR ;216
DCD DefaultISR ;217
DCD DefaultISR ;218
DCD DefaultISR ;219
DCD DefaultISR ;220
DCD DefaultISR ;221
DCD DefaultISR ;222
DCD DefaultISR ;223
DCD DefaultISR ;224
DCD DefaultISR ;225
DCD DefaultISR ;226
DCD DefaultISR ;227
DCD DefaultISR ;228
DCD DefaultISR ;229
DCD DefaultISR ;230
DCD DefaultISR ;231
DCD DefaultISR ;232
DCD DefaultISR ;233
DCD DefaultISR ;234
DCD DefaultISR ;235
DCD DefaultISR ;236
DCD DefaultISR ;237
DCD DefaultISR ;238
DCD DefaultISR ;239
DCD DefaultISR ;240
DCD DefaultISR ;241
DCD DefaultISR ;242
DCD DefaultISR ;243
DCD DefaultISR ;244
DCD DefaultISR ;245
DCD DefaultISR ;246
DCD DefaultISR ;247
DCD DefaultISR ;248
DCD DefaultISR ;249
DCD DefaultISR ;250
DCD DefaultISR ;251
DCD DefaultISR ;252
DCD DefaultISR ;253
DCD DefaultISR ;254
DCD 0xFFFFFFFF ; Reserved for user TRIM value
__Vectors_End
SECTION FlashConfig:CODE
__FlashConfig
DCD 0xFFFFFFFF ; 8 bytes backdoor comparison key
DCD 0xFFFFFFFF ;
DCD 0xFFFFFFFF ; 4 bytes program flash protection bytes
DCD 0xFFFF7FFE ; FDPROT:FEPROT:FOPT:FSEC(0xFE = unsecured)
__FlashConfig_End
__Vectors EQU __vector_table
__Vectors_Size EQU __Vectors_End - __Vectors
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Default interrupt handlers.
;;
THUMB
PUBWEAK Reset_Handler
SECTION .text:CODE:REORDER:NOROOT(2)
Reset_Handler
CPSID I ; Mask interrupts
;; Init the rest of the registers
LDR R1,=0
LDR R2,=0
LDR R3,=0
LDR R4,=0
LDR R5,=0
LDR R6,=0
LDR R7,=0
MOV R8,R7
MOV R9,R7
MOV R10,R7
MOV R11,R7
MOV R12,R7
#ifdef START_FROM_FLASH
IMPORT __RAM_START, __RAM_END
;; INIT ECC RAM
LDR R1, =__RAM_START
LDR R2, =__RAM_END
SUBS R2, R2, R1
SUBS R2, #1
BLE .LC5
MOVS R0, #0
MOVS R3, #4
.LC4:
STR R0, [R1]
ADD R1, R1, R3
SUBS R2, #4
BGE .LC4
.LC5:
#endif
;; Initialize the stack pointer
LDR R0, =sfe(CSTACK)
MOV R13,R0
#ifndef __NO_SYSTEM_INIT
;; Call the CMSIS system init routine
LDR R0, =SystemInit
BLX R0
#endif
;; Init .data and .bss sections
LDR R0, =init_data_bss
BLX R0
CPSIE I ; Unmask interrupts
BL main
JumpToSelf
B JumpToSelf
PUBWEAK NMI_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
NMI_Handler
B .
PUBWEAK HardFault_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
HardFault_Handler
B .
PUBWEAK MemManage_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
MemManage_Handler
B .
PUBWEAK BusFault_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
BusFault_Handler
B .
PUBWEAK UsageFault_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
UsageFault_Handler
B .
PUBWEAK SVC_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
SVC_Handler
B .
PUBWEAK DebugMon_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
DebugMon_Handler
B .
PUBWEAK PendSV_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
PendSV_Handler
B .
PUBWEAK SysTick_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
SysTick_Handler
B .
PUBWEAK DMA0_IRQHandler
PUBWEAK DMA1_IRQHandler
PUBWEAK DMA2_IRQHandler
PUBWEAK DMA3_IRQHandler
PUBWEAK DMA4_IRQHandler
PUBWEAK DMA5_IRQHandler
PUBWEAK DMA6_IRQHandler
PUBWEAK DMA7_IRQHandler
PUBWEAK DMA8_IRQHandler
PUBWEAK DMA9_IRQHandler
PUBWEAK DMA10_IRQHandler
PUBWEAK DMA11_IRQHandler
PUBWEAK DMA12_IRQHandler
PUBWEAK DMA13_IRQHandler
PUBWEAK DMA14_IRQHandler
PUBWEAK DMA15_IRQHandler
PUBWEAK DMA_Error_IRQHandler
PUBWEAK MCM_IRQHandler
PUBWEAK FTFC_IRQHandler
PUBWEAK Read_Collision_IRQHandler
PUBWEAK LVD_LVW_IRQHandler
PUBWEAK FTFC_Fault_IRQHandler
PUBWEAK WDOG_EWM_IRQHandler
PUBWEAK RCM_IRQHandler
PUBWEAK LPI2C0_Master_IRQHandler
PUBWEAK LPI2C0_Slave_IRQHandler
PUBWEAK LPSPI0_IRQHandler
PUBWEAK LPSPI1_IRQHandler
PUBWEAK LPSPI2_IRQHandler
PUBWEAK Reserved45_IRQHandler
PUBWEAK Reserved46_IRQHandler
PUBWEAK LPUART0_RxTx_IRQHandler
PUBWEAK Reserved48_IRQHandler
PUBWEAK LPUART1_RxTx_IRQHandler
PUBWEAK Reserved50_IRQHandler
PUBWEAK LPUART2_RxTx_IRQHandler
PUBWEAK Reserved52_IRQHandler
PUBWEAK Reserved53_IRQHandler
PUBWEAK Reserved54_IRQHandler
PUBWEAK ADC0_IRQHandler
PUBWEAK ADC1_IRQHandler
PUBWEAK CMP0_IRQHandler
PUBWEAK Reserved58_IRQHandler
PUBWEAK Reserved59_IRQHandler
PUBWEAK ERM_single_fault_IRQHandler
PUBWEAK ERM_double_fault_IRQHandler
PUBWEAK RTC_IRQHandler
PUBWEAK RTC_Seconds_IRQHandler
PUBWEAK LPIT0_Ch0_IRQHandler
PUBWEAK LPIT0_Ch1_IRQHandler
PUBWEAK LPIT0_Ch2_IRQHandler
PUBWEAK LPIT0_Ch3_IRQHandler
PUBWEAK PDB0_IRQHandler
PUBWEAK Reserved69_IRQHandler
PUBWEAK Reserved70_IRQHandler
PUBWEAK Reserved71_IRQHandler
PUBWEAK Reserved72_IRQHandler
PUBWEAK SCG_IRQHandler
PUBWEAK LPTMR0_IRQHandler
PUBWEAK PORTA_IRQHandler
PUBWEAK PORTB_IRQHandler
PUBWEAK PORTC_IRQHandler
PUBWEAK PORTD_IRQHandler
PUBWEAK PORTE_IRQHandler
PUBWEAK SWI_IRQHandler
PUBWEAK Reserved81_IRQHandler
PUBWEAK Reserved82_IRQHandler
PUBWEAK Reserved83_IRQHandler
PUBWEAK PDB1_IRQHandler
PUBWEAK FLEXIO_IRQHandler
PUBWEAK Reserved86_IRQHandler
PUBWEAK Reserved87_IRQHandler
PUBWEAK Reserved88_IRQHandler
PUBWEAK Reserved89_IRQHandler
PUBWEAK Reserved90_IRQHandler
PUBWEAK Reserved91_IRQHandler
PUBWEAK Reserved92_IRQHandler
PUBWEAK Reserved93_IRQHandler
PUBWEAK CAN0_ORed_IRQHandler
PUBWEAK CAN0_Error_IRQHandler
PUBWEAK CAN0_Wake_Up_IRQHandler
PUBWEAK CAN0_ORed_0_15_MB_IRQHandler
PUBWEAK CAN0_ORed_16_31_MB_IRQHandler
PUBWEAK Reserved99_IRQHandler
PUBWEAK Reserved100_IRQHandler
PUBWEAK CAN1_ORed_IRQHandler
PUBWEAK CAN1_Error_IRQHandler
PUBWEAK Reserved103_IRQHandler
PUBWEAK CAN1_ORed_0_15_MB_IRQHandler
PUBWEAK Reserved105_IRQHandler
PUBWEAK Reserved106_IRQHandler
PUBWEAK Reserved107_IRQHandler
PUBWEAK CAN2_ORed_IRQHandler
PUBWEAK CAN2_Error_IRQHandler
PUBWEAK Reserved110_IRQHandler
PUBWEAK CAN2_ORed_0_15_MB_IRQHandler
PUBWEAK Reserved112_IRQHandler
PUBWEAK Reserved113_IRQHandler
PUBWEAK Reserved114_IRQHandler
PUBWEAK FTM0_Ch0_Ch1_IRQHandler
PUBWEAK FTM0_Ch2_Ch3_IRQHandler
PUBWEAK FTM0_Ch4_Ch5_IRQHandler
PUBWEAK FTM0_Ch6_Ch7_IRQHandler
PUBWEAK FTM0_Fault_IRQHandler
PUBWEAK FTM0_Ovf_Reload_IRQHandler
PUBWEAK FTM1_Ch0_Ch1_IRQHandler
PUBWEAK FTM1_Ch2_Ch3_IRQHandler
PUBWEAK FTM1_Ch4_Ch5_IRQHandler
PUBWEAK FTM1_Ch6_Ch7_IRQHandler
PUBWEAK FTM1_Fault_IRQHandler
PUBWEAK FTM1_Ovf_Reload_IRQHandler
PUBWEAK FTM2_Ch0_Ch1_IRQHandler
PUBWEAK FTM2_Ch2_Ch3_IRQHandler
PUBWEAK FTM2_Ch4_Ch5_IRQHandler
PUBWEAK FTM2_Ch6_Ch7_IRQHandler
PUBWEAK FTM2_Fault_IRQHandler
PUBWEAK FTM2_Ovf_Reload_IRQHandler
PUBWEAK FTM3_Ch0_Ch1_IRQHandler
PUBWEAK FTM3_Ch2_Ch3_IRQHandler
PUBWEAK FTM3_Ch4_Ch5_IRQHandler
PUBWEAK FTM3_Ch6_Ch7_IRQHandler
PUBWEAK FTM3_Fault_IRQHandler
PUBWEAK FTM3_Ovf_Reload_IRQHandler
PUBWEAK DefaultISR
SECTION .text:CODE:REORDER:NOROOT(1)
DMA0_IRQHandler
DMA1_IRQHandler
DMA2_IRQHandler
DMA3_IRQHandler
DMA4_IRQHandler
DMA5_IRQHandler
DMA6_IRQHandler
DMA7_IRQHandler
DMA8_IRQHandler
DMA9_IRQHandler
DMA10_IRQHandler
DMA11_IRQHandler
DMA12_IRQHandler
DMA13_IRQHandler
DMA14_IRQHandler
DMA15_IRQHandler
DMA_Error_IRQHandler
MCM_IRQHandler
FTFC_IRQHandler
Read_Collision_IRQHandler
LVD_LVW_IRQHandler
FTFC_Fault_IRQHandler
WDOG_EWM_IRQHandler
RCM_IRQHandler
LPI2C0_Master_IRQHandler
LPI2C0_Slave_IRQHandler
LPSPI0_IRQHandler
LPSPI1_IRQHandler
LPSPI2_IRQHandler
Reserved45_IRQHandler
Reserved46_IRQHandler
LPUART0_RxTx_IRQHandler
Reserved48_IRQHandler
LPUART1_RxTx_IRQHandler
Reserved50_IRQHandler
LPUART2_RxTx_IRQHandler
Reserved52_IRQHandler
Reserved53_IRQHandler
Reserved54_IRQHandler
ADC0_IRQHandler
ADC1_IRQHandler
CMP0_IRQHandler
Reserved58_IRQHandler
Reserved59_IRQHandler
ERM_single_fault_IRQHandler
ERM_double_fault_IRQHandler
RTC_IRQHandler
RTC_Seconds_IRQHandler
LPIT0_Ch0_IRQHandler
LPIT0_Ch1_IRQHandler
LPIT0_Ch2_IRQHandler
LPIT0_Ch3_IRQHandler
PDB0_IRQHandler
Reserved69_IRQHandler
Reserved70_IRQHandler
Reserved71_IRQHandler
Reserved72_IRQHandler
SCG_IRQHandler
LPTMR0_IRQHandler
PORTA_IRQHandler
PORTB_IRQHandler
PORTC_IRQHandler
PORTD_IRQHandler
PORTE_IRQHandler
SWI_IRQHandler
Reserved81_IRQHandler
Reserved82_IRQHandler
Reserved83_IRQHandler
PDB1_IRQHandler
FLEXIO_IRQHandler
Reserved86_IRQHandler
Reserved87_IRQHandler
Reserved88_IRQHandler
Reserved89_IRQHandler
Reserved90_IRQHandler
Reserved91_IRQHandler
Reserved92_IRQHandler
Reserved93_IRQHandler
CAN0_ORed_IRQHandler
CAN0_Error_IRQHandler
CAN0_Wake_Up_IRQHandler
CAN0_ORed_0_15_MB_IRQHandler
CAN0_ORed_16_31_MB_IRQHandler
Reserved99_IRQHandler
Reserved100_IRQHandler
CAN1_ORed_IRQHandler
CAN1_Error_IRQHandler
Reserved103_IRQHandler
CAN1_ORed_0_15_MB_IRQHandler
Reserved105_IRQHandler
Reserved106_IRQHandler
Reserved107_IRQHandler
CAN2_ORed_IRQHandler
CAN2_Error_IRQHandler
Reserved110_IRQHandler
CAN2_ORed_0_15_MB_IRQHandler
Reserved112_IRQHandler
Reserved113_IRQHandler
Reserved114_IRQHandler
FTM0_Ch0_Ch1_IRQHandler
FTM0_Ch2_Ch3_IRQHandler
FTM0_Ch4_Ch5_IRQHandler
FTM0_Ch6_Ch7_IRQHandler
FTM0_Fault_IRQHandler
FTM0_Ovf_Reload_IRQHandler
FTM1_Ch0_Ch1_IRQHandler
FTM1_Ch2_Ch3_IRQHandler
FTM1_Ch4_Ch5_IRQHandler
FTM1_Ch6_Ch7_IRQHandler
FTM1_Fault_IRQHandler
FTM1_Ovf_Reload_IRQHandler
FTM2_Ch0_Ch1_IRQHandler
FTM2_Ch2_Ch3_IRQHandler
FTM2_Ch4_Ch5_IRQHandler
FTM2_Ch6_Ch7_IRQHandler
FTM2_Fault_IRQHandler
FTM2_Ovf_Reload_IRQHandler
FTM3_Ch0_Ch1_IRQHandler
FTM3_Ch2_Ch3_IRQHandler
FTM3_Ch4_Ch5_IRQHandler
FTM3_Ch6_Ch7_IRQHandler
FTM3_Fault_IRQHandler
FTM3_Ovf_Reload_IRQHandler
DefaultISR
B DefaultISR
END

View File

@ -0,0 +1,121 @@
/*
** ###################################################################
** Processor: S32K144 with 64 KB SRAM
** Compiler: IAR ANSI C/C++ Compiler for ARM
**
** Abstract:
** Linker file for the IAR ANSI C/C++ Compiler for ARM
**
** Copyright (c) 2015-2016 Freescale Semiconductor, Inc.
** Copyright 2017 NXP
** All rights reserved.
**
** THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
** IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
** INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
** STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
** IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
** THE POSSIBILITY OF SUCH DAMAGE.
**
** http: www.freescale.com
** mail: support@freescale.com
**
** ###################################################################
*/
/* If symbol __flash_vector_table__=1 is defined at link time
* the interrupt vector will not be copied to RAM.
* Warning: Using the interrupt vector from FLASH will not allow
* INT_SYS_InstallHandler because the section is Read Only.
*/
define symbol __ram_vector_table_size__ = isdefinedsymbol(__flash_vector_table__) ? 0 : 0x00000400;
define symbol __ram_vector_table_offset__ = isdefinedsymbol(__flash_vector_table__) ? 0 : 0x000003FF;
/* Flash */
define symbol m_interrupts_start = 0x00002000;
define symbol m_interrupts_end = 0x000023FF;
define symbol m_flash_config_start = 0x00002400;
define symbol m_flash_config_end = 0x0000240F;
define symbol m_text_start = 0x00002410;
define symbol m_text_end = 0x0007FFFF;
/* SRAM_L */
define symbol m_interrupts_ram_start = 0x1FFF8000;
define symbol m_interrupts_ram_end = 0x1FFF8000 + __ram_vector_table_offset__;
define symbol m_data_start = m_interrupts_ram_start + __ram_vector_table_size__;
define symbol m_data_end = 0x1FFFFFFF;
/* SRAM_U */
define symbol m_data_2_start = 0x20000000;
define symbol m_data_2_end = 0x20006FFF;
/* Sizes */
if (isdefinedsymbol(__stack_size__)) {
define symbol __size_cstack__ = __stack_size__;
} else {
define symbol __size_cstack__ = 0x00000400;
}
if (isdefinedsymbol(__heap_size__)) {
define symbol __size_heap__ = __heap_size__;
} else {
define symbol __size_heap__ = 0x00000400;
}
define exported symbol __VECTOR_TABLE = m_interrupts_start;
define exported symbol __VECTOR_RAM = isdefinedsymbol(__flash_vector_table__) ? m_interrupts_start : m_interrupts_ram_start;
define exported symbol __RAM_VECTOR_TABLE_SIZE = __ram_vector_table_size__;
define exported symbol __RAM_START = m_interrupts_ram_start;
define exported symbol __RAM_END = m_data_2_end;
define memory mem with size = 4G;
define region m_flash_config_region = mem:[from m_flash_config_start to m_flash_config_end];
define region TEXT_region = mem:[from m_interrupts_start to m_interrupts_end]
| mem:[from m_text_start to m_text_end];
define region DATA_region = mem:[from m_data_start to m_data_end];
define region DATA_region_2 = mem:[from m_data_2_start to m_data_2_end-__size_cstack__];
define region CSTACK_region = mem:[from m_data_2_end-__size_cstack__+1 to m_data_2_end];
define region m_interrupts_ram_region = mem:[from m_interrupts_ram_start to m_interrupts_ram_end];
define block CSTACK with alignment = 8, size = __size_cstack__ { };
define block HEAP with alignment = 8, size = __size_heap__ { };
define block RW { readwrite };
define block ZI { zi };
/* Custom Section Block that can be used to place data at absolute address. */
/* Use __attribute__((section (".customSection"))) to place data here. */
define block customSectionBlock { section .customSection };
define block __CODE_ROM { section .textrw_init };
define block __CODE_RAM { section .textrw };
initialize manually { section .textrw };
initialize manually { section .bss };
initialize manually { section .customSection };
initialize manually { section .data };
initialize manually { section __DLIB_PERTHREAD };
do not initialize { section .noinit, section .bss, section .data, section __DLIB_PERTHREAD, section .customSection };
place at address mem: m_interrupts_start { readonly section .intvec };
place in m_flash_config_region { section FlashConfig };
place in TEXT_region { readonly };
place in TEXT_region { block __CODE_ROM };
place in DATA_region { block RW };
place in DATA_region { block __CODE_RAM };
place in DATA_region_2 { first block customSectionBlock };
place in DATA_region_2 { block ZI };
place in DATA_region_2 { last block HEAP };
place in CSTACK_region { block CSTACK };
place in m_interrupts_ram_region { section m_interrupts_ram };

View File

@ -0,0 +1,240 @@
S018000064656D6F70726F675F7333326B3134342E7372656374
S1132000007000209D2D00002B2B00005F2E00008F
S1132010872E0000932E0000D52E00000000000043
S1132020000000000000000000000000D72E0000A7
S1132030D92E000000000000DB2E0000912A0000D1
S1132040CD2E0000CD2E0000CD2E0000CD2E0000A0
S1132050CD2E0000CD2E0000CD2E0000CD2E000090
S1132060CD2E0000CD2E0000CD2E0000CD2E000080
S1132070CD2E0000CD2E0000CD2E0000CD2E000070
S1132080CD2E0000CD2E0000CD2E0000CD2E000060
S1132090CD2E0000CD2E0000CD2E0000CD2E000050
S11320A0CD2E0000CD2E0000CD2E0000CD2E000040
S11320B0CD2E0000CD2E0000CD2E0000CD2E000030
S11320C0CD2E0000CD2E0000CD2E0000CD2E000020
S11320D0CD2E0000CD2E0000CD2E0000CD2E000010
S11320E0CD2E0000CD2E0000CD2E0000CD2E000000
S11320F0CD2E0000CD2E0000CD2E0000CD2E0000F0
S1132100CD2E0000CD2E0000CD2E0000CD2E0000DF
S1132110CD2E0000CD2E0000CD2E0000CD2E0000CF
S1132120CD2E0000CD2E0000CD2E0000CD2E0000BF
S1132130CD2E0000CD2E0000CD2E0000CD2E0000AF
S1132140CD2E0000CD2E0000CD2E0000CD2E00009F
S1132150CD2E0000CD2E0000CD2E0000CD2E00008F
S1132160CD2E0000CD2E0000CD2E0000CD2E00007F
S1132170CD2E0000CD2E0000CD2E0000CD2E00006F
S1132180CD2E0000CD2E0000CD2E0000CD2E00005F
S1132190CD2E0000CD2E0000CD2E0000CD2E00004F
S11321A0CD2E0000CD2E0000CD2E0000CD2E00003F
S11321B0CD2E0000CD2E0000CD2E0000CD2E00002F
S11321C0CD2E0000CD2E0000CD2E0000CD2E00001F
S11321D0CD2E0000CD2E0000CD2E0000CD2E00000F
S11321E0CD2E0000CD2E0000CD2E0000CD2E0000FF
S11321F0CD2E0000CD2E0000CD2E0000CD2E0000EF
S1132200CD2E0000CD2E0000CD2E0000CD2E0000DE
S1132210CD2E0000CD2E0000CD2E0000CD2E0000CE
S1132220CD2E0000CD2E0000CD2E0000CD2E0000BE
S1132230CD2E0000CD2E0000CD2E0000CD2E0000AE
S1132240CD2E0000CD2E0000CD2E0000CD2E00009E
S1132250CD2E0000CD2E0000CD2E0000CD2E00008E
S1132260CD2E0000CD2E0000CD2E0000CD2E00007E
S1132270CD2E0000CD2E0000CD2E0000CD2E00006E
S1132280CD2E0000CD2E0000CD2E0000CD2E00005E
S1132290CD2E0000CD2E0000CD2E0000CD2E00004E
S11322A0CD2E0000CD2E0000CD2E0000CD2E00003E
S11322B0CD2E0000CD2E0000CD2E0000CD2E00002E
S11322C0CD2E0000CD2E0000CD2E0000CD2E00001E
S11322D0CD2E0000CD2E0000CD2E0000CD2E00000E
S11322E0CD2E0000CD2E0000CD2E0000CD2E0000FE
S11322F0CD2E0000CD2E0000CD2E0000CD2E0000EE
S1132300CD2E0000CD2E0000CD2E0000CD2E0000DD
S1132310CD2E0000CD2E0000CD2E0000CD2E0000CD
S1132320CD2E0000CD2E0000CD2E0000CD2E0000BD
S1132330CD2E0000CD2E0000CD2E0000CD2E0000AD
S1132340CD2E0000CD2E0000CD2E0000CD2E00009D
S1132350CD2E0000CD2E0000CD2E0000CD2E00008D
S1132360CD2E0000CD2E0000CD2E0000CD2E00007D
S1132370CD2E0000CD2E0000CD2E0000CD2E00006D
S1132380CD2E0000CD2E0000CD2E0000CD2E00005D
S1132390CD2E0000CD2E0000CD2E0000CD2E00004D
S11323A0CD2E0000CD2E0000CD2E0000CD2E00003D
S11323B0CD2E0000CD2E0000CD2E0000CD2E00002D
S11323C0CD2E0000CD2E0000CD2E0000CD2E00001D
S11323D0CD2E0000CD2E0000CD2E0000CD2E00000D
S11323E0CD2E0000CD2E0000CD2E0000CD2E0000FD
S11323F0CD2E0000CD2E0000EE11AA55FFFFFFFFE9
S1132400FFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFF59
S113241080B500F00DF800F061F901BD80B500F061
S113242065F800F021FA01BD80B500F0F4FA01BDB1
S113243082B06846DFF89814D1E90023C0E900238C
S1132440DFF89004016831F080410160016851F0C7
S113245084410160DFF880140868C0F3022000287A
S113246004D10120020212F4E0620A60DFF86C1465
S1132470DFF86C241268D20701D4DFF868146A46C6
S1132480105CB1FBF0F04FF46141B0FBF1F0C01D02
S1132490C008C004C00C80B2C004C00C50F0E0609E
S11324A0DFF844140860DFF84404DFF844140860DB
S11324B0DFF84004002101600021DFF83C241160B2
S11324C00021DFF838241160DFF834145FF470322F
S11324D00A600A6852F088020A600121DFF82424A5
S11324E011605FF44021016002B0704770B5DFF8FD
S11324F018442078002818D1DFF81054280000F080
S11325003CF8012838D12878002835D0287841288B
S113251032DA00F0BAFADFF8F8130860012020700C
S11325200020DFF8F013087026E0DFF8E863DFF836
S1132530DC5330782844401C00F01FF8012811D1E6
S11325403078401C307030782978884214D10020CB
S113255020706878FF280FD1A87800280CD1FFF7E5
S113256063FF09E000F091FADFF8A413096864310D
S1132570814201D20020207070BD02000020DFF8EB
S113258070130968C1F34051002904D0DFF88803AF
S1132590006810700120C0B27047FCB403006846A4
S11325A0DFF87843D4E90056C0E90056DFF87043F9
S11325B02068C0F30220002804D10120050215F48C
S11325C0E06525604FF4FA546D46285CB4FBF0F5E1
S11325D0002600E0761C3000C0B2122825D2D14F6C
S11325E0180080B23400E4B217F824406043B5FB0D
S11325F0F0F400FB14500028ECD11C00A4B230000D
S1132600C0B217F820004443B5FBF4F008800888F2
S11326100028DFD0088840F20114A042DAD2F6B2D2
S113262057F826001060012000E00020F6BC704737
S113263038B5BD4D286850F080402860286850F0B7
S11326408050286000F021FA0400FA342868C001A0
S113265003D400F01AFA8442F8D231BD38B5B24D31
S1132660286830F080402860286830F08050286066
S113267000F00BFA0400FA342868C00103D500F016
S113268004FA8442F8D231BD38B5A74D2868002831
S11326900ED4286850F00040286000F0F6F90400D9
S11326A0FA342868C00203D400F0EFF98442F8D267
S11326B031BD38B59C4D286800280ED5286820F017
S11326C00040286000F0E1F90400FA342868C002F0
S11326D003D500F0DAF98442F8D231BD7CB500208C
S11326E0ADF8040004220021684600F0E1F940F24C
S11326F067658E48016851F080410160FFF7D9FF9A
S1132700FFF796FFFFF7C0FF894C206830F40050B4
S11327102060FFF7CEFFFFF78BFF6A4601A94FF455
S1132720FA70FFF73AFF21684FF678700140216094
S11327302068BDF80410491E50EA0160206020683A
S11327409DF80110491E11F007010843206020681C
S11327509DF80210491EC90411F460110843206059
S113276020689DF80310491E090411F4E021084370
S113277020609DF80200042802DA9DF8020000E0BF
S113278004202168C0B2401E800510F440000843B4
S11327902060206850F080002060002006E00021C6
S11327A0644A03009BB242F82310401C010089B222
S11327B08029F4D3002006E000215F4A03009BB285
S11327C042F82310401C010089B22029F4D3564E4C
S11327D03068C009C00150F01F003060306850F408
S11327E000303060306850F480303060306830F051
S11327F0005030607FF020405049086050485FF03E
S113280080610160002D0AD525F00045016851F46E
S11328100011016025F060454A48056004E0AD04FC
S113282025F06045474805600020474908605FF08F
S1132830FF3046490860464846490860306830F42D
S1132840000030602168444801402160FFF706FF22
S113285000F01BF90400FA343068000103D500F0DD
S113286014F98442F8D273BD7CB5384801688905EF
S11328702DD533490968090C11F00F01374A00239B
S11328800FE01C00E4B2A408A400E41C1D00EDB297
S113289015F00305641B145D6D461E00F6B2AC55BD
S11328A05B1C1C000D00E4B2EDB2AC42E9D34FF462
S11328B0007202602A4800682A4A10609DF80000ED
S11328C0FF2804D1C9B2022901D1FFF7ADFD73BDC0
S11328D0B42E0000AC5106400442064000127A00B7
S11328E00842064080841E0010B0064000C01FC08D
S11328F014B0064018B0064020B0064024B006408C
S113290028B006402CB006405500002000000020EE
S113291044000020540000201CB00640BC2E0000DF
S113292004410640F42D000000400240905006404F
S1132930044002408040024080480240A4480240D3
S113294010410240144102402840024030400240FD
S113295006003B0020400240F7EFFFFF1841024011
S113296008400240480000202F48016851F47001DB
S113297001602E48016831F0804101602C482D49E6
S11329800160006842F220102B4908604FF6FF7086
S11329902A490860704710B40023012028490A68B6
S11329A0C2F30342521C0968090E11F00F010129F8
S11329B006D0022906D003290CD0062912D020E023
S11329C0204B1FE02049096811F00101002900D0C3
S11329D01C4B17E01D49096811F003011C4B53F807
S11329E021300FE017491B4C2368C3F302235B1CFF
S11329F02468C4F30444103461435B00B1FBF3F373
S1132A0000E00020C0B2002803D0B3FBF2F012496A
S1132A10086010BC7047114A116889B2104801431C
S1132A2051F004011160704788ED00E034EF00E0DC
S1132A300420054020C528D9002005400820054071
S1132A401040064000127A0008420640084306403F
S1132A50C82E0000084606400084FF1F0CED00E06D
S1132A600000FA050D4800684FF47A71B0FBF1F0EC
S1132A70401E0B49086000200A49086007200A49E3
S1132A8008600020094908607047084800687047DA
S1132A9006480168491C0160704700000084FF1F5C
S1132AA014E000E018E000E010E000E05000002036
S1132AB010B5044610460A460146204600F002F8C6
S1132AC0204610BD62F30F2262F31F42401810F03B
S1132AD0030308D0C91A1FD3DB0748BF00F8012D30
S1132AE028BF20F8022D130030B4144615461039BF
S1132AF028BF20E93C00FAD8490728BF20E90C0088
S1132B0048BF40F8042D890028BF20F8022D48BF93
S1132B1000F8012D30BC7047C91818BF00F8012D0A
S1132B20CB0728BF00F8012D7047FEE780B500F001
S1132B3007F8FFF76DFC00F09DF8FFF76FFCFAE76C
S1132B4080B500F029F83248016851F080410160F5
S1132B503048016851F0804101602F48016851F00C
S1132B60804101602D48016851F4007101602C48D6
S1132B70016851F4007101602A48016851F4A061B0
S1132B8001602948016851F4A0610160FFF76AFF00
S1132B9000F060F862B601BD10B540F2011123489F
S1132BA001602420224A1060224802681202FBD4E9
S1132BB0012202600268D201FCD51F4A106800029B
S1132BC0FBD410684008400010601C4B1C6840F2A5
S1132BD0023004431C605FF4C010194B1860106885
S1132BE00002FCD4106850F0010010601068C001AD
S1132BF0FCD514480160144814490860144800685E
S1132C00C0F303600628F9D1FFF7C5FE10BD00002C
S1132C102C510640305106403451064018B004404F
S1132C201CB0044010D0044014D0044004410640B9
S1132C30084106400041064000460640044606405E
S1132C4008460640044206401200010614400640AD
S1132C50104006401648016851F48071016015481F
S1132C60016851F0010101601348016851F001014C
S1132C700160704780B5FFF708FF104A1168411AD8
S1132C80B1F5FA7F13D30E4B1978002907D101212E
S1132C9019700C490B6853F001030B6006E0002126
S1132CA0197005490B6853F001030B60106001BDF6
S1132CB000C00440D4F00F40C4F00F404C0000208A
S1132CC056000020C8F00F402DE9F043244B254E58
S1132CD0254F264CDFF898C0DFF898E0264DDFF842
S1132CE09C8027482749284A05E096F8009083F8F5
S1132CF000905B1C761CB742F7D1E64509D09CF8DE
S1132D0000302370641C1CF1010CF6E700232B70C7
S1132D106D1CA845FAD18A4204D00B780370491C73
S1132D20401CF8E70021194A194B934210D00020A7
S1132D3004E052F8204043F82040401C154CB0EB0E
S1132D40940FF6D31448C9B250F82100036004E08C
S1132D501148C9B250F821000260BDE8F08300BFF9
S1132D600084FF1FD02E0000D42E00000484FF1F17
S1132D70DC2E0000DC2E00000000002057000020A4
S1132D80000000000000000000000000002000001F
S1132D900080FF1F00040000C42E000072B6002152
S1132DA0002200230024002500260027B846B94647
S1132DB0BA46BB46BC460A490A4A521A013A05DDDC
S1132DC00020042308601944043AFBDA06488546C7
S1132DD0064880470648804762B6FFF7A7FEFEE72D
S1132DE00080FF1FFF6F0020007000206929000091
S1132DF0C92C000008030202090303020A030303A7
S1132E000B0403030C0404030D0504030E0504045E
S1132E100F0604041006050411070504120705052E
S1132E2013080505140806051508070516080706FE
S1132E301708080618080807190808084EF68851E4
S1132E40CEF20001086840F470000860BFF34F8FB1
S1132E50BFF36F8F4FF00070E1EE100A7047FEE78A
S1132E6000F00DF8002801D0AFF30080AFF300802C
S1132E700020AFF30080FFF759FE00F002F80120B4
S1132E80704700F001B8FEE70746384600F002F844
S1132E90FBE7FEE780B5AFF30080024A110018207B
S1132EA0ABBEFBE726000200AFF30080FFF7C6FFCE
S1132EB0FFF7D6FF000102040810204000010204BD
S1132EC00810204008ED00E0006CDC02FFF7FEBFB4
S10F2ED0006CDC02FEE7FEE7FEE7FEE714
S9032EA925

View File

@ -0,0 +1,772 @@
/************************************************************************************//**
* \file Demo/ARMCM4_S32K14_S32K144EVB_IAR/Prog/boot.c
* \brief Demo program bootloader interface source file.
* \ingroup Prog_ARMCM4_S32K14_S32K144EVB_IAR
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
/****************************************************************************************
* Include files
****************************************************************************************/
#include "header.h" /* generic header */
/****************************************************************************************
* Function prototypes
****************************************************************************************/
#if (BOOT_COM_RS232_ENABLE > 0)
static void BootComRs232Init(void);
static void BootComRs232CheckActivationRequest(void);
#endif
#if (BOOT_COM_CAN_ENABLE > 0)
static void BootComCanInit(void);
static void BootComCanCheckActivationRequest(void);
#endif
/************************************************************************************//**
** \brief Initializes the communication interface.
** \return none.
**
****************************************************************************************/
void BootComInit(void)
{
#if (BOOT_COM_RS232_ENABLE > 0)
BootComRs232Init();
#endif
#if (BOOT_COM_CAN_ENABLE > 0)
BootComCanInit();
#endif
} /*** end of BootComInit ***/
/************************************************************************************//**
** \brief Receives the CONNECT request from the host, which indicates that the
** bootloader should be activated and, if so, activates it.
** \return none.
**
****************************************************************************************/
void BootComCheckActivationRequest(void)
{
#if (BOOT_COM_RS232_ENABLE > 0)
BootComRs232CheckActivationRequest();
#endif
#if (BOOT_COM_CAN_ENABLE > 0)
BootComCanCheckActivationRequest();
#endif
} /*** end of BootComCheckActivationRequest ***/
/************************************************************************************//**
** \brief Bootloader activation function.
** \return none.
**
****************************************************************************************/
void BootActivate(void)
{
/* Activate the bootloader by performing a software reset. */
SystemSoftwareReset();
} /*** end of BootActivate ***/
#if (BOOT_COM_RS232_ENABLE > 0)
/****************************************************************************************
* U N I V E R S A L A S Y N C H R O N O U S R X T X I N T E R F A C E
****************************************************************************************/
/****************************************************************************************
* Macro definitions
****************************************************************************************/
/** \brief Timeout time for the reception of a CTO packet. The timer is started upon
* reception of the first packet byte.
*/
#define RS232_CTO_RX_PACKET_TIMEOUT_MS (100u)
/** \brief Set the peripheral LPUART base pointer. */
#define LPUARTx (LPUART1)
/** \brief Set the PCC index offset for LPUART. */
#define PCC_LPUARTx_INDEX (PCC_LPUART1_INDEX)
/****************************************************************************************
* Function prototypes
****************************************************************************************/
static unsigned char Rs232ReceiveByte(unsigned char *data);
/************************************************************************************//**
** \brief Initializes the UART communication interface.
** \return none.
**
****************************************************************************************/
static void BootComRs232Init(void)
{
unsigned long sourceClockFreqHz;
unsigned long div2RegValue;
unsigned short baudrateSbr0_12;
unsigned char const div2DividerLookup[] =
{
0U, /* 0b000. Output disabled. */
1U, /* 0b001. Divide by 1. */
2U, /* 0b010. Divide by 2. */
4U, /* 0b011. Divide by 4. */
8U, /* 0b100. Divide by 8. */
16U, /* 0b101. Divide by 16. */
32U, /* 0b110. Divide by 32. */
64U, /* 0b111. Divide by 64. */
};
/* Make sure the UART peripheral clock is disabled before configuring its source
* clock.
*/
PCC->PCCn[PCC_LPUARTx_INDEX] &= ~PCC_PCCn_CGC_MASK;
/* Select option 2 as the UART peripheral source clock and enable the clock. Option 2
* is the SIRCDIV2_CLK, which is available on all peripherals and configurations.
*/
PCC->PCCn[PCC_LPUARTx_INDEX] |= PCC_PCCn_PCS(2) | PCC_PCCn_CGC_MASK;
/* Obtain the DIV2 divider value of the SIRC_CLK. */
div2RegValue = (SCG->SIRCDIV & SCG_SIRCDIV_SIRCDIV2_MASK) >> SCG_SIRCDIV_SIRCDIV2_SHIFT;
/* Check if the DIV2 register value for SIRC is 0. In this case SIRCDIV2_CLK is
* currently disabled.
*/
if (div2RegValue == 0U)
{
/* Configure the DIV2 for a default divide by 1 to make sure the SIRCDIV2_CLK is
* actually enabled.
*/
div2RegValue = 1U;
SCG->SIRCDIV = SCG_SIRCDIV_SIRCDIV2(div2RegValue);
}
/* Determine the SIRC clock frequency. If SIRC high range is enabled, it is 8 MHz. If
* SIRC low range is enabled, it is 2 MHz.
*/
sourceClockFreqHz = 8000000U;
if ((SCG->SIRCCFG & SCG_SIRCCFG_RANGE_MASK) == SCG_SIRCCFG_RANGE(0))
{
sourceClockFreqHz = 2000000U;
}
/* Now process the configured DIV2 divider factor to get the actual frequency of the
* UART peripheral source clock.
*/
sourceClockFreqHz /= div2DividerLookup[div2RegValue];
/* Configure the baudrate from BOOT_COM_RS232_BAUDRATE, taking into account that an
* oversampling of 8 will be configured. Default 8,n,1 format is used. Integer
* rounding is used to get the best value for baudrateSbr0_12. Actual baudrate equals
* sourceClockFreqHz / 8 / baudrateSbr0_12.
*/
baudrateSbr0_12 = (((sourceClockFreqHz / BOOT_COM_RS232_BAUDRATE) + (8U - 1U)) / 8U) &
LPUART_BAUD_SBR_MASK;
/* OSR=7: Over sampling ratio = 7+1=8.
* SBNS=0: One stop bit.
* BOTHEDGE=0: receiver samples only on rising edge.
* M10=0: Rx and Tx use 7 to 9 bit data characters.
* RESYNCDIS=0: Resync during rec'd data word supported.
* LBKDIE, RXEDGIE=0: interrupts disable.
* TDMAE, RDMAE, TDMAE=0: DMA requests disabled.
* MAEN1, MAEN2, MATCFG=0: Match disabled.
*/
LPUARTx->BAUD = LPUART_BAUD_SBR(baudrateSbr0_12) | LPUART_BAUD_OSR(7);
/* Clear the error/interrupt flags */
LPUARTx->STAT = FEATURE_LPUART_STAT_REG_FLAGS_MASK;
/* Reset all features/interrupts by default */
LPUARTx->CTRL = 0x00000000;
/* Reset match addresses */
LPUARTx->MATCH = 0x00000000;
#if FEATURE_LPUART_HAS_MODEM_SUPPORT
/* Reset IrDA modem features */
LPUARTx->MODIR = 0x00000000;
#endif
#if FEATURE_LPUART_FIFO_SIZE > 0U
/* Reset FIFO feature */
LPUARTx->FIFO = FEATURE_LPUART_FIFO_RESET_MASK;
/* Enable the transmit and receive FIFOs. */
LPUARTx->FIFO |= LPUART_FIFO_TXFE(1) | LPUART_FIFO_RXFE(1);
/* Set the reception water mark to 0 and the transmitter water mark to 1. */
LPUARTx->WATER = LPUART_WATER_TXWATER(1) | LPUART_WATER_RXWATER(0);
#endif
/* Enable transmitter and receiver, no parity, 8 bit char:
* RE=1: Receiver enabled.
* TE=1: Transmitter enabled.
* PE,PT=0: No hw parity generation or checking.
* M7,M,R8T9,R9T8=0: 8-bit data characters.
* DOZEEN=0: LPUART enabled in Doze mode.
* ORIE,NEIE,FEIE,PEIE,TIE,TCIE,RIE,ILIE,MA1IE,MA2IE=0: no IRQ.
* TxDIR=0: TxD pin is input if in single-wire mode.
* TXINV=0: Transmit data not inverted.
* RWU,WAKE=0: normal operation; rcvr not in standby.
* IDLCFG=0: one idle character.
* ILT=0: Idle char bit count starts after start bit.
* SBK=0: Normal transmitter operation - no break char.
* LOOPS,RSRC=0: no loop back.
*/
LPUARTx->CTRL = LPUART_CTRL_RE_MASK | LPUART_CTRL_TE_MASK;
} /*** end of BootComRs232Init ***/
/************************************************************************************//**
** \brief Receives the CONNECT request from the host, which indicates that the
** bootloader should be activated and, if so, activates it.
** \return none.
**
****************************************************************************************/
static void BootComRs232CheckActivationRequest(void)
{
static unsigned char xcpCtoReqPacket[BOOT_COM_RS232_RX_MAX_DATA+1];
static unsigned char xcpCtoRxLength;
static unsigned char xcpCtoRxInProgress = 0;
static unsigned long xcpCtoRxStartTime = 0;
/* start of cto packet received? */
if (xcpCtoRxInProgress == 0)
{
/* store the message length when received */
if (Rs232ReceiveByte(&xcpCtoReqPacket[0]) == 1)
{
/* check that the length has a valid value. it should not be 0 */
if ( (xcpCtoReqPacket[0] > 0) &&
(xcpCtoReqPacket[0] <= BOOT_COM_RS232_RX_MAX_DATA) )
{
/* store the start time */
xcpCtoRxStartTime = TimerGet();
/* indicate that a cto packet is being received */
xcpCtoRxInProgress = 1;
/* reset packet data count */
xcpCtoRxLength = 0;
}
}
}
else
{
/* store the next packet byte */
if (Rs232ReceiveByte(&xcpCtoReqPacket[xcpCtoRxLength+1]) == 1)
{
/* increment the packet data count */
xcpCtoRxLength++;
/* check to see if the entire packet was received */
if (xcpCtoRxLength == xcpCtoReqPacket[0])
{
/* done with cto packet reception */
xcpCtoRxInProgress = 0;
/* check if this was an XCP CONNECT command */
if ((xcpCtoReqPacket[1] == 0xff) && (xcpCtoReqPacket[2] == 0x00))
{
/* connection request received so start the bootloader */
BootActivate();
}
}
}
else
{
/* check packet reception timeout */
if (TimerGet() > (xcpCtoRxStartTime + RS232_CTO_RX_PACKET_TIMEOUT_MS))
{
/* cancel cto packet reception due to timeout. note that this automatically
* discards the already received packet bytes, allowing the host to retry.
*/
xcpCtoRxInProgress = 0;
}
}
}
} /*** end of BootComRs232CheckActivationRequest ***/
/************************************************************************************//**
** \brief Receives a communication interface byte if one is present.
** \param data Pointer to byte where the data is to be stored.
** \return 1 if a byte was received, 0 otherwise.
**
****************************************************************************************/
static unsigned char Rs232ReceiveByte(unsigned char *data)
{
unsigned char result = 0;
/* Check if a new byte was received by means of the RDRF-bit. */
if (((LPUARTx->STAT & LPUART_STAT_RDRF_MASK) >> LPUART_STAT_RDRF_SHIFT) != 0U)
{
/* Retrieve and store the newly received byte. */
*data = LPUARTx->DATA;
/* Update the result. */
result = 1;
}
/* Give the result back to the caller. */
return result;
} /*** end of Rs232ReceiveByte ***/
#endif /* BOOT_COM_RS232_ENABLE > 0 */
#if (BOOT_COM_CAN_ENABLE > 0)
/****************************************************************************************
* C O N T R O L L E R A R E A N E T W O R K I N T E R F A C E
****************************************************************************************/
/****************************************************************************************
* Macro definitions
****************************************************************************************/
/** \brief Timeout for entering/leaving CAN initialization mode in milliseconds. */
#define CAN_INIT_TIMEOUT_MS (250U)
/** \brief Set the peripheral CAN0 base pointer. */
#define CANx (CAN0)
/** \brief Set the PCC index offset for CAN0. */
#define PCC_FlexCANx_INDEX (PCC_FlexCAN0_INDEX)
/** \brief Set the number of message boxes supported by CAN0. */
#define CANx_MAX_MB_NUM (FEATURE_CAN0_MAX_MB_NUM)
/** \brief The mailbox used for receiving the XCP command message. */
#define CAN_RX_MSGBOX_NUM (9U)
/****************************************************************************************
* Type definitions
****************************************************************************************/
/** \brief Structure type for grouping CAN bus timing related information. */
typedef struct t_can_bus_timing
{
unsigned char timeQuanta; /**< Total number of time quanta */
unsigned char propSeg; /**< CAN propagation segment */
unsigned char phaseSeg1; /**< CAN phase segment 1 */
unsigned char phaseSeg2; /**< CAN phase segment 2 */
} tCanBusTiming;
/****************************************************************************************
* Local constant declarations
****************************************************************************************/
/** \brief CAN bit timing table for dynamically calculating the bittiming settings.
* \details According to the CAN protocol 1 bit-time can be made up of between 8..25
* time quanta (TQ). The total TQ in a bit is SYNC + TSEG1 + TSEG2 with SYNC
* always being 1. The sample point is (SYNC + TSEG1) / (SYNC + TSEG1 + TSEG2)
* * 100%. This array contains possible and valid time quanta configurations
* with a sample point between 68..78%. A visual representation of the TQ in
* a bit is:
* | SYNCSEG | TIME1SEG | TIME2SEG |
* Or with an alternative representation:
* | SYNCSEG | PROPSEG | PHASE1SEG | PHASE2SEG |
* With the alternative representation TIME1SEG = PROPSEG + PHASE1SEG.
*
*/
static const tCanBusTiming canTiming[] =
{
/* Time-Quanta | PROPSEG | PSEG1 | PSEG2 | Sample-Point */
/* ---------------------------------------------------- */
{ 8U, 3U, 2U, 2U }, /*1+3+2+1=8 | 3 | 2 | 2 | 75% */
{ 9U, 3U, 3U, 2U }, /* 9 | 3 | 3 | 2 | 78% */
{ 10U, 3U, 3U, 3U }, /* 10 | 3 | 3 | 3 | 70% */
{ 11U, 4U, 3U, 3U }, /* 11 | 4 | 3 | 3 | 73% */
{ 12U, 4U, 4U, 3U }, /* 12 | 4 | 4 | 3 | 75% */
{ 13U, 5U, 4U, 3U }, /* 13 | 5 | 4 | 3 | 77% */
{ 14U, 5U, 4U, 4U }, /* 14 | 5 | 4 | 4 | 71% */
{ 15U, 6U, 4U, 4U }, /* 15 | 6 | 4 | 4 | 73% */
{ 16U, 6U, 5U, 4U }, /* 16 | 6 | 5 | 4 | 75% */
{ 17U, 7U, 5U, 4U }, /* 17 | 7 | 5 | 4 | 76% */
{ 18U, 7U, 5U, 5U }, /* 18 | 7 | 5 | 5 | 72% */
{ 19U, 8U, 5U, 5U }, /* 19 | 8 | 5 | 5 | 74% */
{ 20U, 8U, 6U, 5U }, /* 20 | 8 | 6 | 5 | 75% */
{ 21U, 8U, 7U, 5U }, /* 21 | 8 | 7 | 5 | 76% */
{ 22U, 8U, 7U, 6U }, /* 22 | 8 | 7 | 6 | 73% */
{ 23U, 8U, 8U, 6U }, /* 23 | 8 | 8 | 6 | 74% */
{ 24U, 8U, 8U, 7U }, /* 24 | 8 | 8 | 7 | 71% */
{ 25U, 8U, 8U, 8U } /* 25 | 8 | 8 | 8 | 68% */
};
/****************************************************************************************
* Local data declarations
****************************************************************************************/
/** \brief Dummy variable to store the CAN controller's free running timer value in.
* This is needed at the end of a CAN message reception to unlock the mailbox
* again. If this variable is declared locally within the function, it generates
* an unwanted compiler warning about assigning a value and not using it.
* For this reason this dummy variabled is declare here as a module global.
*/
static volatile unsigned long dummyTimerVal;
/************************************************************************************//**
** \brief Search algorithm to match the desired baudrate to a possible bus
** timing configuration.
** \param baud The desired baudrate in kbps. Valid values are 10..1000.
** \param prescaler Pointer to where the value for the prescaler will be stored.
** \param busTimingCfg Pointer to where the bus timing values will be stored.
** \return 1 if the CAN bustiming register values were found, 0 otherwise.
**
****************************************************************************************/
static unsigned char CanGetSpeedConfig(unsigned short baud, unsigned short * prescaler,
tCanBusTiming * busTimingCfg)
{
unsigned char cnt;
unsigned long canClockFreqkHz;
unsigned long div2RegValue;
unsigned char const div2DividerLookup[] =
{
0U, /* 0b000. Output disabled. */
1U, /* 0b001. Divide by 1. */
2U, /* 0b010. Divide by 2. */
4U, /* 0b011. Divide by 4. */
8U, /* 0b100. Divide by 8. */
16U, /* 0b101. Divide by 16. */
32U, /* 0b110. Divide by 32. */
64U, /* 0b111. Divide by 64. */
};
/* Obtain the DIV2 divider value of the SOSC_CLK. */
div2RegValue = (SCG->SOSCDIV & SCG_SOSCDIV_SOSCDIV2_MASK) >> SCG_SOSCDIV_SOSCDIV2_SHIFT;
/* Check if the DIV2 register value for SOSC is 0. In this case SOSCDIV2_CLK is
* currently disabled.
*/
if (div2RegValue == 0U)
{
/* Configure the DIV2 for a default divide by 1 to make sure the SOSCDIV2_CLK is
* actually enabled.
*/
div2RegValue = 1U;
SCG->SOSCDIV = SCG_SOSCDIV_SOSCDIV2(div2RegValue);
}
/* Determine the SOSC clock frequency. */
canClockFreqkHz = BOOT_CPU_XTAL_SPEED_KHZ;
/* Now process the configured DIV2 divider factor to get the actual frequency of the
* CAN peripheral source clock.
*/
canClockFreqkHz /= div2DividerLookup[div2RegValue];
/* Loop through all possible time quanta configurations to find a match. */
for (cnt=0; cnt < sizeof(canTiming)/sizeof(canTiming[0]); cnt++)
{
if ((canClockFreqkHz % (baud * canTiming[cnt].timeQuanta)) == 0U)
{
/* Compute the prescaler that goes with this TQ configuration. */
*prescaler = canClockFreqkHz/(baud * canTiming[cnt].timeQuanta);
/* Make sure the prescaler is valid. */
if ((*prescaler > 0U) && (*prescaler <= 256U))
{
/* Store the bustiming configuration. */
*busTimingCfg = canTiming[cnt];
/* Found a good bus timing configuration. */
return 1U;
}
}
}
/* Could not find a good bus timing configuration. */
return 0U;
} /*** end of CanGetSpeedConfig ***/
/************************************************************************************//**
** \brief Places the CAN controller in freeze mode. Note that the CAN controller
** can only be placed in freeze mode, if it is actually enabled.
** \return none.
**
****************************************************************************************/
static void CanFreezeModeEnter(void)
{
unsigned long timeout;
/* Request to enter freeze mode. */
CANx->MCR = (CANx->MCR & ~CAN_MCR_FRZ_MASK) | CAN_MCR_FRZ(1U);
CANx->MCR = (CANx->MCR & ~CAN_MCR_HALT_MASK) | CAN_MCR_HALT(1U);
/* Set timeout time for entering freeze mode. */
timeout = TimerGet() + CAN_INIT_TIMEOUT_MS;
/* Wait for freeze mode acknowledgement. */
while (((CANx->MCR & CAN_MCR_FRZACK_MASK)) == 0U)
{
/* Break loop upon timeout. This would indicate a hardware failure. */
if (TimerGet() > timeout)
{
break;
}
}
} /*** end of CanFreezeModeEnter ***/
/************************************************************************************//**
** \brief Leaves the CAN controller's freeze mode. Note that this operation can
** only be done, if it is actually enabled.
** \return none.
**
****************************************************************************************/
static void CanFreezeModeExit(void)
{
unsigned long timeout;
/* Request to leave freeze mode. */
CANx->MCR = (CANx->MCR & ~CAN_MCR_FRZ_MASK) | CAN_MCR_FRZ(0U);
CANx->MCR = (CANx->MCR & ~CAN_MCR_HALT_MASK) | CAN_MCR_HALT(0U);
/* Set timeout time for leaving freeze mode. */
timeout = TimerGet() + CAN_INIT_TIMEOUT_MS;
/* Wait for non freeze mode acknowledgement. */
while (((CANx->MCR & CAN_MCR_FRZACK_MASK)) != 0U)
{
/* Break loop upon timeout. This would indicate a hardware failure. */
if (TimerGet() > timeout)
{
break;
}
}
} /*** end of CanFreezeModeExit ***/
/************************************************************************************//**
** \brief Places the CAN controller in disabled mode.
** \return none.
**
****************************************************************************************/
static void CanDisabledModeEnter(void)
{
unsigned long timeout;
/* Only continue if the CAN controller is currently enabled. */
if ((CANx->MCR & CAN_MCR_MDIS_MASK) == 0U)
{
/* Request disabled mode. */
CANx->MCR = (CANx->MCR & ~CAN_MCR_MDIS_MASK) | CAN_MCR_MDIS(1U);
/* Set timeout time for entering disabled mode. */
timeout = TimerGet() + CAN_INIT_TIMEOUT_MS;
/* Wait for disabled mode acknowledgement. */
while (((CANx->MCR & CAN_MCR_LPMACK_MASK)) == 0U)
{
/* Break loop upon timeout. This would indicate a hardware failure. */
if (TimerGet() > timeout)
{
break;
}
}
}
} /*** end of CanDisabledModeEnter ***/
/************************************************************************************//**
** \brief Places the CAN controller in enabled mode.
** \return none.
**
****************************************************************************************/
static void CanDisabledModeExit(void)
{
unsigned long timeout;
/* Only continue if the CAN controller is currently disabled. */
if ((CANx->MCR & CAN_MCR_MDIS_MASK) != 0U)
{
/* Request enabled mode. */
CANx->MCR = (CANx->MCR & ~CAN_MCR_MDIS_MASK) | CAN_MCR_MDIS(0U);
/* Set timeout time for leaving disabled mode. */
timeout = TimerGet() + CAN_INIT_TIMEOUT_MS;
/* Wait for disabled mode acknowledgement. */
while (((CANx->MCR & CAN_MCR_LPMACK_MASK)) != 0U)
{
/* Break loop upon timeout. This would indicate a hardware failure. */
if (TimerGet() > timeout)
{
break;
}
}
}
} /*** end of CanDisabledModeExit ***/
/************************************************************************************//**
** \brief Initializes the CAN communication interface.
** \return none.
**
****************************************************************************************/
static void BootComCanInit(void)
{
unsigned short prescaler = 0;
tCanBusTiming timingCfg = { 0 };
unsigned char rjw;
unsigned short idx;
unsigned long timeout;
unsigned long rxMsgId = BOOT_COM_CAN_RX_MSG_ID;
/* Enable the CAN peripheral clock. */
PCC->PCCn[PCC_FlexCANx_INDEX] |= PCC_PCCn_CGC_MASK;
/* The source clock needs to be configured first. For this the CAN controller must be
* in disabled mode, but that can only be entered after first entering freeze mode,
* which in turn can only be in enabled mode. So first enable the module, then goto
* freeze mode and finally enter disabled mode.
*/
CanDisabledModeExit();
CanFreezeModeEnter();
CanDisabledModeEnter();
/* Configure SOSCDIV2 as the source clock. This assumes that an external oscillator
* is available, which is typically the case to meet the clock tolerance requirements
* of the CAN 2.0B secification.
*/
CANx->CTRL1 &= ~CAN_CTRL1_CLKSRC_MASK;
/* Leave disabled mode. */
CanDisabledModeExit();
/* Make sure freeze mode is active to be able to initialize the CAN controller. */
CanFreezeModeEnter();
/* Obtain bittiming configuration information. */
(void)CanGetSpeedConfig(BOOT_COM_CAN_BAUDRATE/1000, &prescaler, &timingCfg);
/* Reset the current bittiming configuration. */
CANx->CTRL1 &= ~(CAN_CTRL1_PRESDIV_MASK | CAN_CTRL1_PROPSEG_MASK |
CAN_CTRL1_PSEG1_MASK | CAN_CTRL1_PSEG2_MASK | CAN_CTRL1_RJW_MASK |
CAN_CTRL1_SMP_MASK);
/* Configure the baudrate prescaler. */
CANx->CTRL1 |= CAN_CTRL1_PRESDIV(prescaler - 1U);
/* Configure the propagation segment. */
CANx->CTRL1 |= CAN_CTRL1_PROPSEG(timingCfg.propSeg - 1U);
/* Configure the phase segments. */
CANx->CTRL1 |= CAN_CTRL1_PSEG1(timingCfg.phaseSeg1 - 1U);
CANx->CTRL1 |= CAN_CTRL1_PSEG2(timingCfg.phaseSeg2 - 1U);
/* The resynchronization jump width (RJW) can be 1 - 4 TQ, yet should never be larger
* than pseg1. Configure the longest possible value for RJW.
*/
rjw = (timingCfg.phaseSeg1 < 4) ? timingCfg.phaseSeg1 : 4;
CANx->CTRL1 |= CAN_CTRL1_RJW(rjw - 1U);
/* All the entries in canTiming[] have a PSEG1 >= 2, so three samples can be used to
* determine the value of the received bit, instead of the default one.
*/
CANx->CTRL1 |= CAN_CTRL1_SMP(1U);
/* Clear the message box RAM. Each message box covers 4 words (1 word = 32-bits. */
for (idx = 0; idx < (CANx_MAX_MB_NUM * 4U); idx++)
{
CANx->RAMn[idx] = 0U;
}
/* Clear the reception mask register for each message box. */
for (idx = 0; idx < CANx_MAX_MB_NUM; idx++)
{
CANx->RXIMR[idx] = 0U;
}
/* Configure the maximum number of message boxes. */
CANx->MCR = (CANx->MCR & ~CAN_MCR_MAXMB_MASK) | CAN_MCR_MAXMB(CANx_MAX_MB_NUM - 1U);
/* Disable the self reception feature. */
CANx->MCR = (CANx->MCR & ~CAN_MCR_SRXDIS_MASK) | CAN_MCR_SRXDIS(1U);
/* Enable individual reception masking. This disables the legacy support for the
* global reception mask and the mailbox 14/15 individual reception mask.
*/
CANx->MCR = (CANx->MCR & ~CAN_MCR_IRMQ_MASK) | CAN_MCR_IRMQ(1U);
/* Disable the reception FIFO. This driver only needs to receive one CAN message
* identifier. It is sufficient to use just one dedicated mailbox for this.
*/
CANx->MCR &= ~CAN_MCR_RFEN_MASK;
/* Configure the mask of the invididual message reception mailbox to check all ID bits
* and also the IDE bit.
*/
CANx->RXIMR[CAN_RX_MSGBOX_NUM] = 0x40000000U | 0x1FFFFFFFU;
/* Configure the reception mailbox to receive just the CAN message configured with
* BOOT_COM_CAN_RX_MSG_ID.
* EDL, BRS, ESI=0: CANFD not used.
* CODE=0b0100: mailbox set to active and empty.
* IDE=0: 11-bit CAN identifier.
* SRR, RTR, TIME STAMP=0: not applicable.
*/
CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 0U] = 0x04000000;
/* Store the message identifier to receive in the mailbox RAM. */
if ((rxMsgId & 0x80000000U) != 0U)
{
/* It is a 29-bit extended CAN identifier. */
rxMsgId &= ~0x80000000U;
/* Set the IDE bit to configure the message for a 29-bit identifier. */
CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 0U] |= CAN_WMBn_CS_IDE_MASK;
/* Store the 29-bit CAN identifier. */
CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 1U] = CAN_WMBn_ID_ID(rxMsgId);
}
else
{
/* Store the 11-bit CAN identifier. */
CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 1U] = CAN_WMBn_ID_ID(rxMsgId << 18U);
}
/* Disable all message box interrupts. */
CANx->IMASK1 = 0U;
/* Clear all mesasge box interrupt flags. */
CANx->IFLAG1 = CAN_IMASK1_BUF31TO0M_MASK;
/* Clear all error interrupt flags */
CANx->ESR1 = CAN_ESR1_ERRINT_MASK | CAN_ESR1_BOFFINT_MASK | CAN_ESR1_RWRNINT_MASK |
CAN_ESR1_TWRNINT_MASK | CAN_ESR1_BOFFDONEINT_MASK |
CAN_ESR1_ERRINT_FAST_MASK | CAN_ESR1_ERROVR_MASK;
/* Switch to normal user mode. */
CANx->MCR &= ~CAN_MCR_SUPV_MASK;
CANx->CTRL1 &= ~(CAN_CTRL1_LOM_MASK | CAN_CTRL1_LPB_MASK);
/* Exit freeze mode. */
CanFreezeModeExit();
/* Set timeout time for entering normal user mode. */
timeout = TimerGet() + CAN_INIT_TIMEOUT_MS;
/* Wait for normal user mode acknowledgement. */
while (((CANx->MCR & CAN_MCR_NOTRDY_MASK)) != 0U)
{
/* Break loop upon timeout. This would indicate a hardware failure. */
if (TimerGet() > timeout)
{
break;
}
}
} /*** end of BootComCanInit ***/
/************************************************************************************//**
** \brief Receives the CONNECT request from the host, which indicates that the
** bootloader should be activated and, if so, activates it.
** \return none.
**
****************************************************************************************/
static void BootComCanCheckActivationRequest(void)
{
unsigned char * pMsgBoxData;
unsigned char byteIdx;
unsigned char rxMsgData[8];
unsigned char rxMsgLen;
/* Check if a message was received in the individual mailbox configured to receive
* the BOOT_COM_CAN_RX_MSG_ID message.
*/
if ((CANx->IFLAG1 & (1U << CAN_RX_MSGBOX_NUM)) != 0U)
{
/* Note that there is no need to verify the identifier of the CAN message because the
* mailbox is configured to only receive the BOOT_COM_CAN_TX_MSG_ID message. Start
* by reading out the DLC of the newly received CAN message.
*/
rxMsgLen = (CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 0U] & CAN_WMBn_CS_DLC_MASK) >> CAN_WMBn_CS_DLC_SHIFT;
/* Read the data bytes of the CAN message from the mailbox RAM. */
pMsgBoxData = (unsigned char *)(&CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 2U]);
for (byteIdx = 0; byteIdx < rxMsgLen; byteIdx++)
{
rxMsgData[byteIdx] = pMsgBoxData[((byteIdx) & ~3U) + (3U - ((byteIdx) & 3U))];
}
/* Clear the mailbox interrupt flag by writing a 1 to the corresponding box. */
CANx->IFLAG1 = (1U << CAN_RX_MSGBOX_NUM);
/* Read the free running timer to unlock the mailbox. */
dummyTimerVal = CANx->TIMER;
/* check if this was an XCP CONNECT command */
if ((rxMsgData[0] == 0xff) && (rxMsgLen == 2))
{
/* connection request received so start the bootloader */
BootActivate();
}
}
} /*** end of BootComCanCheckActivationRequest ***/
#endif /* BOOT_COM_CAN_ENABLE > 0 */
/*********************************** end of boot.c *************************************/

View File

@ -0,0 +1,40 @@
/************************************************************************************//**
* \file Demo/ARMCM4_S32K14_S32K144EVB_IAR/Prog/boot.h
* \brief Demo program bootloader interface header file.
* \ingroup Prog_ARMCM4_S32K14_S32K144EVB_IAR
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
#ifndef BOOT_H
#define BOOT_H
/****************************************************************************************
* Function prototypes
****************************************************************************************/
void BootComInit(void);
void BootComCheckActivationRequest(void);
void BootActivate(void);
#endif /* BOOT_H */
/*********************************** end of boot.h *************************************/

View File

@ -0,0 +1,42 @@
/************************************************************************************//**
* \file Demo/ARMCM4_S32K14_S32K144EVB_IAR/Prog/header.h
* \brief Generic header file.
* \ingroup Prog_ARMCM4_S32K14_S32K144EVB_IAR
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
#ifndef HEADER_H
#define HEADER_H
/****************************************************************************************
* Include files
****************************************************************************************/
#include "../Boot/blt_conf.h" /* bootloader configuration */
#include "boot.h" /* bootloader interface driver */
#include "led.h" /* LED driver */
#include "timer.h" /* Timer driver */
#include "device_registers.h" /* Device registers */
#include "system_S32K144.h" /* Device sconfiguration */
#endif /* HEADER_H */
/*********************************** end of header.h ***********************************/

View File

@ -0,0 +1,264 @@
<?xml version="1.0" encoding="UTF-8"?>
<project>
<fileVersion>4</fileVersion>
<fileChecksum>3486298355</fileChecksum>
<configuration>
<name>Debug</name>
<outputs>
<file>$TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h</file>
<file>$PROJ_DIR$\..\obj\main.o</file>
<file>$PROJ_DIR$\..\obj\led.__cstat.et</file>
<file>$TOOLKIT_DIR$\lib\rt7M_tl.a</file>
<file>$PROJ_DIR$\..\bin\demoprog_s32k144.srec</file>
<file>$PROJ_DIR$\..\lib\S32K144_features.h</file>
<file>$PROJ_DIR$\..\lib\startup.h</file>
<file>$PROJ_DIR$\..\boot.c</file>
<file>$PROJ_DIR$\..\boot.h</file>
<file>$PROJ_DIR$\..\bin\openblt_s32k144.out</file>
<file>$PROJ_DIR$\..\led.h</file>
<file>$PROJ_DIR$\..\obj\timer.o</file>
<file>$PROJ_DIR$\..\lib\startup.c</file>
<file>$PROJ_DIR$\..\lib\system_S32K144.h</file>
<file>$PROJ_DIR$\..\obj\timer.xcl</file>
<file>$PROJ_DIR$\..\lib\system_S32K144.c</file>
<file>$PROJ_DIR$\..\obj\startup.xcl</file>
<file>$PROJ_DIR$\..\startup_S32K144.s</file>
<file>$PROJ_DIR$\..\obj\system_S32K144.xcl</file>
<file>$PROJ_DIR$\..\..\Boot\blt_conf.h</file>
<file>$PROJ_DIR$\..\led.c</file>
<file>$PROJ_DIR$\..\timer.h</file>
<file>$PROJ_DIR$\..\obj\openblt_s32k144.map</file>
<file>$PROJ_DIR$\..\obj\system_S32K144.__cstat.et</file>
<file>$PROJ_DIR$\..\obj\system_S32K144.o</file>
<file>$TOOLKIT_DIR$\lib\dl7M_tln.a</file>
<file>$PROJ_DIR$\..\header.h</file>
<file>$TOOLKIT_DIR$\inc\c\stdint.h</file>
<file>$TOOLKIT_DIR$\lib\m7M_tls.a</file>
<file>$PROJ_DIR$\..\main.c</file>
<file>$PROJ_DIR$\..\timer.c</file>
<file>$TOOLKIT_DIR$\lib\shb_l.a</file>
<file>$PROJ_DIR$\..\lib\devassert.h</file>
<file>$PROJ_DIR$\..\lib\s32_core_cm4.h</file>
<file>$PROJ_DIR$\..\lib\S32K144.h</file>
<file>$PROJ_DIR$\..\lib\device_registers.h</file>
<file>$PROJ_DIR$\..\obj\main.xcl</file>
<file>$PROJ_DIR$\..\obj\timer.__cstat.et</file>
<file>$TOOLKIT_DIR$\inc\c\stdbool.h</file>
<file>$PROJ_DIR$\..\obj\startup.o</file>
<file>$PROJ_DIR$\..\obj\s32k144.pbd</file>
<file>$PROJ_DIR$\..\obj\boot.__cstat.et</file>
<file>$PROJ_DIR$\..\obj\led.o</file>
<file>$PROJ_DIR$\..\obj\boot.o</file>
<file>$TOOLKIT_DIR$\inc\c\yvals.h</file>
<file>$TOOLKIT_DIR$\inc\c\DLib_Defaults.h</file>
<file>$PROJ_DIR$\..\obj\startup_S32K144.o</file>
<file>$PROJ_DIR$\..\obj\main.__cstat.et</file>
<file>$PROJ_DIR$\..\obj\led.xcl</file>
<file>$TOOLKIT_DIR$\inc\c\DLib_Product.h</file>
<file>$PROJ_DIR$\..\obj\boot.xcl</file>
<file>$TOOLKIT_DIR$\inc\c\ycheck.h</file>
<file>$PROJ_DIR$\..\obj\startup.__cstat.et</file>
<file>$PROJ_DIR$\..\S32K144_64_flash.icf</file>
<file>$PROJ_DIR$\..\obj\demoprog_s32k144.map</file>
<file>$PROJ_DIR$\..\bin\demoprog_s32k144.out</file>
</outputs>
<file>
<name>[ROOT_NODE]</name>
<outputs>
<tool>
<name>ILINK</name>
<file> 55 54</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\boot.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 43</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 50</file>
</tool>
<tool>
<name>__cstat</name>
<file> 41</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 26 19 8 10 21 35 33 34 27 51 44 45 0 49 5 32 38 13</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\bin\openblt_s32k144.out</name>
<outputs>
<tool>
<name>OBJCOPY</name>
<file> 4</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ILINK</name>
<file> 53 43 42 1 39 46 24 11 31 3 28 25</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\lib\startup.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 39</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 16</file>
</tool>
<tool>
<name>__cstat</name>
<file> 52</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 6 27 51 44 45 0 49 35 33 34 5 32 38</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\lib\system_S32K144.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 24</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 18</file>
</tool>
<tool>
<name>__cstat</name>
<file> 23</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 35 33 34 27 51 44 45 0 49 5 32 38 13</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\startup_S32K144.s</name>
<outputs>
<tool>
<name>AARM</name>
<file> 46</file>
</tool>
</outputs>
</file>
<file>
<name>$PROJ_DIR$\..\led.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 42</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 48</file>
</tool>
<tool>
<name>__cstat</name>
<file> 2</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 26 19 8 10 21 35 33 34 27 51 44 45 0 49 5 32 38 13</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\main.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 1</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 36</file>
</tool>
<tool>
<name>__cstat</name>
<file> 47</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 26 19 8 10 21 35 33 34 27 51 44 45 0 49 5 32 38 13</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\timer.c</name>
<outputs>
<tool>
<name>ICCARM</name>
<file> 11</file>
</tool>
<tool>
<name>BICOMP</name>
<file> 14</file>
</tool>
<tool>
<name>__cstat</name>
<file> 37</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ICCARM</name>
<file> 26 19 8 10 21 35 33 34 27 51 44 45 0 49 5 32 38 13</file>
</tool>
</inputs>
</file>
<file>
<name>$PROJ_DIR$\..\bin\demoprog_s32k144.out</name>
<outputs>
<tool>
<name>ILINK</name>
<file> 54</file>
</tool>
<tool>
<name>OBJCOPY</name>
<file> 4</file>
</tool>
</outputs>
<inputs>
<tool>
<name>ILINK</name>
<file> 53 43 42 1 39 46 24 11 31 3 28 25</file>
</tool>
</inputs>
</file>
</configuration>
<configuration>
<name>Release</name>
<outputs />
<forcedrebuild>
<name>[MULTI_TOOL]</name>
<tool>ILINK</tool>
</forcedrebuild>
</configuration>
</project>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<workspace>
<project>
<path>$WS_DIR$\s32k144.ewp</path>
</project>
<batchBuild />
</workspace>

View File

@ -0,0 +1,96 @@
/************************************************************************************//**
* \file Demo/ARMCM4_S32K14_S32K144EVB_IAR/Prog/led.c
* \brief LED driver source file.
* \ingroup Prog_ARMCM4_S32K14_S32K144EVB_IAR
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
/****************************************************************************************
* Include files
****************************************************************************************/
#include "header.h" /* generic header */
/****************************************************************************************
* Macro definitions
****************************************************************************************/
/** \brief Toggle interval time in milliseconds. */
#define LED_TOGGLE_MS (500U)
/************************************************************************************//**
** \brief Initializes the LED.
** \return none.
**
****************************************************************************************/
void LedInit(void)
{
/* LED GPIO pin configuration. PD0 = GPIO, MUX = ALT1. */
PORTD->PCR[0] |= PORT_PCR_MUX(1);
/* configure Port D pin 0 GPIO as digital output */
PTD->PDDR |= GPIO_PDDR_PDD(0x00000001);
/* turn the LED off on Port D pin 0 */
PTD->PSOR |= GPIO_PSOR_PTSO(0x00000001);
} /*** end of LedInit ***/
/************************************************************************************//**
** \brief Toggles the LED at a fixed time interval.
** \return none.
**
****************************************************************************************/
void LedToggle(void)
{
static unsigned char led_toggle_state = 0;
static unsigned long timer_counter_last = 0;
unsigned long timer_counter_now;
/* Check if toggle interval time passed. */
timer_counter_now = TimerGet();
if ( (timer_counter_now - timer_counter_last) < LED_TOGGLE_MS)
{
/* Not yet time to toggle. */
return;
}
/* Determine toggle action. */
if (led_toggle_state == 0)
{
led_toggle_state = 1;
/* Turn the LED on. */
PTD->PCOR |= GPIO_PCOR_PTCO(0x00000001);
}
else
{
led_toggle_state = 0;
/* Turn the LED off. */
PTD->PSOR |= GPIO_PSOR_PTSO(0x00000001);
}
/* Store toggle time to determine next toggle interval. */
timer_counter_last = timer_counter_now;
} /*** end of LedToggle ***/
/*********************************** end of led.c **************************************/

View File

@ -0,0 +1,39 @@
/************************************************************************************//**
* \file Demo/ARMCM4_S32K14_S32K144EVB_IAR/Prog/led.h
* \brief LED driver header file.
* \ingroup Prog_ARMCM4_S32K14_S32K144EVB_IAR
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
#ifndef LED_H
#define LED_H
/****************************************************************************************
* Function prototypes
****************************************************************************************/
void LedInit(void);
void LedToggle(void);
#endif /* LED_H */
/*********************************** end of led.h **************************************/

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,84 @@
/*
* Copyright (c) 2015, Freescale Semiconductor, Inc.
* Copyright 2016-2017 NXP
* All rights reserved.
*
* THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef DEVASSERT_H
#define DEVASSERT_H
#include <stdbool.h>
/**
* @page misra_violations MISRA-C:2012 violations
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 2.5, global macro not referenced.
* The macro is defined to be used by drivers to validate input parameters and can be disabled.
*
* @section [global]
* Violates MISRA 2012 Advisory Directive 4.9, Function-like macro defined.
* The macros are used to validate input parameters to driver functions.
*
*/
/**
\page Error_detection_and_reporting Error detection and reporting
S32 SDK drivers can use a mechanism to validate data coming from upper software layers (application code) by performing
a number of checks on input parameters' range or other invariants that can be statically checked (not dependent on
runtime conditions). A failed validation is indicative of a software bug in application code, therefore it is important
to use this mechanism during development.
The validation is performed by using DEV_ASSERT macro.
A default implementation of this macro is provided in this file. However, application developers can provide their own
implementation in a custom file. This requires defining the CUSTOM_DEVASSERT symbol with the specific file name in the
project configuration (for example: -DCUSTOM_DEVASSERT="custom_devassert.h")
The default implementation accommodates two behaviors, based on DEV_ERROR_DETECT symbol:
- When DEV_ERROR_DETECT symbol is defined in the project configuration (for example: -DDEV_ERROR_DETECT), the validation
performed by the DEV_ASSERT macro is enabled, and a failed validation triggers a software breakpoint and further execution is
prevented (application spins in an infinite loop)
This configuration is recommended for development environments, as it prevents further execution and allows investigating
potential problems from the point of error detection.
- When DEV_ERROR_DETECT symbol is not defined, the DEV_ASSERT macro is implemented as no-op, therefore disabling all validations.
This configuration can be used to eliminate the overhead of development-time checks.
It is the application developer's responsibility to decide the error detection strategy for production code: one can opt to
disable development-time checking altogether (by not defining DEV_ERROR_DETECT symbol), or one can opt to keep the checks
in place and implement a recovery mechanism in case of a failed validation, by defining CUSTOM_DEVASSERT to point
to the file containing the custom implementation.
*/
#if defined (CUSTOM_DEVASSERT)
/* If the CUSTOM_DEVASSERT symbol is defined, then add the custom implementation */
#include CUSTOM_DEVASSERT
#elif defined (DEV_ERROR_DETECT)
/* Implement default assert macro */
static inline void DevAssert(volatile bool x)
{
if(x) { } else { BKPT_ASM; for(;;) {} }
}
#define DEV_ASSERT(x) DevAssert(x)
#else
/* Assert macro does nothing */
#define DEV_ASSERT(x) ((void)0)
#endif
#endif /* DEVASSERT_H */
/*******************************************************************************
* EOF
******************************************************************************/

View File

@ -0,0 +1,70 @@
/*
** ###################################################################
** Abstract:
** Common include file for CMSIS register access layer headers.
**
** Copyright (c) 2015 Freescale Semiconductor, Inc.
** Copyright 2016-2017 NXP
** All rights reserved.
**
** THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
** IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
** INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
** STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
** IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
** THE POSSIBILITY OF SUCH DAMAGE.
**
** http: www.nxp.com
** mail: support@nxp.com
** ###################################################################
*/
#ifndef DEVICE_REGISTERS_H
#define DEVICE_REGISTERS_H
/**
* @page misra_violations MISRA-C:2012 violations
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 2.5, global macro not referenced.
* The macro defines the device currently in use and may be used by components for specific checks.
*
*/
/*
* Include the cpu specific register header files.
*
* The CPU macro should be declared in the project or makefile.
*/
#if (defined(CPU_S32K144HFT0VLLT) || defined(CPU_S32K144LFT0MLLT))
#define S32K14x_SERIES
/* Specific core definitions */
#include "s32_core_cm4.h"
#define S32K144_SERIES
/* Register definitions */
#include "S32K144.h"
/* CPU specific feature definitions */
#include "S32K144_features.h"
#else
#error "No valid CPU defined!"
#endif
#include "devassert.h"
#endif /* DEVICE_REGISTERS_H */
/*******************************************************************************
* EOF
******************************************************************************/

View File

@ -0,0 +1,209 @@
/*
* Copyright (c) 2015-2016 Freescale Semiconductor, Inc.
* Copyright 2016-2017 NXP
* All rights reserved.
*
* THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
*/
/*!
* @file s32_core_cm4.h
*
* @page misra_violations MISRA-C:2012 violations
*
* @section [global]
* Violates MISRA 2012 Advisory Directive 4.9, Function-like macro
* Function-like macros are used instead of inline functions in order to ensure
* that the performance will not be decreased if the functions will not be
* inlined by the compiler.
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 2.5, Global macro not referenced.
* The macros defined are used only on some of the drivers, so this might be reported
* when the analysis is made only on one driver.
*/
/*
* Tool Chains:
* GNUC flag is defined also by ARM compiler - it shows the current major version of the compatible GCC version
* __GNUC__ : GNU Compiler Collection
* __ghs__ : Green Hills ARM Compiler
* __ICCARM__ : IAR ARM Compiler
* __DCC__ : Wind River Diab Compiler
* __ARMCC_VERSION: ARM Compiler
*/
#if !defined (CORE_CM4_H)
#define CORE_CM4_H
#ifdef __cplusplus
extern "C" {
#endif
/** \brief BKPT_ASM
*
* Macro to be used to trigger an debug interrupt
*/
#define BKPT_ASM __asm("BKPT #0\n\t")
/** \brief Enable FPU
*
* ENABLE_FPU indicates whether SystemInit will enable the Floating point unit (FPU)
*/
#if defined (__GNUC__) || defined (__ARMCC_VERSION)
#if defined (__VFP_FP__) && !defined (__SOFTFP__)
#define ENABLE_FPU
#endif
#elif defined (__ICCARM__)
#if defined __ARMVFP__
#define ENABLE_FPU
#endif
#elif defined (__ghs__) || defined (__DCC__)
#if defined (__VFP__)
#define ENABLE_FPU
#endif
#endif /* if defined (__GNUC__) */
/** \brief Enable interrupts
*/
#if defined (__GNUC__)
#define ENABLE_INTERRUPTS() __asm volatile ("cpsie i" : : : "memory");
#else
#define ENABLE_INTERRUPTS() __asm("cpsie i")
#endif
/** \brief Disable interrupts
*/
#if defined (__GNUC__)
#define DISABLE_INTERRUPTS() __asm volatile ("cpsid i" : : : "memory");
#else
#define DISABLE_INTERRUPTS() __asm("cpsid i")
#endif
/** \brief Enter low-power standby state
* WFI (Wait For Interrupt) makes the processor suspend execution (Clock is stopped) until an IRQ interrupts.
*/
#if defined (__GNUC__)
#define STANDBY() __asm volatile ("wfi")
#else
#define STANDBY() __asm("wfi")
#endif
/** \brief No-op
*/
#define NOP() __asm volatile ("nop")
/** \brief Reverse byte order in a word.
*/
#if defined (__GNUC__) || defined (__ICCARM__) || defined (__ghs__) || defined (__ARMCC_VERSION)
#define REV_BYTES_32(a, b) __asm volatile ("rev %0, %1" : "=r" (b) : "r" (a))
#else
#define REV_BYTES_32(a, b) (b = ((a & 0xFF000000U) >> 24U) | ((a & 0xFF0000U) >> 8U) \
| ((a & 0xFF00U) << 8U) | ((a & 0xFFU) << 24U))
#endif
/** \brief Reverse byte order in each halfword independently.
*/
#if defined (__GNUC__) || defined (__ICCARM__) || defined (__ghs__) || defined (__ARMCC_VERSION)
#define REV_BYTES_16(a, b) __asm volatile ("rev16 %0, %1" : "=r" (b) : "r" (a))
#else
#define REV_BYTES_16(a, b) (b = ((a & 0xFF000000U) >> 8U) | ((a & 0xFF0000U) << 8U) \
| ((a & 0xFF00U) >> 8U) | ((a & 0xFFU) << 8U))
#endif
/** \brief Places a function in RAM.
*/
#if defined ( __GNUC__ ) || defined (__ARMCC_VERSION)
#define START_FUNCTION_DECLARATION_RAMSECTION
#define END_FUNCTION_DECLARATION_RAMSECTION __attribute__((section (".code_ram")));
#elif defined ( __ghs__ )
#define START_FUNCTION_DECLARATION_RAMSECTION _Pragma("ghs callmode=far")
#define END_FUNCTION_DECLARATION_RAMSECTION __attribute__((section (".code_ram")));\
_Pragma("ghs callmode=default")
#elif defined ( __ICCARM__ )
#define START_FUNCTION_DECLARATION_RAMSECTION __ramfunc
#define END_FUNCTION_DECLARATION_RAMSECTION ;
#elif defined ( __DCC__ )
#define START_FUNCTION_DECLARATION_RAMSECTION _Pragma("section CODE \".code_ram\"") \
_Pragma("use_section CODE")
#define END_FUNCTION_DECLARATION_RAMSECTION ; \
_Pragma("section CODE \".text\"")
#else
/* Keep compatibility with software analysis tools */
#define START_FUNCTION_DECLARATION_RAMSECTION
#define END_FUNCTION_DECLARATION_RAMSECTION ;
#endif
/* For GCC, IAR, GHS, Diab and ARMC there is no need to specify the section when
defining a function, it is enough to specify it at the declaration. This
also enables compatibility with software analysis tools. */
#define START_FUNCTION_DEFINITION_RAMSECTION
#define END_FUNCTION_DEFINITION_RAMSECTION
#if defined (__ICCARM__)
#define DISABLE_CHECK_RAMSECTION_FUNCTION_CALL _Pragma("diag_suppress=Ta022")
#define ENABLE_CHECK_RAMSECTION_FUNCTION_CALL _Pragma("diag_default=Ta022")
#else
#define DISABLE_CHECK_RAMSECTION_FUNCTION_CALL
#define ENABLE_CHECK_RAMSECTION_FUNCTION_CALL
#endif
/** \brief Get Core ID
*
* GET_CORE_ID returns the processor identification number for cm4
*/
#define GET_CORE_ID() 0U
/** \brief Data alignment.
*/
#if defined ( __GNUC__ ) || defined ( __ghs__ ) || defined ( __DCC__ ) || defined (__ARMCC_VERSION)
#define ALIGNED(x) __attribute__((aligned(x)))
#elif defined ( __ICCARM__ )
#define stringify(s) tostring(s)
#define tostring(s) #s
#define ALIGNED(x) _Pragma(stringify(data_alignment=x))
#else
/* Keep compatibility with software analysis tools */
#define ALIGNED(x)
#endif
/** \brief Section placement.
*/
#if defined ( __GNUC__ ) || defined ( __ghs__ ) || defined ( __DCC__ ) || defined (__ARMCC_VERSION)
#define PLACE_IN_SECTION(x) __attribute__((section(x)))
#elif defined ( __ICCARM__ )
#define PLACE_IN_SECTION(x) _Pragma(stringify(section=x))
#else
/* Keep compatibility with software analysis tools */
#define PLACE_IN_SECTION(x)
#endif
/** \brief Endianness.
*/
#define CORE_LITTLE_ENDIAN
#ifdef __cplusplus
}
#endif
#endif /* CORE_CM4_H */
/*******************************************************************************
* EOF
******************************************************************************/

View File

@ -0,0 +1,248 @@
/*
* Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc.
* Copyright 2016-2018 NXP
* All rights reserved.
*
* THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @page misra_violations MISRA-C:2012 violations
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block
* scope if its identifier only appears in a single function.
* All variables with this problem are defined in the linker files.
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 8.11, When an array with external linkage
* is declared, its size should be explicitly specified.
* The size of the arrays can not be explicitly determined.
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 11.4, A conversion should not be performed
* between a pointer to object and an integer type.
* The cast is required to initialize a pointer with an unsigned int define,
* representing an address.
*
* @section [global]
* Violates MISRA 2012 Required Rule 11.6, A cast shall not be performed
* between pointer to void and an arithmetic type.
* The cast is required to initialize a pointer with an unsigned int define,
* representing an address.
*
* @section [global]
* Violates MISRA 2012 Required Rule 2.1, A project shall not contain unreachable
* code.
* The condition compares two address defined in linker files that can be different.
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 8.7, External could be made static.
* Function is defined for usage by application code.
*
* @section [global]
* Violates MISRA 2012 Mandatory Rule 17.3, Symbol 'MFSPR' undeclared, assumed
* to return int.
* This is an e200 Power Architecture Assembly instruction used to retrieve
* the core number.
*
*/
#include "startup.h"
#include <stdint.h>
/*******************************************************************************
* Static Variables
******************************************************************************/
static volatile uint32_t * const s_vectors[NUMBER_OF_CORES] = FEATURE_INTERRUPT_INT_VECTORS;
/*******************************************************************************
* Code
******************************************************************************/
/*FUNCTION**********************************************************************
*
* Function Name : init_data_bss
* Description : Make necessary initializations for RAM.
* - Copy the vector table from ROM to RAM.
* - Copy initialized data from ROM to RAM.
* - Copy code that should reside in RAM from ROM
* - Clear the zero-initialized data section.
*
* Tool Chains:
* __GNUC__ : GNU Compiler Collection
* __ghs__ : Green Hills ARM Compiler
* __ICCARM__ : IAR ARM Compiler
* __DCC__ : Wind River Diab Compiler
* __ARMCC_VERSION : ARMC Compiler
*
* Implements : init_data_bss_Activity
*END**************************************************************************/
void init_data_bss(void)
{
uint32_t n;
uint8_t coreId;
/* For ARMC we are using the library method of initializing DATA, Custom Section and
* Code RAM sections so the below variables are not needed */
#if !defined(__ARMCC_VERSION)
/* Declare pointers for various data sections. These pointers
* are initialized using values pulled in from the linker file */
uint8_t * data_ram;
uint8_t * code_ram;
uint8_t * bss_start;
uint8_t * custom_ram;
const uint8_t * data_rom, * data_rom_end;
const uint8_t * code_rom, * code_rom_end;
const uint8_t * bss_end;
const uint8_t * custom_rom, * custom_rom_end;
#endif
/* Addresses for VECTOR_TABLE and VECTOR_RAM come from the linker file */
#if defined(__ARMCC_VERSION)
extern uint32_t __RAM_VECTOR_TABLE_SIZE;
extern uint32_t __VECTOR_ROM;
extern uint32_t __VECTOR_RAM;
#else
extern uint32_t __RAM_VECTOR_TABLE_SIZE[];
extern uint32_t __VECTOR_TABLE[];
extern uint32_t __VECTOR_RAM[];
#endif
/* Get section information from linker files */
#if defined(__ICCARM__)
/* Data */
data_ram = __section_begin(".data");
data_rom = __section_begin(".data_init");
data_rom_end = __section_end(".data_init");
/* CODE RAM */
#pragma section = "__CODE_ROM"
#pragma section = "__CODE_RAM"
code_ram = __section_begin("__CODE_RAM");
code_rom = __section_begin("__CODE_ROM");
code_rom_end = __section_end("__CODE_ROM");
/* BSS */
bss_start = __section_begin(".bss");
bss_end = __section_end(".bss");
custom_ram = __section_begin(".customSection");
custom_rom = __section_begin(".customSection_init");
custom_rom_end = __section_end(".customSection_init");
#elif defined (__ARMCC_VERSION)
/* VECTOR TABLE*/
uint8_t * vector_table_size = (uint8_t *)__RAM_VECTOR_TABLE_SIZE;
uint32_t * vector_rom = (uint32_t *)__VECTOR_ROM;
uint32_t * vector_ram = (uint32_t *)__VECTOR_RAM;
#else
extern uint32_t __DATA_ROM[];
extern uint32_t __DATA_RAM[];
extern uint32_t __DATA_END[];
extern uint32_t __CODE_RAM[];
extern uint32_t __CODE_ROM[];
extern uint32_t __CODE_END[];
extern uint32_t __BSS_START[];
extern uint32_t __BSS_END[];
extern uint32_t __CUSTOM_ROM[];
extern uint32_t __CUSTOM_END[];
/* Data */
data_ram = (uint8_t *)__DATA_RAM;
data_rom = (uint8_t *)__DATA_ROM;
data_rom_end = (uint8_t *)__DATA_END;
/* CODE RAM */
code_ram = (uint8_t *)__CODE_RAM;
code_rom = (uint8_t *)__CODE_ROM;
code_rom_end = (uint8_t *)__CODE_END;
/* BSS */
bss_start = (uint8_t *)__BSS_START;
bss_end = (uint8_t *)__BSS_END;
/* Custom section */
custom_ram = CUSTOMSECTION_SECTION_START;
custom_rom = (uint8_t *)__CUSTOM_ROM;
custom_rom_end = (uint8_t *)__CUSTOM_END;
#endif
#if !defined(__ARMCC_VERSION)
/* Copy initialized data from ROM to RAM */
while (data_rom_end != data_rom)
{
*data_ram = *data_rom;
data_ram++;
data_rom++;
}
/* Copy functions from ROM to RAM */
while (code_rom_end != code_rom)
{
*code_ram = *code_rom;
code_ram++;
code_rom++;
}
/* Clear the zero-initialized data section */
while(bss_end != bss_start)
{
*bss_start = 0;
bss_start++;
}
/* Copy customsection rom to ram */
while(custom_rom_end != custom_rom)
{
*custom_ram = *custom_rom;
custom_rom++;
custom_ram++;
}
#endif
coreId = (uint8_t)GET_CORE_ID();
#if defined (__ARMCC_VERSION)
/* Copy the vector table from ROM to RAM */
/* Workaround */
for (n = 0; n < (((uint32_t)(vector_table_size))/sizeof(uint32_t)); n++)
{
vector_ram[n] = vector_rom[n];
}
/* Point the VTOR to the position of vector table */
*s_vectors[coreId] = (uint32_t) __VECTOR_RAM;
#else
/* Check if VECTOR_TABLE copy is needed */
if (__VECTOR_RAM != __VECTOR_TABLE)
{
/* Copy the vector table from ROM to RAM */
for (n = 0; n < (((uint32_t)__RAM_VECTOR_TABLE_SIZE)/sizeof(uint32_t)); n++)
{
__VECTOR_RAM[n] = __VECTOR_TABLE[n];
}
/* Point the VTOR to the position of vector table */
*s_vectors[coreId] = (uint32_t)__VECTOR_RAM;
}
else
{
/* Point the VTOR to the position of vector table */
*s_vectors[coreId] = (uint32_t)__VECTOR_TABLE;
}
#endif
}
/*******************************************************************************
* EOF
******************************************************************************/

View File

@ -0,0 +1,133 @@
/*
* Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc.
* Copyright 2016-2019 NXP
* All rights reserved.
*
* THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef STARTUP_H
#define STARTUP_H
#include <stdint.h>
#include "device_registers.h"
/**
* @page misra_violations MISRA-C:2012 violations
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 2.5, Local macro not referenced.
* The defined macro is used as include guard.
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block
* scope if its identifier only appears in a single function.
* All variables with this problem are defined in the linker files.
*
*/
/*******************************************************************************
* API
******************************************************************************/
/*!
* @brief define symbols that specific start and end addres of some basic sections.
*/
#if (defined(S32K14x_SERIES) || defined(S32K11x_SERIES) || defined(S32V234_SERIES) || defined(MPC574x_SERIES) || defined(S32R_SERIES) || defined(S32MTV_SERIES) || defined(SJA1110_SERIES)) || defined (S32K144W_M4_SERIES)
#if (defined(__ICCARM__))
#define INTERRUPTS_SECTION_START __section_begin(".intvec")
#define INTERRUPTS_SECTION_END __section_end(".intvec")
#define BSS_SECTION_START __section_begin(".bss")
#define BSS_SECTION_END __section_end(".bss")
#define DATA_SECTION_START __section_begin(".data")
#define DATA_SECTION_END __section_end(".data")
#define CUSTOMSECTION_SECTION_START __section_begin(".customSection")
#define CUSTOMSECTION_SECTION_END __section_end(".customSection")
#define CODE_RAM_SECTION_START __section_begin("__CODE_RAM")
#define CODE_RAM_SECTION_END __section_end("__CODE_RAM")
#define DATA_INIT_SECTION_START __section_begin(".data_init")
#define DATA_INIT_SECTION_END __section_end(".data_init")
#define CODE_ROM_SECTION_START __section_begin("__CODE_ROM")
#define CODE_ROM_SECTION_END __section_end("__CODE_ROM")
#elif (defined(__ARMCC_VERSION))
#define INTERRUPTS_SECTION_START (uint8_t *)__VECTOR_ROM_START
#define INTERRUPTS_SECTION_END (uint8_t *)__VECTOR_ROM_END
#define BSS_SECTION_START (uint8_t *)__BSS_START
#define BSS_SECTION_END (uint8_t *)__BSS_END
#define DATA_SECTION_START (uint8_t *)__DATA_RAM_START
#define DATA_SECTION_END (uint8_t *)__DATA_RAM_END
#define CUSTOMSECTION_SECTION_START (uint8_t *)__CUSTOM_SECTION_START
#define CUSTOMSECTION_SECTION_END (uint8_t *)__CUSTOM_SECTION_END
#define CODE_RAM_SECTION_START (uint8_t *)__CODE_RAM_START
#define CODE_RAM_SECTION_END (uint8_t *)__CODE_RAM_END
extern uint32_t __VECTOR_ROM_START;
extern uint32_t __VECTOR_ROM_END;
extern uint32_t __BSS_START;
extern uint32_t __BSS_END;
extern uint32_t __DATA_RAM_START;
extern uint32_t __DATA_RAM_END;
extern uint32_t __CUSTOM_SECTION_START;
extern uint32_t __CUSTOM_SECTION_END;
extern uint32_t __CODE_RAM_START;
extern uint32_t __CODE_RAM_END;
#else
#define INTERRUPTS_SECTION_START (uint8_t *)&__interrupts_start__
#define INTERRUPTS_SECTION_END (uint8_t *)&__interrupts_end__
#define BSS_SECTION_START (uint8_t *)&__bss_start__
#define BSS_SECTION_END (uint8_t *)&__bss_end__
#define DATA_SECTION_START (uint8_t *)&__data_start__
#define DATA_SECTION_END (uint8_t *)&__data_end__
#define CUSTOMSECTION_SECTION_START (uint8_t *)&__customSection_start__
#define CUSTOMSECTION_SECTION_END (uint8_t *)&__customSection_end__
#define CODE_RAM_SECTION_START (uint8_t *)&__code_ram_start__
#define CODE_RAM_SECTION_END (uint8_t *)&__code_ram_end__
extern uint32_t __interrupts_start__;
extern uint32_t __interrupts_end__;
extern uint32_t __bss_start__;
extern uint32_t __bss_end__;
extern uint32_t __data_start__;
extern uint32_t __data_end__;
extern uint32_t __customSection_start__;
extern uint32_t __customSection_end__;
extern uint32_t __code_ram_start__;
extern uint32_t __code_ram_end__;
#endif
#endif
#if (defined(__ICCARM__))
#pragma section = ".data"
#pragma section = ".data_init"
#pragma section = ".bss"
#pragma section = ".intvec"
#pragma section = ".customSection"
#pragma section = ".customSection_init"
#pragma section = "__CODE_RAM"
#pragma section = "__CODE_ROM"
#endif
/*!
* @brief Make necessary initializations for RAM.
*
* - Copy initialized data from ROM to RAM.
* - Clear the zero-initialized data section.
* - Copy the vector table from ROM to RAM. This could be an option.
*/
void init_data_bss(void);
#endif /* STARTUP_H*/
/*******************************************************************************
* EOF
******************************************************************************/

View File

@ -0,0 +1,197 @@
/*
* Copyright (c) 2015 Freescale Semiconductor, Inc.
* Copyright 2016-2017 NXP
* All rights reserved.
*
* THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @page misra_violations MISRA-C:2012 violations
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block
* scope if its identifier only appears in a single function.
* An object with static storage duration declared at block scope cannot be
* accessed directly from outside the block.
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 11.4, A conversion should not be performed
* between a pointer to object and an integer type.
* The cast is required to initialize a pointer with an unsigned int define,
* representing an address.
*
* @section [global]
* Violates MISRA 2012 Required Rule 11.6, A cast shall not be performed
* between pointer to void and an arithmetic type.
* The cast is required to initialize a pointer with an unsigned int define,
* representing an address.
*
* @section [global]
* Violates MISRA 2012 Advisory Rule 8.7, External could be made static.
* Function is defined for usage by application code.
*
*/
#include "device_registers.h"
#include "system_S32K144.h"
#include "stdbool.h"
/* ----------------------------------------------------------------------------
-- Core clock
---------------------------------------------------------------------------- */
uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK;
/*FUNCTION**********************************************************************
*
* Function Name : SystemInit
* Description : This function disables the watchdog, enables FPU
* and the power mode protection if the corresponding feature macro
* is enabled. SystemInit is called from startup_device file.
*
* Implements : SystemInit_Activity
*END**************************************************************************/
void SystemInit(void)
{
/**************************************************************************/
/* FPU ENABLE*/
/**************************************************************************/
#ifdef ENABLE_FPU
/* Enable CP10 and CP11 coprocessors */
S32_SCB->CPACR |= (S32_SCB_CPACR_CP10_MASK | S32_SCB_CPACR_CP11_MASK);
#ifdef ERRATA_E6940
/* Disable lazy context save of floating point state by clearing LSPEN bit
* Workaround for errata e6940 */
S32_SCB->FPCCR &= ~(S32_SCB_FPCCR_LSPEN_MASK);
#endif
#endif /* ENABLE_FPU */
/**************************************************************************/
/* WDOG DISABLE*/
/**************************************************************************/
#if (DISABLE_WDOG)
/* Write of the WDOG unlock key to CNT register, must be done in order to allow any modifications*/
WDOG->CNT = (uint32_t ) FEATURE_WDOG_UNLOCK_VALUE;
/* The dummy read is used in order to make sure that the WDOG registers will be configured only
* after the write of the unlock value was completed. */
(void)WDOG->CNT;
/* Initial write of WDOG configuration register:
* enables support for 32-bit refresh/unlock command write words,
* clock select from LPO, update enable, watchdog disabled */
WDOG->CS = (uint32_t ) ( (1UL << WDOG_CS_CMD32EN_SHIFT) |
(FEATURE_WDOG_CLK_FROM_LPO << WDOG_CS_CLK_SHIFT) |
(0U << WDOG_CS_EN_SHIFT) |
(1U << WDOG_CS_UPDATE_SHIFT) );
/* Configure timeout */
WDOG->TOVAL = (uint32_t )0xFFFF;
#endif /* (DISABLE_WDOG) */
/**************************************************************************/
/* ENABLE CACHE */
/**************************************************************************/
#if defined(I_CACHE) && (ICACHE_ENABLE == 1)
/* Invalidate and enable code cache */
LMEM->PCCCR = LMEM_PCCCR_INVW0(1) | LMEM_PCCCR_INVW1(1) | LMEM_PCCCR_GO(1) | LMEM_PCCCR_ENCACHE(1);
#endif /* defined(I_CACHE) && (ICACHE_ENABLE == 1) */
}
/*FUNCTION**********************************************************************
*
* Function Name : SystemCoreClockUpdate
* Description : This function must be called whenever the core clock is changed
* during program execution. It evaluates the clock register settings and calculates
* the current core clock.
*
* Implements : SystemCoreClockUpdate_Activity
*END**************************************************************************/
void SystemCoreClockUpdate(void)
{
uint32_t SCGOUTClock = 0U; /* Variable to store output clock frequency of the SCG module */
uint32_t regValue; /* Temporary variable */
uint32_t divider, prediv, multi;
bool validSystemClockSource = true;
static const uint32_t fircFreq[] = {
FEATURE_SCG_FIRC_FREQ0,
};
divider = ((SCG->CSR & SCG_CSR_DIVCORE_MASK) >> SCG_CSR_DIVCORE_SHIFT) + 1U;
switch ((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT) {
case 0x1:
/* System OSC */
SCGOUTClock = CPU_XTAL_CLK_HZ;
break;
case 0x2:
/* Slow IRC */
regValue = (SCG->SIRCCFG & SCG_SIRCCFG_RANGE_MASK) >> SCG_SIRCCFG_RANGE_SHIFT;
if (regValue != 0U)
{
SCGOUTClock = FEATURE_SCG_SIRC_HIGH_RANGE_FREQ;
}
break;
case 0x3:
/* Fast IRC */
regValue = (SCG->FIRCCFG & SCG_FIRCCFG_RANGE_MASK) >> SCG_FIRCCFG_RANGE_SHIFT;
SCGOUTClock= fircFreq[regValue];
break;
case 0x6:
/* System PLL */
SCGOUTClock = CPU_XTAL_CLK_HZ;
prediv = ((SCG->SPLLCFG & SCG_SPLLCFG_PREDIV_MASK) >> SCG_SPLLCFG_PREDIV_SHIFT) + 1U;
multi = ((SCG->SPLLCFG & SCG_SPLLCFG_MULT_MASK) >> SCG_SPLLCFG_MULT_SHIFT) + 16U;
SCGOUTClock = SCGOUTClock * multi / (prediv * 2U);
break;
default:
validSystemClockSource = false;
break;
}
if (validSystemClockSource == true) {
SystemCoreClock = (SCGOUTClock / divider);
}
}
/*FUNCTION**********************************************************************
*
* Function Name : SystemSoftwareReset
* Description : This function is used to initiate a system reset
*
* Implements : SystemSoftwareReset_Activity
*END**************************************************************************/
void SystemSoftwareReset(void)
{
uint32_t regValue;
/* Read Application Interrupt and Reset Control Register */
regValue = S32_SCB->AIRCR;
/* Clear register key */
regValue &= ~( S32_SCB_AIRCR_VECTKEY_MASK);
/* Configure System reset request bit and Register Key */
regValue |= S32_SCB_AIRCR_VECTKEY(FEATURE_SCB_VECTKEY);
regValue |= S32_SCB_AIRCR_SYSRESETREQ(0x1u);
/* Write computed register value */
S32_SCB->AIRCR = regValue;
}
/*******************************************************************************
* EOF
******************************************************************************/

View File

@ -0,0 +1,111 @@
/*
* Copyright (c) 2015 Freescale Semiconductor, Inc.
* Copyright 2016-2017 NXP
* All rights reserved.
*
* THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
/*! @addtogroup soc_support_S32K144*/
/*! @{*/
/*!
* @file system_S32K144.h
* @brief Device specific configuration file for S32K144
*/
#ifndef SYSTEM_S32K144_H_
#define SYSTEM_S32K144_H_ /**< Symbol preventing repeated inclusion */
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/******************************************************************************
* CPU Settings.
*****************************************************************************/
/* Watchdog disable */
#ifndef DISABLE_WDOG
#define DISABLE_WDOG 1
#endif
/* Cache enablement */
#ifndef ICACHE_ENABLE
#define ICACHE_ENABLE 0
#endif
/* Value of the external crystal or oscillator clock frequency in Hz */
#ifndef CPU_XTAL_CLK_HZ
#define CPU_XTAL_CLK_HZ 8000000u
#endif
/* Value of the fast internal oscillator clock frequency in Hz */
#ifndef CPU_INT_FAST_CLK_HZ
#define CPU_INT_FAST_CLK_HZ 48000000u
#endif
/* Default System clock value */
#ifndef DEFAULT_SYSTEM_CLOCK
#define DEFAULT_SYSTEM_CLOCK 48000000u
#endif
/**
* @brief System clock frequency (core clock)
*
* The system clock frequency supplied to the SysTick timer and the processor
* core clock. This variable can be used by the user application to setup the
* SysTick timer or configure other parameters. It may also be used by debugger to
* query the frequency of the debug timer or configure the trace clock speed
* SystemCoreClock is initialized with a correct predefined value.
*/
extern uint32_t SystemCoreClock;
/**
* @brief Setup the SoC.
*
* This function disables the watchdog, enables FPU.
* if the corresponding feature macro is enabled.
* SystemInit is called from startup_device file.
*/
void SystemInit(void);
/**
* @brief Updates the SystemCoreClock variable.
*
* It must be called whenever the core clock is changed during program
* execution. SystemCoreClockUpdate() evaluates the clock register settings and calculates
* the current core clock.
* This function must be called when user does not want to use clock manager component.
* If clock manager is used, the CLOCK_SYS_GetFreq function must be used with CORE_CLOCK
* parameter.
*
*/
void SystemCoreClockUpdate(void);
/**
* @brief Initiates a system reset.
*
* This function is used to initiate a system reset
*/
void SystemSoftwareReset(void);
#ifdef __cplusplus
}
#endif
/*! @}*/
#endif /* #if !defined(SYSTEM_S32K144_H_) */

View File

@ -0,0 +1,204 @@
/************************************************************************************//**
* \file Demo/ARMCM4_S32K14_S32K144EVB_IAR/Prog/main.c
* \brief Demo program application source file.
* \ingroup Prog_ARMCM4_S32K14_S32K144EVB_IAR
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
/****************************************************************************************
* Include files
****************************************************************************************/
#include "header.h" /* generic header */
/****************************************************************************************
* Function prototypes
****************************************************************************************/
static void Init(void);
static void SystemClockConfig(void);
/************************************************************************************//**
** \brief This is the entry point for the bootloader application and is called
** by the reset interrupt vector after the C-startup routines executed.
** \return none.
**
****************************************************************************************/
void main(void)
{
/* Initialize the microcontroller. */
Init();
/* Initialize the bootloader interface */
BootComInit();
/* Start the infinite program loop. */
while (1)
{
/* Toggle LED with a fixed frequency. */
LedToggle();
/* Check for bootloader activation request */
BootComCheckActivationRequest();
}
} /*** end of main ***/
/************************************************************************************//**
** \brief Initializes the microcontroller.
** \return none.
**
****************************************************************************************/
static void Init(void)
{
/* Configure the system clock. */
SystemClockConfig();
/* Enable the peripheral clock for the ports that are used. */
PCC->PCCn[PCC_PORTC_INDEX] |= PCC_PCCn_CGC_MASK;
PCC->PCCn[PCC_PORTD_INDEX] |= PCC_PCCn_CGC_MASK;
PCC->PCCn[PCC_PORTE_INDEX] |= PCC_PCCn_CGC_MASK;
#if (BOOT_COM_RS232_ENABLE > 0)
/* UART RX GPIO pin configuration. PC6 = UART1 RX, MUX = ALT2. */
PORTC->PCR[6] |= PORT_PCR_MUX(2);
/* UART TX GPIO pin configuration. PC7 = UART1 TX, MUX = ALT2. */
PORTC->PCR[7] |= PORT_PCR_MUX(2);
#endif
#if (BOOT_COM_CAN_ENABLE > 0)
/* CAN RX GPIO pin configuration. PE4 = CAN0 RX, MUX = ALT5. */
PORTE->PCR[4] |= PORT_PCR_MUX(5);
/* CAN TX GPIO pin configuration. PE5 = CAN0 TX, MUX = ALT5. */
PORTE->PCR[5] |= PORT_PCR_MUX(5);
#endif
/* Initialize the timer driver. */
TimerInit();
/* Initialize the led driver. */
LedInit();
/* Enable the global interrupts. */
ENABLE_INTERRUPTS();
} /*** end of Init ***/
/************************************************************************************//**
** \brief System Clock Configuration. This code was derived from a S32 Design Studio
** example program. It uses the 8 MHz external crystal as a source for the
** PLL and configures the normal RUN mode for the following clock settings:
** - SPLL_CLK = 160 MHz
** - CORE_CLK = 80 MHz
** - SYS_CLK = 80 MHz
** - BUS_CLK = 40 MHz
** - FLASH_CLK = 26.67 MHz
** - SIRCDIV1_CLK = 8 MHz
** - SIRCDIV2_CLK = 8 MHz
** \return none.
**
****************************************************************************************/
static void SystemClockConfig(void)
{
/* --------- SOSC Initialization (8 MHz) ------------------------------------------- */
/* SOSCDIV1 & SOSCDIV2 =1: divide by 1. */
SCG->SOSCDIV = SCG_SOSCDIV_SOSCDIV1(1) | SCG_SOSCDIV_SOSCDIV2(1);
/* Range=2: Medium freq (SOSC betw 1MHz-8MHz).
* HGO=0: Config xtal osc for low power.
* EREFS=1: Input is external XTAL.
*/
SCG->SOSCCFG = SCG_SOSCCFG_RANGE(2) | SCG_SOSCCFG_EREFS_MASK;
/* Ensure SOSCCSR unlocked. */
while (SCG->SOSCCSR & SCG_SOSCCSR_LK_MASK)
{
;
}
/* LK=0: SOSCCSR can be written.
* SOSCCMRE=0: OSC CLK monitor IRQ if enabled.
* SOSCCM=0: OSC CLK monitor disabled.
* SOSCERCLKEN=0: Sys OSC 3V ERCLK output clk disabled.
* SOSCLPEN=0: Sys OSC disabled in VLP modes.
* SOSCSTEN=0: Sys OSC disabled in Stop modes.
* SOSCEN=1: Enable oscillator.
*/
SCG->SOSCCSR = SCG_SOSCCSR_SOSCEN_MASK;
/* Wait for system OSC clock to become valid. */
while (!(SCG->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK))
{
;
}
/* --------- SPLL Initialization (160 MHz) ----------------------------------------- */
/* Ensure SPLLCSR is unlocked. */
while (SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK)
{
;
}
/* SPLLEN=0: SPLL is disabled (default). */
SCG->SPLLCSR &= ~SCG_SPLLCSR_SPLLEN_MASK;
/* SPLLDIV1 divide by 2 and SPLLDIV2 divide by 4. */
SCG->SPLLDIV |= SCG_SPLLDIV_SPLLDIV1(2) | SCG_SPLLDIV_SPLLDIV2(3);
/* PREDIV=0: Divide SOSC_CLK by 0+1=1.
* MULT=24: Multiply sys pll by 4+24=40.
* SPLL_CLK = 8MHz / 1 * 40 / 2 = 160 MHz.
*/
SCG->SPLLCFG = SCG_SPLLCFG_MULT(24);
/* Ensure SPLLCSR is unlocked. */
while (SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK)
{
;
}
/* LK=0: SPLLCSR can be written.
* SPLLCMRE=0: SPLL CLK monitor IRQ if enabled.
* SPLLCM=0: SPLL CLK monitor disabled.
* SPLLSTEN=0: SPLL disabled in Stop modes.
* SPLLEN=1: Enable SPLL.
*/
SCG->SPLLCSR |= SCG_SPLLCSR_SPLLEN_MASK;
/* Wait for SPLL to become valid. */
while (!(SCG->SPLLCSR & SCG_SPLLCSR_SPLLVLD_MASK))
{
;
}
/* --------- SIRC Initialization --------------------------------------------------- */
/* Slow IRC is enabled with high range (8 MHz) in reset. Enable SIRCDIV2_CLK and
* SIRCDIV1_CLK, divide by 1 = 8MHz asynchronous clock source.
*/
SCG->SIRCDIV = SCG_SIRCDIV_SIRCDIV1(1) | SCG_SIRCDIV_SIRCDIV2(1);
/* --------- Change to normal RUN mode with 8MHz SOSC, 80 MHz PLL ------------------ */
/* Select PLL as clock source.
* DIVCORE=1, div. by 2: Core clock = 160/2 MHz = 80 MHz.
* DIVBUS=1, div. by 2: bus clock = 40 MHz.
* DIVSLOW=2, div. by 2: SCG slow, flash clock= 26 2/3 MHz.
*/
SCG->RCCR= SCG_RCCR_SCS(6) | SCG_RCCR_DIVCORE(1) | SCG_RCCR_DIVBUS(1) |
SCG_RCCR_DIVSLOW(2);
/* Wait until system clock source is SPLL. */
while (((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT ) != 6U)
{
;
}
/* Evaluate the clock register settings and calculates the current core clock. This
* function must be called when the clock manager component is not used.
*/
SystemCoreClockUpdate();
} /*** end of SystemClockConfig ***/
/*********************************** end of main.c *************************************/

View File

@ -0,0 +1,13 @@
/**
\defgroup Prog_ARMCM4_S32K14_S32K144EVB_IAR User Program
\ingroup ARMCM4_S32K14_S32K144EVB_IAR
\brief User Program.
\details The intention of the demo user program is two-fold. (1) To test the
bootloader, you need some sort of firmware to see if you can perform a
firmware update with the bootloader. This program can be used for this
purpose. (2) To make firmware programmable by the bootloader, a few
adjustments to the firmware are required. The demo user program serves as an
example for how these adjustments can be implemented. This demo user program
is a template that can be used as a starting point for creating your own
demo user program.
*/

View File

@ -0,0 +1,693 @@
; ---------------------------------------------------------------------------------------
; @file: startup_S32K144.s
; @purpose: IAR Startup File
; S32K144
; @version: 2.0
; @date: 2017-1-10
; @build: b170107
; ---------------------------------------------------------------------------------------
;
; Copyright (c) 1997 - 2016 , Freescale Semiconductor, Inc.
; Copyright 2016-2017 NXP
; All rights reserved.
;
; THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
; IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
; INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
; STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
; IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
; THE POSSIBILITY OF SUCH DAMAGE.
;
; The modules in this file are included in the libraries, and may be replaced
; by any user-defined modules that define the PUBLIC symbol _program_start or
; a user defined start symbol.
; To override the cstartup defined in the library, simply add your modified
; version to the workbench project.
;
; The vector table is normally located at address 0.
; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
; The name "__vector_table" has special meaning for C-SPY:
; it is where the SP start value is found, and the NVIC vector
; table register (VTOR) is initialized to this address if != 0.
;
; Cortex-M version
;
MODULE ?cstartup
;; Forward declaration of sections.
SECTION CSTACK:DATA:NOROOT(3)
SECTION .intvec:CODE:ROOT(2)
EXTERN main
EXTERN SystemInit
EXTERN init_data_bss
PUBLIC __vector_table
PUBLIC __vector_table_0x1c
PUBLIC __Vectors
PUBLIC __Vectors_End
PUBLIC __Vectors_Size
DATA
__vector_table
DCD sfe(CSTACK)
DCD Reset_Handler
DCD NMI_Handler ;NMI Handler
DCD HardFault_Handler ;Hard Fault Handler
DCD MemManage_Handler ;MPU Fault Handler
DCD BusFault_Handler ;Bus Fault Handler
DCD UsageFault_Handler ;Usage Fault Handler
__vector_table_0x1c
DCD 0 ;Reserved
DCD 0 ;Reserved
DCD 0 ;Reserved
DCD 0 ;Reserved
DCD SVC_Handler ;SVCall Handler
DCD DebugMon_Handler ;Debug Monitor Handler
DCD 0 ;Reserved
DCD PendSV_Handler ;PendSV Handler
DCD SysTick_Handler ;SysTick Handler
;External Interrupts
DCD DMA0_IRQHandler ;DMA channel 0 transfer complete
DCD DMA1_IRQHandler ;DMA channel 1 transfer complete
DCD DMA2_IRQHandler ;DMA channel 2 transfer complete
DCD DMA3_IRQHandler ;DMA channel 3 transfer complete
DCD DMA4_IRQHandler ;DMA channel 4 transfer complete
DCD DMA5_IRQHandler ;DMA channel 5 transfer complete
DCD DMA6_IRQHandler ;DMA channel 6 transfer complete
DCD DMA7_IRQHandler ;DMA channel 7 transfer complete
DCD DMA8_IRQHandler ;DMA channel 8 transfer complete
DCD DMA9_IRQHandler ;DMA channel 9 transfer complete
DCD DMA10_IRQHandler ;DMA channel 10 transfer complete
DCD DMA11_IRQHandler ;DMA channel 11 transfer complete
DCD DMA12_IRQHandler ;DMA channel 12 transfer complete
DCD DMA13_IRQHandler ;DMA channel 13 transfer complete
DCD DMA14_IRQHandler ;DMA channel 14 transfer complete
DCD DMA15_IRQHandler ;DMA channel 15 transfer complete
DCD DMA_Error_IRQHandler ;DMA error interrupt channels 0-15
DCD MCM_IRQHandler ;FPU sources
DCD FTFC_IRQHandler ;FTFC Command complete
DCD Read_Collision_IRQHandler ;FTFC Read collision
DCD LVD_LVW_IRQHandler ;PMC Low voltage detect interrupt
DCD FTFC_Fault_IRQHandler ;FTFC Double bit fault detect
DCD WDOG_EWM_IRQHandler ;Single interrupt vector for WDOG and EWM
DCD RCM_IRQHandler ;RCM Asynchronous Interrupt
DCD LPI2C0_Master_IRQHandler ;LPI2C0 Master Interrupt
DCD LPI2C0_Slave_IRQHandler ;LPI2C0 Slave Interrupt
DCD LPSPI0_IRQHandler ;LPSPI0 Interrupt
DCD LPSPI1_IRQHandler ;LPSPI1 Interrupt
DCD LPSPI2_IRQHandler ;LPSPI2 Interrupt
DCD Reserved45_IRQHandler ;Reserved Interrupt 45
DCD Reserved46_IRQHandler ;Reserved Interrupt 46
DCD LPUART0_RxTx_IRQHandler ;LPUART0 Transmit / Receive Interrupt
DCD Reserved48_IRQHandler ;Reserved Interrupt 48
DCD LPUART1_RxTx_IRQHandler ;LPUART1 Transmit / Receive Interrupt
DCD Reserved50_IRQHandler ;Reserved Interrupt 50
DCD LPUART2_RxTx_IRQHandler ;LPUART2 Transmit / Receive Interrupt
DCD Reserved52_IRQHandler ;Reserved Interrupt 52
DCD Reserved53_IRQHandler ;Reserved Interrupt 53
DCD Reserved54_IRQHandler ;Reserved Interrupt 54
DCD ADC0_IRQHandler ;ADC0 interrupt request.
DCD ADC1_IRQHandler ;ADC1 interrupt request.
DCD CMP0_IRQHandler ;CMP0 interrupt request
DCD Reserved58_IRQHandler ;Reserved Interrupt 58
DCD Reserved59_IRQHandler ;Reserved Interrupt 59
DCD ERM_single_fault_IRQHandler ;ERM single bit error correction
DCD ERM_double_fault_IRQHandler ;ERM double bit error non-correctable
DCD RTC_IRQHandler ;RTC alarm interrupt
DCD RTC_Seconds_IRQHandler ;RTC seconds interrupt
DCD LPIT0_Ch0_IRQHandler ;LPIT0 channel 0 overflow interrupt
DCD LPIT0_Ch1_IRQHandler ;LPIT0 channel 1 overflow interrupt
DCD LPIT0_Ch2_IRQHandler ;LPIT0 channel 2 overflow interrupt
DCD LPIT0_Ch3_IRQHandler ;LPIT0 channel 3 overflow interrupt
DCD PDB0_IRQHandler ;PDB0 interrupt
DCD Reserved69_IRQHandler ;Reserved Interrupt 69
DCD Reserved70_IRQHandler ;Reserved Interrupt 70
DCD Reserved71_IRQHandler ;Reserved Interrupt 71
DCD Reserved72_IRQHandler ;Reserved Interrupt 72
DCD SCG_IRQHandler ;SCG bus interrupt request
DCD LPTMR0_IRQHandler ;LPTIMER interrupt request
DCD PORTA_IRQHandler ;Port A pin detect interrupt
DCD PORTB_IRQHandler ;Port B pin detect interrupt
DCD PORTC_IRQHandler ;Port C pin detect interrupt
DCD PORTD_IRQHandler ;Port D pin detect interrupt
DCD PORTE_IRQHandler ;Port E pin detect interrupt
DCD SWI_IRQHandler ;Software interrupt
DCD Reserved81_IRQHandler ;Reserved Interrupt 81
DCD Reserved82_IRQHandler ;Reserved Interrupt 82
DCD Reserved83_IRQHandler ;Reserved Interrupt 83
DCD PDB1_IRQHandler ;PDB1 interrupt
DCD FLEXIO_IRQHandler ;FlexIO Interrupt
DCD Reserved86_IRQHandler ;Reserved Interrupt 86
DCD Reserved87_IRQHandler ;Reserved Interrupt 87
DCD Reserved88_IRQHandler ;Reserved Interrupt 88
DCD Reserved89_IRQHandler ;Reserved Interrupt 89
DCD Reserved90_IRQHandler ;Reserved Interrupt 90
DCD Reserved91_IRQHandler ;Reserved Interrupt 91
DCD Reserved92_IRQHandler ;Reserved Interrupt 92
DCD Reserved93_IRQHandler ;Reserved Interrupt 93
DCD CAN0_ORed_IRQHandler ;CAN0 OR'ed [Bus Off OR Transmit Warning OR Receive Warning]
DCD CAN0_Error_IRQHandler ;CAN0 Interrupt indicating that errors were detected on the CAN bus
DCD CAN0_Wake_Up_IRQHandler ;CAN0 Interrupt asserted when Pretended Networking operation is enabled, and a valid message matches the selected filter criteria during Low Power mode
DCD CAN0_ORed_0_15_MB_IRQHandler ;CAN0 OR'ed Message buffer (0-15)
DCD CAN0_ORed_16_31_MB_IRQHandler ;CAN0 OR'ed Message buffer (16-31)
DCD Reserved99_IRQHandler ;Reserved Interrupt 99
DCD Reserved100_IRQHandler ;Reserved Interrupt 100
DCD CAN1_ORed_IRQHandler ;CAN1 OR'ed [Bus Off OR Transmit Warning OR Receive Warning]
DCD CAN1_Error_IRQHandler ;CAN1 Interrupt indicating that errors were detected on the CAN bus
DCD Reserved103_IRQHandler ;Reserved Interrupt 103
DCD CAN1_ORed_0_15_MB_IRQHandler ;CAN1 OR'ed Interrupt for Message buffer (0-15)
DCD Reserved105_IRQHandler ;Reserved Interrupt 105
DCD Reserved106_IRQHandler ;Reserved Interrupt 106
DCD Reserved107_IRQHandler ;Reserved Interrupt 107
DCD CAN2_ORed_IRQHandler ;CAN2 OR'ed [Bus Off OR Transmit Warning OR Receive Warning]
DCD CAN2_Error_IRQHandler ;CAN2 Interrupt indicating that errors were detected on the CAN bus
DCD Reserved110_IRQHandler ;Reserved Interrupt 110
DCD CAN2_ORed_0_15_MB_IRQHandler ;CAN2 OR'ed Message buffer (0-15)
DCD Reserved112_IRQHandler ;Reserved Interrupt 112
DCD Reserved113_IRQHandler ;Reserved Interrupt 113
DCD Reserved114_IRQHandler ;Reserved Interrupt 114
DCD FTM0_Ch0_Ch1_IRQHandler ;FTM0 Channel 0 and 1 interrupt
DCD FTM0_Ch2_Ch3_IRQHandler ;FTM0 Channel 2 and 3 interrupt
DCD FTM0_Ch4_Ch5_IRQHandler ;FTM0 Channel 4 and 5 interrupt
DCD FTM0_Ch6_Ch7_IRQHandler ;FTM0 Channel 6 and 7 interrupt
DCD FTM0_Fault_IRQHandler ;FTM0 Fault interrupt
DCD FTM0_Ovf_Reload_IRQHandler ;FTM0 Counter overflow and Reload interrupt
DCD FTM1_Ch0_Ch1_IRQHandler ;FTM1 Channel 0 and 1 interrupt
DCD FTM1_Ch2_Ch3_IRQHandler ;FTM1 Channel 2 and 3 interrupt
DCD FTM1_Ch4_Ch5_IRQHandler ;FTM1 Channel 4 and 5 interrupt
DCD FTM1_Ch6_Ch7_IRQHandler ;FTM1 Channel 6 and 7 interrupt
DCD FTM1_Fault_IRQHandler ;FTM1 Fault interrupt
DCD FTM1_Ovf_Reload_IRQHandler ;FTM1 Counter overflow and Reload interrupt
DCD FTM2_Ch0_Ch1_IRQHandler ;FTM2 Channel 0 and 1 interrupt
DCD FTM2_Ch2_Ch3_IRQHandler ;FTM2 Channel 2 and 3 interrupt
DCD FTM2_Ch4_Ch5_IRQHandler ;FTM2 Channel 4 and 5 interrupt
DCD FTM2_Ch6_Ch7_IRQHandler ;FTM2 Channel 6 and 7 interrupt
DCD FTM2_Fault_IRQHandler ;FTM2 Fault interrupt
DCD FTM2_Ovf_Reload_IRQHandler ;FTM2 Counter overflow and Reload interrupt
DCD FTM3_Ch0_Ch1_IRQHandler ;FTM3 Channel 0 and 1 interrupt
DCD FTM3_Ch2_Ch3_IRQHandler ;FTM3 Channel 2 and 3 interrupt
DCD FTM3_Ch4_Ch5_IRQHandler ;FTM3 Channel 4 and 5 interrupt
DCD FTM3_Ch6_Ch7_IRQHandler ;FTM3 Channel 6 and 7 interrupt
DCD FTM3_Fault_IRQHandler ;FTM3 Fault interrupt
DCD FTM3_Ovf_Reload_IRQHandler ;FTM3 Counter overflow and Reload interrupt
DCD DefaultISR ;139
DCD DefaultISR ;140
DCD DefaultISR ;141
DCD DefaultISR ;142
DCD DefaultISR ;143
DCD DefaultISR ;144
DCD DefaultISR ;145
DCD DefaultISR ;146
DCD DefaultISR ;147
DCD DefaultISR ;148
DCD DefaultISR ;149
DCD DefaultISR ;150
DCD DefaultISR ;151
DCD DefaultISR ;152
DCD DefaultISR ;153
DCD DefaultISR ;154
DCD DefaultISR ;155
DCD DefaultISR ;156
DCD DefaultISR ;157
DCD DefaultISR ;158
DCD DefaultISR ;159
DCD DefaultISR ;160
DCD DefaultISR ;161
DCD DefaultISR ;162
DCD DefaultISR ;163
DCD DefaultISR ;164
DCD DefaultISR ;165
DCD DefaultISR ;166
DCD DefaultISR ;167
DCD DefaultISR ;168
DCD DefaultISR ;169
DCD DefaultISR ;170
DCD DefaultISR ;171
DCD DefaultISR ;172
DCD DefaultISR ;173
DCD DefaultISR ;174
DCD DefaultISR ;175
DCD DefaultISR ;176
DCD DefaultISR ;177
DCD DefaultISR ;178
DCD DefaultISR ;179
DCD DefaultISR ;180
DCD DefaultISR ;181
DCD DefaultISR ;182
DCD DefaultISR ;183
DCD DefaultISR ;184
DCD DefaultISR ;185
DCD DefaultISR ;186
DCD DefaultISR ;187
DCD DefaultISR ;188
DCD DefaultISR ;189
DCD DefaultISR ;190
DCD DefaultISR ;191
DCD DefaultISR ;192
DCD DefaultISR ;193
DCD DefaultISR ;194
DCD DefaultISR ;195
DCD DefaultISR ;196
DCD DefaultISR ;197
DCD DefaultISR ;198
DCD DefaultISR ;199
DCD DefaultISR ;200
DCD DefaultISR ;201
DCD DefaultISR ;202
DCD DefaultISR ;203
DCD DefaultISR ;204
DCD DefaultISR ;205
DCD DefaultISR ;206
DCD DefaultISR ;207
DCD DefaultISR ;208
DCD DefaultISR ;209
DCD DefaultISR ;210
DCD DefaultISR ;211
DCD DefaultISR ;212
DCD DefaultISR ;213
DCD DefaultISR ;214
DCD DefaultISR ;215
DCD DefaultISR ;216
DCD DefaultISR ;217
DCD DefaultISR ;218
DCD DefaultISR ;219
DCD DefaultISR ;220
DCD DefaultISR ;221
DCD DefaultISR ;222
DCD DefaultISR ;223
DCD DefaultISR ;224
DCD DefaultISR ;225
DCD DefaultISR ;226
DCD DefaultISR ;227
DCD DefaultISR ;228
DCD DefaultISR ;229
DCD DefaultISR ;230
DCD DefaultISR ;231
DCD DefaultISR ;232
DCD DefaultISR ;233
DCD DefaultISR ;234
DCD DefaultISR ;235
DCD DefaultISR ;236
DCD DefaultISR ;237
DCD DefaultISR ;238
DCD DefaultISR ;239
DCD DefaultISR ;240
DCD DefaultISR ;241
DCD DefaultISR ;242
DCD DefaultISR ;243
DCD DefaultISR ;244
DCD DefaultISR ;245
DCD DefaultISR ;246
DCD DefaultISR ;247
DCD DefaultISR ;248
DCD DefaultISR ;249
DCD DefaultISR ;250
DCD DefaultISR ;251
DCD DefaultISR ;252
DCD DefaultISR ;253
DCD 0x55AA11EE ;254 Reserved for OpenBLT checksum
DCD 0xFFFFFFFF ; Reserved for user TRIM value
__Vectors_End
SECTION FlashConfig:CODE
__FlashConfig
DCD 0xFFFFFFFF ; 8 bytes backdoor comparison key
DCD 0xFFFFFFFF ;
DCD 0xFFFFFFFF ; 4 bytes program flash protection bytes
DCD 0xFFFF7FFE ; FDPROT:FEPROT:FOPT:FSEC(0xFE = unsecured)
__FlashConfig_End
__Vectors EQU __vector_table
__Vectors_Size EQU __Vectors_End - __Vectors
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Default interrupt handlers.
;;
THUMB
PUBWEAK Reset_Handler
SECTION .text:CODE:REORDER:NOROOT(2)
Reset_Handler
CPSID I ; Mask interrupts
;; Init the rest of the registers
LDR R1,=0
LDR R2,=0
LDR R3,=0
LDR R4,=0
LDR R5,=0
LDR R6,=0
LDR R7,=0
MOV R8,R7
MOV R9,R7
MOV R10,R7
MOV R11,R7
MOV R12,R7
#ifdef START_FROM_FLASH
IMPORT __RAM_START, __RAM_END
;; INIT ECC RAM
LDR R1, =__RAM_START
LDR R2, =__RAM_END
SUBS R2, R2, R1
SUBS R2, #1
BLE .LC5
MOVS R0, #0
MOVS R3, #4
.LC4:
STR R0, [R1]
ADD R1, R1, R3
SUBS R2, #4
BGE .LC4
.LC5:
#endif
;; Initialize the stack pointer
LDR R0, =sfe(CSTACK)
MOV R13,R0
#ifndef __NO_SYSTEM_INIT
;; Call the CMSIS system init routine
LDR R0, =SystemInit
BLX R0
#endif
;; Init .data and .bss sections
LDR R0, =init_data_bss
BLX R0
CPSIE I ; Unmask interrupts
BL main
JumpToSelf
B JumpToSelf
PUBWEAK NMI_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
NMI_Handler
B .
PUBWEAK HardFault_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
HardFault_Handler
B .
PUBWEAK MemManage_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
MemManage_Handler
B .
PUBWEAK BusFault_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
BusFault_Handler
B .
PUBWEAK UsageFault_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
UsageFault_Handler
B .
PUBWEAK SVC_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
SVC_Handler
B .
PUBWEAK DebugMon_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
DebugMon_Handler
B .
PUBWEAK PendSV_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
PendSV_Handler
B .
PUBWEAK SysTick_Handler
SECTION .text:CODE:REORDER:NOROOT(1)
SysTick_Handler
B .
PUBWEAK DMA0_IRQHandler
PUBWEAK DMA1_IRQHandler
PUBWEAK DMA2_IRQHandler
PUBWEAK DMA3_IRQHandler
PUBWEAK DMA4_IRQHandler
PUBWEAK DMA5_IRQHandler
PUBWEAK DMA6_IRQHandler
PUBWEAK DMA7_IRQHandler
PUBWEAK DMA8_IRQHandler
PUBWEAK DMA9_IRQHandler
PUBWEAK DMA10_IRQHandler
PUBWEAK DMA11_IRQHandler
PUBWEAK DMA12_IRQHandler
PUBWEAK DMA13_IRQHandler
PUBWEAK DMA14_IRQHandler
PUBWEAK DMA15_IRQHandler
PUBWEAK DMA_Error_IRQHandler
PUBWEAK MCM_IRQHandler
PUBWEAK FTFC_IRQHandler
PUBWEAK Read_Collision_IRQHandler
PUBWEAK LVD_LVW_IRQHandler
PUBWEAK FTFC_Fault_IRQHandler
PUBWEAK WDOG_EWM_IRQHandler
PUBWEAK RCM_IRQHandler
PUBWEAK LPI2C0_Master_IRQHandler
PUBWEAK LPI2C0_Slave_IRQHandler
PUBWEAK LPSPI0_IRQHandler
PUBWEAK LPSPI1_IRQHandler
PUBWEAK LPSPI2_IRQHandler
PUBWEAK Reserved45_IRQHandler
PUBWEAK Reserved46_IRQHandler
PUBWEAK LPUART0_RxTx_IRQHandler
PUBWEAK Reserved48_IRQHandler
PUBWEAK LPUART1_RxTx_IRQHandler
PUBWEAK Reserved50_IRQHandler
PUBWEAK LPUART2_RxTx_IRQHandler
PUBWEAK Reserved52_IRQHandler
PUBWEAK Reserved53_IRQHandler
PUBWEAK Reserved54_IRQHandler
PUBWEAK ADC0_IRQHandler
PUBWEAK ADC1_IRQHandler
PUBWEAK CMP0_IRQHandler
PUBWEAK Reserved58_IRQHandler
PUBWEAK Reserved59_IRQHandler
PUBWEAK ERM_single_fault_IRQHandler
PUBWEAK ERM_double_fault_IRQHandler
PUBWEAK RTC_IRQHandler
PUBWEAK RTC_Seconds_IRQHandler
PUBWEAK LPIT0_Ch0_IRQHandler
PUBWEAK LPIT0_Ch1_IRQHandler
PUBWEAK LPIT0_Ch2_IRQHandler
PUBWEAK LPIT0_Ch3_IRQHandler
PUBWEAK PDB0_IRQHandler
PUBWEAK Reserved69_IRQHandler
PUBWEAK Reserved70_IRQHandler
PUBWEAK Reserved71_IRQHandler
PUBWEAK Reserved72_IRQHandler
PUBWEAK SCG_IRQHandler
PUBWEAK LPTMR0_IRQHandler
PUBWEAK PORTA_IRQHandler
PUBWEAK PORTB_IRQHandler
PUBWEAK PORTC_IRQHandler
PUBWEAK PORTD_IRQHandler
PUBWEAK PORTE_IRQHandler
PUBWEAK SWI_IRQHandler
PUBWEAK Reserved81_IRQHandler
PUBWEAK Reserved82_IRQHandler
PUBWEAK Reserved83_IRQHandler
PUBWEAK PDB1_IRQHandler
PUBWEAK FLEXIO_IRQHandler
PUBWEAK Reserved86_IRQHandler
PUBWEAK Reserved87_IRQHandler
PUBWEAK Reserved88_IRQHandler
PUBWEAK Reserved89_IRQHandler
PUBWEAK Reserved90_IRQHandler
PUBWEAK Reserved91_IRQHandler
PUBWEAK Reserved92_IRQHandler
PUBWEAK Reserved93_IRQHandler
PUBWEAK CAN0_ORed_IRQHandler
PUBWEAK CAN0_Error_IRQHandler
PUBWEAK CAN0_Wake_Up_IRQHandler
PUBWEAK CAN0_ORed_0_15_MB_IRQHandler
PUBWEAK CAN0_ORed_16_31_MB_IRQHandler
PUBWEAK Reserved99_IRQHandler
PUBWEAK Reserved100_IRQHandler
PUBWEAK CAN1_ORed_IRQHandler
PUBWEAK CAN1_Error_IRQHandler
PUBWEAK Reserved103_IRQHandler
PUBWEAK CAN1_ORed_0_15_MB_IRQHandler
PUBWEAK Reserved105_IRQHandler
PUBWEAK Reserved106_IRQHandler
PUBWEAK Reserved107_IRQHandler
PUBWEAK CAN2_ORed_IRQHandler
PUBWEAK CAN2_Error_IRQHandler
PUBWEAK Reserved110_IRQHandler
PUBWEAK CAN2_ORed_0_15_MB_IRQHandler
PUBWEAK Reserved112_IRQHandler
PUBWEAK Reserved113_IRQHandler
PUBWEAK Reserved114_IRQHandler
PUBWEAK FTM0_Ch0_Ch1_IRQHandler
PUBWEAK FTM0_Ch2_Ch3_IRQHandler
PUBWEAK FTM0_Ch4_Ch5_IRQHandler
PUBWEAK FTM0_Ch6_Ch7_IRQHandler
PUBWEAK FTM0_Fault_IRQHandler
PUBWEAK FTM0_Ovf_Reload_IRQHandler
PUBWEAK FTM1_Ch0_Ch1_IRQHandler
PUBWEAK FTM1_Ch2_Ch3_IRQHandler
PUBWEAK FTM1_Ch4_Ch5_IRQHandler
PUBWEAK FTM1_Ch6_Ch7_IRQHandler
PUBWEAK FTM1_Fault_IRQHandler
PUBWEAK FTM1_Ovf_Reload_IRQHandler
PUBWEAK FTM2_Ch0_Ch1_IRQHandler
PUBWEAK FTM2_Ch2_Ch3_IRQHandler
PUBWEAK FTM2_Ch4_Ch5_IRQHandler
PUBWEAK FTM2_Ch6_Ch7_IRQHandler
PUBWEAK FTM2_Fault_IRQHandler
PUBWEAK FTM2_Ovf_Reload_IRQHandler
PUBWEAK FTM3_Ch0_Ch1_IRQHandler
PUBWEAK FTM3_Ch2_Ch3_IRQHandler
PUBWEAK FTM3_Ch4_Ch5_IRQHandler
PUBWEAK FTM3_Ch6_Ch7_IRQHandler
PUBWEAK FTM3_Fault_IRQHandler
PUBWEAK FTM3_Ovf_Reload_IRQHandler
PUBWEAK DefaultISR
SECTION .text:CODE:REORDER:NOROOT(1)
DMA0_IRQHandler
DMA1_IRQHandler
DMA2_IRQHandler
DMA3_IRQHandler
DMA4_IRQHandler
DMA5_IRQHandler
DMA6_IRQHandler
DMA7_IRQHandler
DMA8_IRQHandler
DMA9_IRQHandler
DMA10_IRQHandler
DMA11_IRQHandler
DMA12_IRQHandler
DMA13_IRQHandler
DMA14_IRQHandler
DMA15_IRQHandler
DMA_Error_IRQHandler
MCM_IRQHandler
FTFC_IRQHandler
Read_Collision_IRQHandler
LVD_LVW_IRQHandler
FTFC_Fault_IRQHandler
WDOG_EWM_IRQHandler
RCM_IRQHandler
LPI2C0_Master_IRQHandler
LPI2C0_Slave_IRQHandler
LPSPI0_IRQHandler
LPSPI1_IRQHandler
LPSPI2_IRQHandler
Reserved45_IRQHandler
Reserved46_IRQHandler
LPUART0_RxTx_IRQHandler
Reserved48_IRQHandler
LPUART1_RxTx_IRQHandler
Reserved50_IRQHandler
LPUART2_RxTx_IRQHandler
Reserved52_IRQHandler
Reserved53_IRQHandler
Reserved54_IRQHandler
ADC0_IRQHandler
ADC1_IRQHandler
CMP0_IRQHandler
Reserved58_IRQHandler
Reserved59_IRQHandler
ERM_single_fault_IRQHandler
ERM_double_fault_IRQHandler
RTC_IRQHandler
RTC_Seconds_IRQHandler
LPIT0_Ch0_IRQHandler
LPIT0_Ch1_IRQHandler
LPIT0_Ch2_IRQHandler
LPIT0_Ch3_IRQHandler
PDB0_IRQHandler
Reserved69_IRQHandler
Reserved70_IRQHandler
Reserved71_IRQHandler
Reserved72_IRQHandler
SCG_IRQHandler
LPTMR0_IRQHandler
PORTA_IRQHandler
PORTB_IRQHandler
PORTC_IRQHandler
PORTD_IRQHandler
PORTE_IRQHandler
SWI_IRQHandler
Reserved81_IRQHandler
Reserved82_IRQHandler
Reserved83_IRQHandler
PDB1_IRQHandler
FLEXIO_IRQHandler
Reserved86_IRQHandler
Reserved87_IRQHandler
Reserved88_IRQHandler
Reserved89_IRQHandler
Reserved90_IRQHandler
Reserved91_IRQHandler
Reserved92_IRQHandler
Reserved93_IRQHandler
CAN0_ORed_IRQHandler
CAN0_Error_IRQHandler
CAN0_Wake_Up_IRQHandler
CAN0_ORed_0_15_MB_IRQHandler
CAN0_ORed_16_31_MB_IRQHandler
Reserved99_IRQHandler
Reserved100_IRQHandler
CAN1_ORed_IRQHandler
CAN1_Error_IRQHandler
Reserved103_IRQHandler
CAN1_ORed_0_15_MB_IRQHandler
Reserved105_IRQHandler
Reserved106_IRQHandler
Reserved107_IRQHandler
CAN2_ORed_IRQHandler
CAN2_Error_IRQHandler
Reserved110_IRQHandler
CAN2_ORed_0_15_MB_IRQHandler
Reserved112_IRQHandler
Reserved113_IRQHandler
Reserved114_IRQHandler
FTM0_Ch0_Ch1_IRQHandler
FTM0_Ch2_Ch3_IRQHandler
FTM0_Ch4_Ch5_IRQHandler
FTM0_Ch6_Ch7_IRQHandler
FTM0_Fault_IRQHandler
FTM0_Ovf_Reload_IRQHandler
FTM1_Ch0_Ch1_IRQHandler
FTM1_Ch2_Ch3_IRQHandler
FTM1_Ch4_Ch5_IRQHandler
FTM1_Ch6_Ch7_IRQHandler
FTM1_Fault_IRQHandler
FTM1_Ovf_Reload_IRQHandler
FTM2_Ch0_Ch1_IRQHandler
FTM2_Ch2_Ch3_IRQHandler
FTM2_Ch4_Ch5_IRQHandler
FTM2_Ch6_Ch7_IRQHandler
FTM2_Fault_IRQHandler
FTM2_Ovf_Reload_IRQHandler
FTM3_Ch0_Ch1_IRQHandler
FTM3_Ch2_Ch3_IRQHandler
FTM3_Ch4_Ch5_IRQHandler
FTM3_Ch6_Ch7_IRQHandler
FTM3_Fault_IRQHandler
FTM3_Ovf_Reload_IRQHandler
DefaultISR
B DefaultISR
END

View File

@ -0,0 +1,88 @@
/************************************************************************************//**
* \file Demo/ARMCM4_S32K14_S32K144EVB_IAR/Prog/timer.c
* \brief Timer driver source file.
* \ingroup Prog_ARMCM4_S32K14_S32K144EVB_IAR
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
/****************************************************************************************
* Include files
****************************************************************************************/
#include "header.h" /* generic header */
/****************************************************************************************
* Local data declarations
****************************************************************************************/
/** \brief Local variable for storing the number of milliseconds that have elapsed since
* startup.
*/
static unsigned long millisecond_counter;
/************************************************************************************//**
** \brief Initializes the timer.
** \return none.
**
****************************************************************************************/
void TimerInit(void)
{
/* Configure the systick frequency as a 1 ms event generator. */
S32_SysTick->RVR = (SystemCoreClock / 1000U) - 1U;
/* Reset the current counter value. */
S32_SysTick->CVR = 0U;
/* Select core clock as source and enable the timer. */
S32_SysTick->CSR = S32_SysTick_CSR_ENABLE_MASK |
S32_SysTick_CSR_TICKINT_MASK |
S32_SysTick_CSR_CLKSOURCE_MASK;
/* Reset the millisecond counter value. */
millisecond_counter = 0U;
} /*** end of TimerInit ***/
/************************************************************************************//**
** \brief Obtains the counter value of the millisecond timer.
** \return Current value of the millisecond timer.
**
****************************************************************************************/
unsigned long TimerGet(void)
{
/* Read and return the tick counter value. */
return millisecond_counter;
} /*** end of TimerGet ***/
/************************************************************************************//**
** \brief Interrupt service routine of the timer.
** \return none.
**
****************************************************************************************/
void SysTick_Handler(void)
{
/* Increment the millisecond counter. */
millisecond_counter++;
} /*** end of SysTick_Handler ***/
/*********************************** end of timer.c ************************************/

View File

@ -0,0 +1,38 @@
/************************************************************************************//**
* \file Demo/ARMCM4_S32K14_S32K144EVB_IAR/Prog/timer.h
* \brief Timer driver header file.
* \ingroup Prog_ARMCM4_S32K14_S32K144EVB_IAR
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
#ifndef TIMER_H
#define TIMER_H
/****************************************************************************************
* Function prototypes
****************************************************************************************/
void TimerInit(void);
unsigned long TimerGet(void);
#endif /* TIMER_H */
/*********************************** end of timer.h ************************************/

View File

@ -0,0 +1,8 @@
/**
\defgroup ARMCM4_S32K14_S32K144EVB_IAR Demo for S32K144EVB/IAR
\ingroup Demos
\brief Preconfigured programs for the NXP S32K144EVB board and the IAR Embedded
Workbench for ARM.
*/

View File

@ -0,0 +1,59 @@
/************************************************************************************//**
* \file Source/ARMCM4_S32K14/IAR/cpu_comp.c
* \brief Bootloader cpu module source file.
* \ingroup Target_ARMCM4_S32K14
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
/****************************************************************************************
* Include files
****************************************************************************************/
#include "boot.h" /* bootloader generic header */
/************************************************************************************//**
** \brief Disable global interrupts.
** \return none.
**
****************************************************************************************/
void CpuIrqDisable(void)
{
/* Disable the global interrupts. */
__asm("cpsie i");
} /*** end of CpuIrqDisable ***/
/************************************************************************************//**
** \brief Enable global interrupts.
** \return none.
**
****************************************************************************************/
void CpuIrqEnable(void)
{
/* Enable the global interrupts. */
__asm("cpsie i");
} /*** end of CpuIrqEnable ***/
/*********************************** end of cpu_comp.c *********************************/

View File

@ -105,7 +105,7 @@ void Rs232Init(void)
/* Select option 2 as the UART peripheral source clock and enable the clock. Option 2 /* Select option 2 as the UART peripheral source clock and enable the clock. Option 2
* is the SIRCDIV2_CLK, which is available on all peripherals and configurations. * is the SIRCDIV2_CLK, which is available on all peripherals and configurations.
*/ */
PCC->PCCn[PCC_LPUARTx_INDEX] |= PCC_PCCn_PCS(0b010) | PCC_PCCn_CGC_MASK; PCC->PCCn[PCC_LPUARTx_INDEX] |= PCC_PCCn_PCS(2) | PCC_PCCn_CGC_MASK;
/* Obtain the DIV2 divider value of the SIRC_CLK. */ /* Obtain the DIV2 divider value of the SIRC_CLK. */
div2RegValue = (SCG->SIRCDIV & SCG_SIRCDIV_SIRCDIV2_MASK) >> SCG_SIRCDIV_SIRCDIV2_SHIFT; div2RegValue = (SCG->SIRCDIV & SCG_SIRCDIV_SIRCDIV2_MASK) >> SCG_SIRCDIV_SIRCDIV2_SHIFT;
/* Check if the DIV2 register value for SIRC is 0. In this case SIRCDIV2_CLK is /* Check if the DIV2 register value for SIRC is 0. In this case SIRCDIV2_CLK is