рдПрдХ рдХреЙрд░реНрдЯреЗрдХреНрд╕- M0 / M3 / M4 / M7 рдкрд░ рдореЗрдореЛрд░реА рдкрддреЛрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдирд╛

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░!

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


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

рд╕рд╛рдорд╛рдиреНрдп рдореЛрдб рдореЗрдВ, рдЬрдм рдЖрдк рдХреЙрд░реНрдЯреЗрдХреНрд╕-рдПрдо 3 / рдПрдо 4 / рдПрдо 7 рдкрд░ рдЧреИрд░-рдореМрдЬреВрдж рдкрддреЗ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕рдлреЙрд▓реНрдЯ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рд╣рд╛рд░реНрдбрдлреЙрд▓реНрдЯ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдХреЙрд░реНрдЯреЗрдХреНрд╕-рдПрдо 0 рдкрд░ рдХреЛрдИ "рд╡рд┐рд╕реНрддреГрдд" рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИрдВ (рдореЗрдордлреЙрд▓реНрдЯ, рдмрд╕рдлреЙрд▓реНрдЯ, рдпреВрд╕реЗрдЬрдлреЙрд▓реНрдЯ), рдФрд░ рдХреЛрдИ рднреА рд╡рд┐рдлрд▓рддрд╛ рд╣рд╛рд░реНрдбрдлреЙрд▓реНрдЯ рдХреЗ рддреБрд░рдВрдд рдЖрдЧреЗ рдмрдврд╝рддреА рд╣реИред

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

рдХреЛрд░реНрдЯреЗрдХреНрд╕-рдПрдо 3 рдФрд░ рдХреЛрд░реНрдЯреЗрдХреНрд╕-рдПрдо 4: рдЕрдзреВрд░реА рдмрд╕рдлреЙрд▓реНрдЯ


рдХреЛрд░реНрдЯреЗрдХреНрд╕-рдПрдо 3 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдкрд░, рдкрддреЗ рдХреА рд╡реИрдзрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рдЖрдкрдХреЛ FAULTMASK рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ (рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдЧреИрд░-рдореБрдЦреМрдЯрд╛) рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ BusFault рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЪреЗрдХ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдкрддреЗ рдкрд░ рдкреНрд░рд╣рд╛рд░ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ BFAR рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ BFARVALID рдЭрдВрдбрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред , рдпрд╛рдиреА рдмрд╕ рдЧрд▓рддреА рдХрд╛ рдкрддрд╛ рд░рдЬрд┐рд╕реНрдЯрд░ред рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рд▓реЗ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╕рдлреЙрд▓реНрдЯ рдерд╛, рдЕрд░реНрдерд╛рдд рдкрддрд╛ рдЧрд▓рдд рд╣реИред

рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдорд╛рдирдХ (рдЧреИрд░-рд╡рд┐рдХреНрд░реЗрддрд╛) CMSIS рд╕реЗ рд╕рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдФрд░ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХрд┐рд╕реА рднреА M3, M4 рдпрд╛ M7 рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

bool cpu_check_address(volatile const char *address) { /* Cortex-M3, Cortex-M4, Cortex-M4F, Cortex-M7 are supported */ static const uint32_t BFARVALID_MASK = (0x80 << SCB_CFSR_BUSFAULTSR_Pos); bool is_valid = true; /* Clear BFARVALID flag by writing 1 to it */ SCB->CFSR |= BFARVALID_MASK; /* Ignore BusFault by enabling BFHFNMIGN and disabling interrupts */ uint32_t mask = __get_FAULTMASK(); __disable_fault_irq(); SCB->CCR |= SCB_CCR_BFHFNMIGN_Msk; /* probe address in question */ *address; /* Check BFARVALID flag */ if ((SCB->CFSR & BFARVALID_MASK) != 0) { /* Bus Fault occured reading the address */ is_valid = false; } /* Reenable BusFault by clearing BFHFNMIGN */ SCB->CCR &= ~SCB_CCR_BFHFNMIGN_Msk; __set_FAULTMASK(mask); return is_valid; } 

Cortex-M0 рдФрд░ Cortex-M0 +


