STM32 рднрд╛рдЧ 1: рдореВрд▓ рдмрд╛рддреЗрдВ

рдЖрдк рдЙрд╕ рдХреЛрдб рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЬреЛ рдЖрдкрдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦреБрдж рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдерд╛ред - рдХреЗрди рдереЙрдореНрдкрд╕рди
рд╢рд╛рдпрдж рдореЗрд░реА рдкрд╕рдВрджреАрджрд╛ рдмреЛрд▓реАред рдпрд╣ рд╡рд╣ рдХрд╛рд░рдг рдерд╛ рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдореИрдВрдиреЗ рдЦрд░рдЧреЛрд╢ рдХреЗ рдЫреЗрдж рдХреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЕрдкрдиреА рдпрд╛рддреНрд░рд╛ рд╢реБрд░реВ рдХреА, рдХреЗрд╡рд▓ рдПрдХ рдорд╣реАрдирд╛ рдмреАрдд рдЧрдпрд╛ рдФрд░ рдореИрдВрдиреЗ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдпрд╣ рд╕рдм рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ, Arduina рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдлреЛрдЯреЛ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рд▓реИрдВрдк рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдм рдлреЛрдЯреЛ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдирд╣реАрдВ рдЧрдпрд╛, рдХреЛрдИ рд╕рдордп рдирд╣реАрдВ рд╣реИред рдЙрд╕ рдХреНрд╖рдг рд╕реЗ, рдореИрдВрдиреЗ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрд▓рдЧреНрди рд╣реЛрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред Arduin, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреА рд╕рд╛рджрдЧреА рдореЗрдВ рдЖрдХрд░реНрд╖рдХ рд╣реИ, рдореБрдЭреЗ рдордВрдЪ рдкрд╕рдВрдж рдирд╣реАрдВ рдерд╛ред рдкрд╕рдВрдж рдХрдВрдкрдиреА рдПрд╕рдЯреА рдФрд░ рдЙрдирдХреЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЙрддреНрдкрд╛рджреЛрдВ рдкрд░ рдЧрд┐рд░ рдЧрдИред рдЙрд╕ рд╕рдордп, рдореБрдЭреЗ рдЕрднреА рднреА рдкрддрд╛ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдЕрдВрддрд░ рдХреНрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВрдиреЗ "рдкреНрд░реЛрд╕реЗрд╕рд░" рдХреА рдЧрддрд┐ рдФрд░ рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдХреА рддреБрд▓рдирд╛ рдХреА, рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ STM32F746NG рдбрд┐рд╕реНрдкреНрд▓реЗ - рдбрд┐рд╕реНрдХрд╡рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдмреЛрд░реНрдб рдЦрд░реАрджрд╛редрдореИрдВ рдирд┐рд░рд╛рд╢рд╛ рдХреЗ рдХреНрд╖рдгреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░реВрдВрдЧрд╛ рдФрд░ рдмрд┐рдВрджреБ рдкрд░ рд╕рд╣реА рдЙрддрд░реВрдВрдЧрд╛ред

рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдЫрд╡рд┐ рдореЗрдВ рдбреВрдмреЗ, рдореИрдВрдиреЗ рдмрд╣реБрдд рдкрдврд╝рд╛, рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛, рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ред рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдмрд╕ред рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛, рди рдХрд┐ рдХреЛрдИ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди, рдХреЗрд╡рд▓ рдореЗрд░рд╛ред рдФрд░ рдЕрдЧрд░ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░ рдЧрдпрд╛ рддреЛ рдЖрдк рд╕рдлрд▓ рд╣реЛрдВрдЧреЗред

рдЖрдкрдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдЪрд╛рд╣рд┐рдП, рдЙрд╕рдХреА рд╕реВрдЪреА:

  1. рдЙрдмрдВрдЯреВ 16+ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдпрд╛ рдЬреЛ рднреА рд╣реЛ
  2. рдмрд╛рдВрд╣ рдХрдВрдкрд╛рдЗрд▓рд░ - developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
  3. рдУрдкрди рдбрд┐рдмрдЧрд░ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ - рдЖрдк рд▓рд┐рдВрдХ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ, рд╣рдо рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ, рдирд┐рд░реНрджреЗрд╢ рд╕рдВрд▓рдЧреНрди рд╣реИрдВ

    git clone https://git.code.sf.net/p/openocd/code openocd
  4. рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рдПрдбрд┐рдЯрд░

