STM32 рдХреЗ рд▓рд┐рдП рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдмреВрдЯрд▓реЛрдбрд░

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

рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдереЗ:

  • рдПрд╕рдбреА рдХрд╛рд░реНрдб рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдлрд░реНрдорд╡реЗрдпрд░ рдЕрдкрдбреЗрдЯ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред
  • рдлрд░реНрдорд╡реЗрдпрд░ рдХреА рдЕрдЦрдВрдбрддрд╛ рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдореЛрд░реА рдореЗрдВ рдЧрд▓рдд рдлрд░реНрдорд╡реЗрдпрд░ рдХреА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЛ рдмрд╛рд╣рд░ рдХрд░реЗрдВред
  • рдбрд┐рд╡рд╛рдЗрд╕ рдХреНрд▓реЛрдирд┐рдВрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд░реНрдорд╡реЗрдпрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░реЗрдВред

рдХреЛрдб Keil uVision рдореЗрдВ stdperiph, fatFS, рдФрд░ smallAES рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ STM32F103VET6 рдерд╛, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рджреВрд╕рд░реЗ рдПрд╕рдЯреАрдПрдо рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрдВрдЯреАрдЧреНрд░рд┐рдЯреА рдХрдВрдЯреНрд░реЛрд▓ CRC32 рдПрд▓реНрдЧреЛрд░рд┐рджрдо рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЪреЗрдХрд╕рдо рдлрд░реНрдорд╡реЗрдпрд░ рдлрд╛рдЗрд▓ рдХреЗ рдЕрдВрддрд┐рдо 4 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред

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

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

рдлрд░реНрдорд╡реЗрдпрд░ рдХреЗ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЛ AES128 рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЫреЛрдЯреЗ-рдЫреЛрдЯреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ, рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди .c рдХреЗ рд╕рд╛рде, рджреВрд╕рд░реА рдПрдХреНрд╕рдЯреЗрдВрд╢рди .h рдХреЗ рд╕рд╛рде, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдХрдиреЗрдХреНрд╢рди рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рд▓реЛрдбрд░ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдХрд╛рд░ рдХреЛ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рдореЗрдореЛрд░реА рдкреЗрдЬ рдЖрдХрд╛рд░ рдХреЗ рдЧреБрдгрдХреЛрдВ рдореЗрдВ рдЪреБрдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдмреВрдЯрд▓реЛрдбрд░ 64 Kb рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░реЗрдЧрд╛, рдФрд░ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реЗрд╖ 448 Kb рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░реЗрдЧрд╛ред рдмреВрдЯрд▓реЛрдбрд░ рдлреНрд▓реИрд╢ рдореЗрдореЛрд░реА рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛, рдФрд░ рдмреВрдЯрд▓реЛрдбрд░ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдоред рдЗрд╕реЗ Keil рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдмреВрдЯрд▓реЛрдбрд░ 0x80000000 рдкрддреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ (рдпрд╣ рдЙрд╕рд╕реЗ рд╣реИ рдХрд┐ рдПрд╕рдЯреАрдПрдо 32 рд▓реЙрдиреНрдЪ рдХреЗ рдмрд╛рдж рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ) рдФрд░ 0x10000 рдХрд╛ рдЖрдХрд╛рд░ рд╣реИ, рд╣рдо рдЗрд╕реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред



рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо 0x08010000 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдЧрд╛ рдФрд░ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП 0x08080000 рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдЧрд╛, рд╣рдо рд╕рднреА рдкрддреЗ рдХреЗ рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ:

#define MAIN_PROGRAM_START_ADDRESS 0x08010000 #define MAIN_PROGRAM_END_ADDRESS 0x08080000 

рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреБрдВрдЬреА рдФрд░ рдПрдИрдПрд╕ рдЖрд░рдВрднреАрдХрд░рдг рд╡реЗрдХреНрдЯрд░ рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдпреЗ рдХреБрдВрдЬреА рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВред

 static const uint8_t AES_FW_KEY[] = {0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF, 0xAF}; static const uint8_t AES_IV[] = {0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA}; 

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

 #define FW_START 5 #define FW_READ 1000 #define FW_WRITE 2000 #define FW_FINISH 10000 #define FW_ERROR 100000 

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

 uint32_t t; /*   */ uint32_t fw_step; /*     */ uint32_t fw_buf[512]; /*      */ uint32_t aes_buf[512]; /*       */ /*     Flash-*/ uint32_t idx; /*     */ char tbuf[64]; /*    sprintf */ FATFS FS; /*   fatFS -   */ FIL F; /*   fatFS -  */ case FW_READ: /*   */ { if(f_mount(&FS, "" , 0) == FR_OK) /*   SD-*/ { /* ,     . */ if(f_open(&F, "FIRMWARE.BIN", FA_READ | FA_OPEN_EXISTING) == FR_OK) { f_lseek(&F, 0); /*     */ CRC_ResetDR(); /*    CRC */ lcd_putstr(" ", 1, 0); /*     */ /*        */ idx = MAIN_PROGRAM_START_ADDRESS; fw_step = FW_READ + 10; /*     */ } else {fw_step = FW_FINISH;} /*    -   */ } else {fw_step = FW_FINISH;} /*   SD- -   */ break; } 

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

 case FW_READ + 10: /*      */ { /*     ,    */ sprintf(tbuf, ": %d", idx - MAIN_PROGRAM_START_ADDRESS); lcd_putstr(tbuf, 2, 1); if (idx > MAIN_PROGRAM_END_ADDRESS) /*      */ { f_read(&F, &t, sizeof(t), &idx); /*  4    */ /*   4       CRC */ CRC_CalcCRC(t); if(CRC_GetCRC() == 0) /*   0,     */ { /*         */ idx = MAIN_PROGRAM_START_ADDRESS; f_lseek(&F, 0); /*     */ fw_step = FW_READ + 20; /*     */ break; } else { lcd_putstr(" ", 3, 2); /*     */ fw_step = FW_ERROR; /*       */ break; } } f_read(&F, &fw_buf, sizeof(fw_buf), &t); /*  2      */ if(t != sizeof(fw_buf)) /*     */ { lcd_putstr(" ", 3, 2); fw_step = FW_ERROR; /*       */ break; } /*     */ AES_CBC_decrypt_buffer((uint8_t*)&aes_buf, (uint8_t *)&fw_buf, sizeof(fw_buf), AES_FW_KEY, AES_IV); for(t=0;t<NELEMS(aes_buf);t++) /*     CRC */ { CRC_CalcCRC(aes_buf[t]); /*    4  */ } idx+=sizeof(fw_buf); /*     2  */ break; } 