Cortex-M0 рдФрд░ Cortex-M0 + рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдХрд╣рд╛ рдерд╛, рдЙрдирдХреЗ рдкрд╛рд╕ BusFault рдФрд░ рд╕рднреА рд╕рдВрдмрдВрдзрд┐рдд рд░рдЬрд┐рд╕реНрдЯрд░ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рддреБрд░рдВрдд HardFault рддрдХ рдмрдврд╝рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд░рд╛рд╕реНрддрд╛ рд╣реИ - рд╣рд╛рд░реНрдбрдлреЙрд▓реНрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЕрдкрд╡рд╛рдж рдЬрд╛рдирдмреВрдЭрдХрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдиреЗ рдЗрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛, рд╡рд╣рд╛рдВ рдПрдХ рдЭрдВрдбрд╛ рдЧреБрдЬрд░ рд░рд╣рд╛ рдерд╛ рдЬреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд░реНрдбрдлреЙрд▓реНрдЯ рд╡рд╣рд╛рдВ рдерд╛ред

рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд░рдЬрд┐рд╕реНрдЯрд░ R5 рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ R1 рдФрд░ R2 рдХреЛ рджреЛ "рдореИрдЬрд┐рдХ рдирдВрдмрд░" рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рдпрджрд┐ рд╣рд╛рд░реНрдбрдлреЙрд▓реНрдЯ рдЪреЗрдХ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдкрддреЗ рдкрд░ рдорд╛рди рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдЖрд░ 1 рдФрд░ рдЖрд░ 2 рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрджрд┐ рд╡реЗ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЦреНрдпрд╛рдПрдВ рдкрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрд░ 5 рдХреЛ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред R5 рдХрд╛ рдорд╛рди рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ syshech рдХреЛрдб рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЗрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИ, рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рдЗрдХрдЯреНрдареЗ рд╣реЛрдиреЗ рдХрд╛ рдкрддрд╛ рдирд┐рд╣рд┐рдд рд╣реИ, рд╣рдо рд╕рд┐рд░реНрдл рдпрд╣ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ arm-none-eabi рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ R0 рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред

 bool cpu_check_address(volatile const char *address) { /* Cortex-M0 doesn't have BusFault so we need to catch HardFault */ (void)address; /* R5 will be set to 0 by HardFault handler */ /* to indicate HardFault has occured */ register uint32_t result __asm("r5"); __asm__ volatile ( "ldr r5, =1 \n" /* set default R5 value */ "ldr r1, =0xDEADF00D \n" /* set magic number */ "ldr r2, =0xCAFEBABE \n" /* 2nd magic to be sure */ "ldrb r3, [r0] \n" /* probe address */ ); return result; } 