рд╕рдм рдХреБрдЫ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдЗрдХрдЯреНрдард╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкрд╣рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ! рдФрд░ рдирд╣реАрдВ, рдпрд╣ рдПрдХ рдирд┐рдорд┐рд╖ рдкреНрд░рдХрд╛рд╢ рдмрд▓реНрдм рднреА рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЦреБрдж рд╣реА рдорд╛рдЗрдХреНрд░реЛрд╡реЗрд▓ рдХреА рдЖрд░рдВрднреАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рддрд▓реНрд▓реАрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдпреЗ:

  1. makefile
  2. Linker.ld
  3. Init.c

рдЖрдЗрдП рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдЧреНрд░рд╛рдл Init.c рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдорд╛рд░реЗ рдПрдордХреЗ рдХреЛ рдкрддрд╛ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП "рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░" рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕ рдХрд╛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╣реИ рдЬреЛ PUSH рдФрд░ POP рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЗрди рджреЛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕рднреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рдмрддрд╛рдКрдВрдЧрд╛ред рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдиреАрдЪреЗ рджреЗрдЦреЗрдВред

extern void *_estack;
void *vectors[] __attribute__((section(".isr_vector"), used)) = {
    &_estack
}

рдЕрдм рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдмрд╛рд╣рд░реА рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХ рдмрд╛рд╣рд░реА рд╣реИ, рдФрд░ рд╣рдордиреЗ рдЗрд╕ рдкреНрд░рддреАрдХ рдХреЛ Linker.ld рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдЙрд╕рдореЗрдВ рд▓реМрдЯ рдЖрдПрдВрдЧреЗред

 __attribute__((section(".isr_vector"), used))

рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдВрдХрд▓рдХ рдХреЛ isr_vector рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕рд░рдгреА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрд┐ рдпрджрд┐ рд╣рдо рдХреЛрдб рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднреА рдЗрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЗрд╕рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рд╡рд╣реА рдкреЙрдЗрдВрдЯрд░ рд╣реЛрдЧрд╛ред

рдЕрдм рдпрд╣ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╕рд░рдгреА рдХреНрдпреЛрдВ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрд░реНрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдорд╛рдЗрдХ рд╢реВрдиреНрдп рдкрддреЗ рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕ рд╕рд░рдгреА рдореЗрдВ рдкреЙрдЗрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдкрддреЗ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рдЬрдЯрд┐рд▓ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдПрд░реЗ рдореЗрдВ рдкрд╣рд▓рд╛ рдкреЙрдЗрдВрдЯрд░ рд╣рдореЗрд╢рд╛ рд╕реНрдЯреИрдХ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред рдпрд╣ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреИрдХ 0x20010000 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб 0x0800008 рд╣реИред рдлрд┐рд░ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

void *vectors[] __attribute__((section(".isr_vector"), used)) = {
    0x20010000,
    0x08000008
}

рдпрд╣реА рд╣реИ, рдирд┐рдпрдВрддреНрд░рдХ рдкрд╣рд▓реЗ рд╕реНрдЯреИрдХ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкрд╣рд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдкрддреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛рдЙрдВрдЯрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рдЕрдм рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдореЙрдбрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпреЗ рд╕рдВрдЦреНрдпрд╛ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди stm32f7 рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдореИрдВ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рд╕реЗ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рд░рдгреА 0x08000000 рдкрддреЗ рдкрд░ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЗрд╕ рдкрддреЗ рд╕реЗ рд╣реИ рдХрд┐ mk рдЪрд╛рд▓реВ рдпрд╛ рд░реАрд╕реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЕрдкрдирд╛ рдХрд╛рдо рд╢реБрд░реВ рдХрд░реЗрдЧрд╛ред

рдЕрдм рд╣рдо рд░реЛрдХреЗрдВрдЧреЗ рдФрд░ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рд╕рд░рдгреА рдХреЛ рд╣рдореЗрдВ рдХрд┐рд╕ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд░рдЦрдирд╛ рд╣реИред рдпрд╣ "ld" рдпрд╛ рд▓рд┐рдВрдХрд░ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣рдорд╛рд░реЗ рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдПрдХ рд╕рд╛рде рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХрд░.рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдХрд╛ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реВрдВред

MEMORY{
	ROM_AXIM (rx) : ORIGIN = 0x08000000, LENGTH = 1M
	RAM_DTCM (rwx): ORIGIN = 0x20000000, LENGTH = 64K
}

_estack = LENGTH(RAM_DTCM) + ORIGIN(RAM_DTCM);