рдЕрдм, рдпрджрд┐ рдлрд░реНрдорд╡реЗрдпрд░ рдХреНрд╖рддрд┐рдЧреНрд░рд╕реНрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рдЗрд╕реЗ рдлреНрд▓реИрд╢ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦреЗрдВред

 case FW_READ + 20: // Flash Firmware { /*     ,    */ sprintf(tbuf, ": %d", idx - MAIN_PROGRAM_START_ADDRESS); lcd_putstr(tbuf, 4, 2); if (idx > MAIN_PROGRAM_END_ADDRESS) /*     */ { lcd_putstr("", 7, 3); /*     */ f_unlink("FIRMWARE.BIN"); /*     SD- */ fw_step = FW_FINISH; /*   */ break; } f_read(&F, &fw_buf, sizeof(fw_buf), &t); /*   2  */ if(t != sizeof(fw_buf)) /*     */ { lcd_putstr(" ", 3, 3); /*     */ fw_step = FW_ERROR; /*       */ break; } /*     */ AES_CBC_decrypt_buffer((uint8_t*)&aes_buf, (uint8_t *)&fw_buf, sizeof(fw_buf), AES_FW_KEY, AES_IV); FLASH_Unlock(); /*  FLash-   */ FLASH_ErasePage(idx); /*    */ for(t=0;t<sizeof(aes_buf);t+=4) /*    4  */ { FLASH_ProgramWord(idx+t, aes_buf[t/4]); } FLASH_Lock(); /*     */ idx+=sizeof(fw_buf); /*     */ break; } 

рдЕрдм рд╕реБрдВрджрд░рддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдФрд░ рд╕рдлрд▓ рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреНрдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ:

 case FW_ERROR: { /*  -     */ break; } case FW_FINISH: { ExecMainFW(); /*    */ /*      */ break; } 

рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо ExecMainFW () рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ:

 void ExecMainFW() { /*       */ /*    ,     */ /* +4  ,          */ uint32_t jumpAddress = *(__IO uint32_t*) (MAIN_PROGRAM_START_ADDRESS + 4); pFunction Jump_To_Application = (pFunction) jumpAddress; /*    APB1 */ RCC->APB1RSTR = 0xFFFFFFFF; RCC->APB1RSTR = 0x0; /*    APB2 */ RCC->APB2RSTR = 0xFFFFFFFF; RCC->APB2RSTR = 0x0; RCC->APB1ENR = 0x0; /*     APB1 */ RCC->APB2ENR = 0x0; /*     APB2 */ RCC->AHBENR = 0x0; /*     AHB */ /*      ,   HSI*/ RCC_DeInit(); /*   */ __disable_irq(); /*     */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, MAIN_PROGRAM_START_ADDRESS); /*    */ __set_MSP(*(__IO uint32_t*) MAIN_PROGRAM_START_ADDRESS); /*     */ Jump_To_Application(); } 

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

 __disable_irq(); NVIC_SetVectorTable(NVIC_VectTab_FLASH, MAIN_PROGRAM_START_ADDRESS); __enable_irq(); 

рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдЖрдкрдХреЛ рд╕рд╣реА рдкрддреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:



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

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

 case FW_WRITE: { if(f_mount(&FS, "" , 0) == FR_OK) /*   SD-*/ { /*    */ if(f_open(&F, "FIRMWARE.BIN", FA_WRITE | FA_CREATE_ALWAYS) == FR_OK) { CRC_ResetDR(); /*   CRC */ /*        */ idx = MAIN_PROGRAM_START_ADDRESS; fw_step = FW_WRITE + 10; /*     */ } else {fw_step = FW_ERROR;} /*      */ } else {fw_step = FW_ERROR;} /*      */ break; } case FW_WRITE + 10: { if (idx > MAIN_PROGRAM_END_ADDRESS) /*     */ { t = CRC_GetCRC(); f_write(&F, &t, sizeof(t), &idx); /*       */ f_close(&F); /*  ,   */ fw_step = FW_FINISH; /*   */ } /*  2    Flash-   */ memcpy(&fw_buf, (uint32_t *)idx, sizeof(fw_buf)); for(t=0;t<NELEMS(fw_buf);t++) /*  CRC    */ { CRC_CalcCRC(fw_buf[t]); } /*   */ AES_CBC_encrypt_buffer((uint8_t*)&aes_buf, (uint8_t *)&fw_buf, sizeof(fw_buf), AES_FW_KEY, AES_IV); /*      */ f_write(&F, &aes_buf, sizeof(aes_buf), &t); idx+=sizeof(fw_buf); /*     */ break; } 

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

рд╕рдВрджрд░реНрдн


tinyAES
FatFS

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


All Articles