рдЕрдкрдиреЗ рд╕рд░рд▓рддрдо рд░реВрдк рдореЗрдВ рд╣рд╛рд░реНрдбрдлреЙрд▓реНрдЯ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 __attribute__((naked)) void hard_fault_default(void) { /* Get stack pointer where exception stack frame lies */ __asm__ volatile ( /* decide if we need MSP or PSP stack */ "movs r0, #4 \n" /* r0 = 0x4 */ "mov r2, lr \n" /* r2 = lr */ "tst r2, r0 \n" /* if(lr & 0x4) */ "bne use_psp \n" /* { */ "mrs r0, msp \n" /* r0 = msp */ "b out \n" /* } */ " use_psp: \n" /* else { */ "mrs r0, psp \n" /* r0 = psp */ " out: \n" /* } */ /* catch intended HardFaults on Cortex-M0 to probe memory addresses */ "ldr r1, [r0, #0x04] \n" /* read R1 from the stack */ "ldr r2, =0xDEADF00D \n" /* magic number to be found */ "cmp r1, r2 \n" /* compare with the magic number */ "bne regular_handler \n" /* no magic -> handle as usual */ "ldr r1, [r0, #0x08] \n" /* read R2 from the stack */ "ldr r2, =0xCAFEBABE \n" /* 2nd magic number to be found */ "cmp r1, r2 \n" /* compare with 2nd magic number */ "bne regular_handler \n" /* no magic -> handle as usual */ "ldr r1, [r0, #0x18] \n" /* read PC from the stack */ "add r1, r1, #2 \n" /* move to the next instruction */ "str r1, [r0, #0x18] \n" /* modify PC in the stack */ "ldr r5, =0 \n" /* set R5 to indicate HardFault */ "bx lr \n" /* exit the exception handler */ " regular_handler: \n" /* here comes the rest of the fucking owl */ ) 

рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд░ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдХреНрд╖рдг рдореЗрдВ, рдХреЛрд░реНрдЯреЗрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╕реНрдЯреИрдХ рдкрд░ рд╣реИрдВрдбрд▓рд░ (R0-R3, R12, LR, PC ...) рджреНрд╡рд╛рд░рд╛ рджреВрд╖рд┐рдд рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред рдкрд╣рд▓рд╛ рдЯреБрдХрдбрд╝рд╛ - рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рддреИрдпрд╛рд░ рд╣рд╛рд░реНрдбрдлреЙрд▓реНрдЯ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╣реИ, рд╢реБрджреНрдз рдирдВрдЧреЗ рдзрд╛рддреБ рдХреЗ рдиреАрдЪреЗ рд▓рд┐рдЦреЗ рдЧрдП рд▓реЛрдЧреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ - рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рд╕реНрдЯреИрдХ: рдУрдПрд╕ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдпрд╛ рддреЛ рдПрдордПрд╕рдкреА рдпрд╛ рдкреАрдПрд╕рдкреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрддреЗ рд╣реИрдВред рдирдВрдЧреЗ рдзрд╛рддреБ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ, рдПрдордПрд╕рдкреА рд╕реНрдЯреИрдХ (рдореЗрди рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░) рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдмрд┐рдирд╛ рдЬрд╛рдБрдЪ рдХреЗ - рдХреНрдпреЛрдВрдХрд┐ PSP (рдкреНрд░реЛрд╕реЗрд╕ рд╕реНрдЯреИрдХ рдкреЙрдЗрдВрдЯрд░) рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдЯреИрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдФрд░ R0 рдореЗрдВ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдЗрд╕рдореЗрдВ рд╕реЗ рдорд╛рдиреЛрдВ R1 (рдСрдлрд╕реЗрдЯ 0x04) рдФрд░ R2 (рдСрдлрд╕реЗрдЯ 0x08) рдХреЛ рдкрдврд╝рд╛, рдЬрд╛рджреВ рд╢рдмреНрджреЛрдВ рд╕реЗ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рдпрджрд┐ рджреЛрдиреЛрдВ рдореИрдЪ - рд╣рдо рд╕реНрдЯреИрдХ рд╕реЗ рдкреАрд╕реА рдорд╛рди (рдСрдлрд╕реЗрдЯ 0x18) рдкрдврд╝рддреЗ рд╣реИрдВ, 2 рдЬреЛрдбрд╝реЗрдВ (2 рдмрд╛рдЗрдЯреНрд╕ - рдХреЛрд░реНрдЯреЗрдХреНрд╕-рдПрдо * рдкрд░ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЖрдХрд╛рд░) рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд╕реНрдЯреИрдХ рдкрд░ рд╕рд╣реЗрдЬреЗрдВред рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рд╣рдо рд╣реИрдВрдбрд▓рд░ рд╕реЗ рд▓реМрдЯрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЦреБрдж рдХреЛ рдЙрд╕реА рдирд┐рд░реНрджреЗрд╢ рдкрд░ рдкрд╛рдПрдВрдЧреЗ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрд╡рд╛рдж рдХрд╛ рдХрд╛рд░рдг рдерд╛, рдФрд░ рд╣рдо рд╣рдореЗрд╢рд╛ рд╣рд▓рдХреЛрдВ рдореЗрдВ рдЪрд▓реЗрдВрдЧреЗред рдкрд░рд┐рд╢рд┐рд╖реНрдЯ 2 рд╣рдореЗрдВ рд╡рд╛рдкрд╕реА рдХреЗ рд╕рдордп рдЕрдЧрд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред

* рдЕрджреНрдпрддрдиред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рдХреЙрд░реНрдЯреЗрдХреНрд╕-рдПрдо рдкрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╡рд╛рд▓ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореИрдВ рдпрд╣рд╛рдВ рд╕рд╣реА рдЙрддреНрддрд░ рджреВрдВрдЧрд╛: рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреБрд░реНрдШрдЯрдирд╛ рдХрд╛ рдХрд╛рд░рдг рдПрд▓рдбреАрдЖрд░рдмреА рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рдЬреЛ рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ - 16-рдмрд┐рдЯ рдФрд░ 32-рдмрд┐рдЯ рдореЗрдВ ARMv7-M рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╢рд░реНрдд рдкреВрд░реА рд╣реЛрдиреЗ рдкрд░ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ рдЬрд╛рдПрдЧрд╛:

  • рд▓реЗрдЦрдХ рдиреЗ LDRB рдХреЗ рдмрдЬрд╛рдп рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджреЗрд╢ LDRB рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ред (рд╣рдо рдирд╣реАрдВ рдХрд░рддреЗ)
  • R7 рдХреЗ рдКрдкрд░ рдХреЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рдорд╛рд░реЗ рд▓рд┐рдП - R0 рдФрд░ R3)
  • 31 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдЕрдзрд┐рдХ рдСрдлрд╕реЗрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдСрдлрд╝рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ)


рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ (рдЕрд░реНрдерд╛рдд, рдЬрдм рдСрдкрд░реЗрд╢рдиреНрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЗ 16-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдлрд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ), рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛ 16-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред

рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрд╢рд╛ рдПрдХ 2-рдмрд╛рдЗрдЯ рдЕрдиреБрджреЗрд╢ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рдКрдкрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдХреЛрдб рдХреЛ рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡ рд╣реИрдВред

рдЕрдЧрд▓рд╛, рдЖрд░ 5 рдореЗрдВ 0 рд▓рд┐рдЦреЗрдВ, рдЬреЛ рд╣рд╛рд░реНрдбрдлреЙрд▓реНрдЯ рдореЗрдВ рдЖрдиреЗ рдХреЗ рд╕рдВрдХреЗрддрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред R3 рдХреЗ рдмрд╛рдж рдХреЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдЯреИрдХ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рд╣реИрдВрдбрд▓рд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрд╣рд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЦрд░рд╛рдм рдХрд░рдиреЗ рдпрд╛ рдЦрд░рд╛рдм рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рд╡рд┐рд╡реЗрдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо R5 рдХреЛ 1 рд╕реЗ 0 рддрдХ рдЙрджреНрджреЗрд╢реНрдпрдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВред

рдЗрдВрдЯрд░рдкреНрдЯ рд╣реИрдВрдбрд▓рд░ рд╕реЗ рд╡рд╛рдкрд╕реА рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рддрд░реАрдХреЗ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рди LRC рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ EXC_RETURN рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╣реИрдВрдбрд▓рд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрд╕реА рдкрд░ рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ - рдФрд░ рди рдХреЗрд╡рд▓ рдЗрд╕реЗ рд▓рд┐рдЦреЗрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕реЗ POP рдпрд╛ BX рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрд░реЗрдВ (рдЕрд░реНрдерд╛рдд, "mov pc, lr, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ")ред , рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд╣рд▓реА рдмрд╛рд░ рдпрд╣ рдЖрдкрдХреЛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)ред рдмреАрдПрдХреНрд╕ рдПрд▓рдЖрд░ рдПрдХ рдЕрд░реНрдерд╣реАрди рдкрддреЗ рдкрд░ рдЬрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (рдПрд▓рдЖрд░ рдореЗрдВ 0xFFFFFFF1 рдХреА рддрд░рд╣ рдХреБрдЫ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрддреЗ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреАрд╕реА рдкрд░ рдЗрд╕ рдорд╛рди рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ (рдЬрд╣рд╛рдВ рдпрд╣ рдЬрд╛рдПрдЧрд╛) рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ), рдпрд╣ рд╕реНрдЯреИрдХ рд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдмрд╣рд╛рд▓ рдХрд░реЗрдЧрд╛ рдФрд░ рд╣рдорд╛рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ - рд╣рд╛рд░реНрдбрдлреЙрд▓реНрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЕрдЧрд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╣рдордиреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рд╕реНрдЯреИрдХ рдореЗрдВ рдкреАрд╕реА рдХреЛ 2 рд╕реЗ рдмрдврд╝рд╛ рджрд┐рдпрд╛ рд╣реИред

рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ , рдЬрд╣рд╛рдВ рд╕рднреА рдХрд╛рд░реНрдпрд╛рд▓рдпреЛрдВ рдФрд░ рдЖрджреЗрд╢реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдареАрдХ рд╣реИ, рдпрд╛ рдпрджрд┐ рдореИрдЬрд┐рдХ рдирдВрдмрд░ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ regular_handler рдкрд░ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╕рд╛рдорд╛рдиреНрдп рд╣рд╛рд░реНрдбрдлреЙрд▓реНрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ - рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХрдВрд╕реЛрд▓ рдХреЛ рдорд╛рди рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддрд╛ рд╣реИ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдЖрджрд┐ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддрд╛ рд╣реИред

рд░реИрдо рдЖрдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг


рдЗрд╕ рд╕рдмрдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд░рд▓ рдФрд░ рд╕реАрдзрд╛ рд╣реИред рд╣рдо рдПрдХ рдлрд░реНрдорд╡реЗрдпрд░ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдХрдИ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдорд╛рддреНрд░рд╛ рдореЗрдВ рд░реИрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╣рд░ рдмрд╛рд░ рдПрдХ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд░реИрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП?

рд╣рд╛рдБ рдЖрд╕рд╛рди:

 static uint32_t cpu_find_memory_size(char *base, uint32_t block, uint32_t maxsize) { char *address = base; do { address += block; if (!cpu_check_address(address)) { break; } } while ((uint32_t)(address - base) < maxsize); return (uint32_t)(address - base); } uint32_t get_cpu_ram_size(void) { return cpu_find_memory_size((char *)SRAM_BASE, 4096, 80*1024); } 

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

рдмреВрдЯрд▓реЛрдбрд░ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд╕рдВрдХреНрд░рдордг рдХрд╣реАрдВ рдирд╣реАрдВ рдХреЗ рдмреАрдЪ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ


рдХрднреА-рдХрднреА рдЖрдк рдФрд░ рднреА рдЕрдзрд┐рдХ рдореБрд╢реНрдХрд┐рд▓ рдЪрд╛рд▓реЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдмреВрдЯрд▓реЛрдбрд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рди рдХрд┐рдП рдмрд┐рдирд╛ UART рдпрд╛ USB рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд░реНрдорд╡реЗрдпрд░ рдЕрдкрдбреЗрдЯ рдореЛрдб рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлреИрдХреНрдЯреНрд░реА рдХреЗ рдмреВрдЯрд▓реЛрдбрд░ STM32 рдкрд░ рдХреВрджрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

STM32 рдмреВрдЯрд▓реЛрдбрд░ рд╕рд┐рд╕реНрдЯрдо рдореЗрдореЛрд░реА рдирд╛рдордХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ - рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рди рдХреЗрд╡рд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╡рд┐рднрд┐рдиреНрди рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рд╣реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдореЙрдбрд▓реЛрдВ (рдПрдХ рдорд╣рд╛рдХрд╛рд╡реНрдп рдкреНрд▓реЗрдЯ AN2606 рдкрд░ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ) рдкреЗрдЬ 22 рд╕реЗ 26)ред рдЬрдм рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рддреЛ рдЖрдк рдмрд╣реБрдореБрдЦреА рдкреНрд░рддрд┐рднрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

CMSIS рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ, рд╕рд┐рд╕реНрдЯрдо рдореЗрдореЛрд░реА рдХрд╛ рдкреНрд░рд╛рд░рдВрдн рдкрддрд╛ рднреА рдЧрд╛рдпрдм рд╣реИред рдмреВрдЯрд▓реЛрдбрд░ рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЪрд┐рдХрди рдФрд░ рдЕрдВрдбреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ - рдмреВрдЯрд▓реЛрдбрд░ рдЖрдИрдбреА рд╕рд┐рд╕реНрдЯрдо рдореЗрдореЛрд░реА рдХреЗ рдЕрдВрддрд┐рдо рдмрд╛рдЗрдЯ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдкрддреЗ рдХреЗ рд╕рд╡рд╛рд▓ рдкрд░ рд╡рд╛рдкрд╕ рд▓рд╛рддреА рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░ рд╣рдо STM32 рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджреЗрдЦреЗрдВрдЧреЗ:


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

рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рдХрд▓реНрдк рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдкреНрд░рд╛рд░рдВрдн рдкрддрд╛ рдирд┐рдпрдорд┐рдд CMSIS рд╣реЗрдбрд░ рдореЗрдВ рд╣реИ - рдЗрд╕реЗ рд╡рд╣рд╛рдВ OB_BASE рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдЧреЗ рд╕рд░рд▓ рд╣реИред рд╣рдо рдкрд╣рд▓реЗ рд╡реИрдз рдпрд╛ рдЕрдорд╛рдиреНрдп рдкрддреЗ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдПрдХ рд╕реЗ рдиреАрдЪреЗ:

 char *cpu_find_next_valid_address(char *start, char *stop, bool valid) { char *address = start; while (true) { if (address == stop) { return NULL; } if (cpu_check_address(address) == valid) { return address; } if (stop > start) { address++; } else { address--; } }; return NULL; } 

рдФрд░ рдСрдкреНрд╢рди рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдиреАрдЪреЗ рджреЗрдЦреЗрдВ, рдпрд╛ рддреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдореЛрд░реА рдХрд╛ рдЕрдВрдд, рдпрд╛ рдЗрд╕рд╕реЗ рд╕рдЯреЗ OTP рдХрд╛, рдФрд░ рдлрд┐рд░ рд╕рд┐рд╕реНрдЯрдо рдореЗрдореЛрд░реА рдХреА рд╢реБрд░реБрдЖрдд рджреЛ рдкрд╛рд╕ рдореЗрдВ:

 /* System memory is the valid area next _below_ Option bytes */ char *a, *b, *c; a = (char *)(OB_BASE - 1); b = 0; /* Here we have System memory top address */ c = cpu_find_next_valid_address(a, b, true); /* Here we have System memory bottom address */ c = cpu_find_next_valid_address(c, b, false) + 1; 

рдФрд░ рдмрд╣реБрдд рдХрдард┐рдирд╛рдИ рдХреЗ рдмрд┐рдирд╛, рд╣рдо рдЗрд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдореЛрд░реА рдХреА рд╢реБрд░реБрдЖрдд рдкрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдкрд░ рдХреВрджрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдпрд╣ рдмреВрдЯрд▓реЛрдбрд░ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ:

 static void jump_to_bootloader(void) __attribute__ ((noreturn)); /* Sets up and jumps to the bootloader */ static void jump_to_bootloader(void) { /* System memory is the valid area next _below_ Option bytes */ char *a, *b, *c; a = (char *)(OB_BASE - 1); b = 0; /* Here we have System memory top address */ c = cpu_find_next_valid_address(a, b, true); /* Here we have System memory bottom address */ c = cpu_find_next_valid_address(c, b, false) + 1; if (!c) { NVIC_SystemReset(); } uint32_t boot_addr = (uint32_t)c; uint32_t boot_stack_ptr = *(uint32_t*)(boot_addr); uint32_t dfu_reset_addr = *(uint32_t*)(boot_addr+4); void (*dfu_bootloader)(void) = (void (*))(dfu_reset_addr); /* Reset the stack pointer */ __set_MSP(boot_stack_ptr); dfu_bootloader(); while (1); } 

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

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

PS рдЪреВрдВрдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХреЗ рд╕рднреА рдкрддреЗ 4 рд╕реЗ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ рдХреЗ рдмрдЬрд╛рдп 4 рдмрд╛рдЗрдЯ рдХреЗ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдореЗрдВ рдЙрдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрджрдо рдмрдврд╝рд╛рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рддреЗрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реВрдЪрдирд╛


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

Source: https://habr.com/ru/post/hi437256/


All Articles