SECTIONS{
	.isr_vector : {
	KEEP(*(.isr_vector))
	} >ROM_AXIM</code>
}

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдореЗрдореЛрд░реА рдореЗрдореЛрд░реА рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИ рдФрд░ рдЕрдиреБрднрд╛рдЧ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╣рдо рдЕрдкрдиреЗ _estack рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕реНрдореГрддрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдпреЛрдЧ рдФрд░ рдЙрд╕рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдпрд╛рдиреА рд╣рдорд╛рд░реА рд╕реНрдореГрддрд┐ рдХрд╛ рдЕрдВрддред .Isr_vector рдЕрдиреБрднрд╛рдЧ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдкрдиреА рд╕рд░рдгреА рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдЙрд╕реЗ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред >ROM_AXIMрд╣рдорд╛рд░реЗ рдЦрдВрдб рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕ рдЦрдВрдб рдХреЛ рд╕реНрдореГрддрд┐ рдЦрдВрдб рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рдорд╛рд░реЗ рдорд╛рдЗрдХреНрд░реЛрди рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ 0x08000000 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

рд╣рдордиреЗ рд╡рд╣ рд╕рд░рдгреА рд░рдЦреА рдЬрд╣рд╛рдВ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЕрдм рд╣рдореЗрдВ рдЕрдкрдиреЗ рдорд╛рдЗрдХреНрд░реЛрди рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рддрд░рд╣ рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╕рдВрд╡рд░реНрдзрд┐рдд init.c рд╣реИ:

extern void *_estack;

void Reset_Handler();

void *vectors[] __attribute__((section(".isr_vector"), used)) = {
    &_estack,
    &Reset_Handler
};

void __attribute__((naked, noreturn)) Reset_Handler()
{
    while(1);
}

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рджреВрд╕рд░реЗ рдкрддреЗ рдкрд░ рдкрд╣рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдлрд┐рд░ рд╕реЗ, рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ, рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рдорд╛рди рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░ рдкрд░ рдХрд┐рд╕реА рднреА рдПрдмреАрдЖрдИ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдирдЧреНрди "рдирдЧреНрди"ред рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛ рдЫрд╛рдпрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдм рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдХреНрдпрд╛ рд╣реИред рд╣рдо рдЕрднреА рдХреЗ рд▓рд┐рдП Makefile рдХреЛ рдирд╣реАрдВ рдЫреВрдПрдВрдЧреЗред

arm-none-eabi-gcc -c init.c -o init.o -mthumb

arm-none-eabi-gcc -TLinker.ld -o prog.elf init.o -Wl,--gc-sections -nostartfiles -nodefaultlibs -nostdlib

рдФрд░ рдпрд╣рд╛рдБ рд╣рдо рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВред рдХреНрд░рдо рдореЗрдВ:

  1. -рдордереБрдо armv7 рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рдЕрдВрдЧреВрдареЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
  2. -TLinker.ld рд▓рд┐рдВрдХрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рд▓рд┐рдирдХреНрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ
  3. -Wl, - рдЬреАрд╕реА-рд╕реЗрдХреНрд╢рди -nostartfiles -nodefaultlibs -nostdlib рд╕рднреА рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ, рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реА рдЖрд░рдВрднреАрдХрд░рдг рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдЧрдгрд┐рдд рдЬреИрд╕реЗ рдЕрдиреНрдп рд╕рднреА рд╕рд╣рд╛рдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред

рдмреЗрд╢рдХ, рдЗрд╕реЗ рдорд╛рдЗрдХреНрд░реЛрди рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдмрд╛рдЗрдирд░реА рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рд╕рдордЭ рд╣реИред

objcopy -O ihex prog.elf prog.bin

hexdump prog.bin

рдФрд░ рдлрд┐рд░ рд╣рдо рдирд┐рд╖реНрдХрд░реНрд╖ рджреЗрдЦреЗрдВрдЧреЗред "00000000: 00 01 00 02 09 00 00 08" рдЬреЛ рд╣рдорд╛рд░реА рд╕рдлрд▓рддрд╛ рдХрд╛ рдкреНрд░рддреАрдХ рд╣реИред рдпрд╣ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рд╣реИ рдФрд░ рдореИрдВ рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдФрд░ рд╕рд╛рд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рдХрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд▓реЗ рдореЗрдВ рдореИрдВ рддрдВрддреНрд░ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдФрд░ рд╣рдо рджреЛрд╕реНрддреЛрдВ рдХреЛ рдПрдХ рдРрд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЬрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд╢ рдХреЛ рдЭрдкрдХрд╛рдПрдВрдЧреЗ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдкреНрд░реЛрд╕реЗрд╕рд░ рдФрд░ рдмрд╕реЛрдВ рдХреА рдШрдбрд╝реА рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗред

All Articles