рд╢реБрдн рджреЛрдкрд╣рд░, рдкреНрд░рд┐рдп рдЦрд╛рдмрд░реЛрд╡рд┐рддреНрд╕! рдореИрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЬрдирддрд╛ рдХреЗ рд╕рд╛рдордиреЗ рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - STM32 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдбрд┐рдмрдЧ рдмреЛрд░реНрдб, рд▓реЗрдХрд┐рди рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдлреЙрд░реНрдо рдлреИрдХреНрдЯрд░ рдореЗрдВред рдпрд╣ рдЕрдиреНрдп рдбрд┐рдмрдЧ рдмреЛрд░реНрдбреЛрдВ рд╕реЗ рднрд┐рдиреНрди рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдПрдХ рдЬреНрдпрд╛рдорд┐рддрд┐ рдФрд░ рдПрдХ рд╡рд╛рдпрд░рд▓реЗрд╕ рдореЙрдбреЗрдо рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдИрдПрд╕рдкреА 8266 рдореЙрдбреНрдпреВрд▓ рд╣реИред рдФрд░ рдорд╛рдЗрдХреНрд░реЛ-рдПрд╕рдбреА рдХрд╛рд░реНрдб рдФрд░ рдПрдХ рд╕реНрдЯреАрд░рд┐рдпреЛ рдПрдореНрдкрд▓реАрдлрд╛рдпрд░ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЕрдЪреНрдЫрд╛ рдЬреЛрдбрд╝ред рдЗрд╕ рд╕рднреА рдзрди рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдПрдХ рдбреЗрдореЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо (C ++ 11 рдореЗрдВ) рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ред рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдФрд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рджреЛрдиреЛрдВ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдХреМрди рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рд╢рд╛рдпрдж, рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдЬреЛ рдЗрд╕ рдмреЛрд░реНрдб рдХреЛ рдЦреБрдж рдХреЛ рдорд┐рд▓рд╛рдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЫреЛрдЯреЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рднреА рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдорд╛рдирддрд╛ рд╣реВрдВред рдпрд╣ рдПрдХ рд╢реБрджреНрдз рд╢реМрдХ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдмреЛрд░реНрдб рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд╛рдИрдлрд╛рдИ рдФрд░ рдзреНрд╡рдирд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫреЛрдЯреЗ рдШрд░ рдХреЗ рд╢рд┐рд▓реНрдк рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ рд╣реИред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдореБрдЦреНрдп рдкреНрд░реЗрд░рдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
- STM32 рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╕реМрдВрджрд░реНрдп рд╕рдВрдмрдВрдзреА рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдХрд╛рд░рдг рд╣реИ - рдореБрдЭреЗ рдореВрд▓реНрдп / рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдкрд╛рдд, рдкреНрд▓рд╕ рдмрд╛рд╣реНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛, рдкреНрд▓рд╕ рдирд┐рдпрдВрддреНрд░рдХ рдирд┐рд░реНрдорд╛рддрд╛ (sw4stm, cubeMX, HAL рдкреБрд╕реНрддрдХрд╛рд▓рдп) рд╕реЗ рдПрдХ рдмрдбрд╝рд╛ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд┐рдХрд╛рд╕ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдкрд╕рдВрдж рд╣реИред
- рдмреЗрд╢рдХ, рдирд┐рдпрдВрддреНрд░рдХ рдирд┐рд░реНрдорд╛рддрд╛ рд╕реНрд╡рдпрдВ (рдбрд┐рд╕реНрдХрд╡рд░реА, рдиреНрдпреВрдХреНрд▓рд┐рдпреЛ) рд╕реЗ рдХрдИ рдбрд┐рдмрдЧ рдмреЛрд░реНрдб рд╣реИрдВ, рд╕рд╛рде рд╣реА рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдУрд▓реАрдореЗрдХреНрд╕) рд╕реЗред рд▓реЗрдХрд┐рди рдЕрдкрдиреЗ рдлреЙрд░реНрдо рдлреИрдХреНрдЯрд░ рдореЗрдВ рдШрд░ рдкрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред рдореЗрд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд░рд▓ рджреЛ-рдкрд░рдд рдЯреЛрдкреЛрд▓реЙрдЬреА рдФрд░ рдШрдЯрдХ рд╣реИрдВ рдЬреЛ рдореИрдиреБрдЕрд▓ рд╕реЛрд▓реНрдбрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВред
- рдЙрдирдХреЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЕрдВрджрд░ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХреНрд╕ рдХреА рдирд┐рдореНрди рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рдореБрдЦреМрдЯреЗ рдХреЗ рд▓рд┐рдП рд╕рднреНрдп рдорд╛рдорд▓реЛрдВ рдХреЛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХрдо рд╕реЗ рдХрдо рджреЛ рд▓реЛрдХрдкреНрд░рд┐рдп рдордВрдЪ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╡рд┐рд╡рд┐рдз рдорд╛рдорд▓реЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╣реИ: рдЕрд░реБрдбрд┐рдиреЛ рдФрд░ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИред рдХрдиреЗрдХреНрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдХрдЯрдЖрдЙрдЯ рдХреЗ рд╕реНрдерд╛рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рджреВрд╕рд░рд╛ рдореБрдЭреЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдмреЛрд░реНрдб рдХреА рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЪреБрдирд╛ред
- рдмреЛрд░реНрдб рдкрд░ рдЪрдпрдирд┐рдд рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ USB, SDIO, I2S, рдиреЗрдЯрд╡рд░реНрдХ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдпреЗ рд╡рд╣реА рдЗрдВрдЯрд░рдлреЗрд╕ рдШрд░ рдХреЗ рд╢реМрдХ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реИрдВред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ, рдПрдХ рдорд╛рдирдХ рдмрдВрдзрди рдХреЗ рд╕рд╛рде рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдПрдХ рдпреВрдПрд╕рдмреА рдХрдиреЗрдХреНрдЯрд░, рдПрдХ рдПрд╕рдбреА рдХрд╛рд░реНрдб, рдПрдХ рдСрдбрд┐рдпреЛ рдкрде (рдбрд┐рдЬрд┐рдЯрд▓-рд╕реЗ-рдПрдирд╛рд▓реЙрдЧ рдХрдирд╡рд░реНрдЯрд░ рдФрд░ рдПрдореНрдкрд▓реАрдлрд╛рдпрд░), рд╕рд╛рде рд╣реА рд╕рд╛рде рдИрдПрд╕рдкреА 8266 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╡рд╛рдпрд░рд▓реЗрд╕ рдореЙрдбреНрдпреВрд▓ рднреА рдЬреЛрдбрд╝рд╛ред
рд╕рд░реНрдХрд┐рдЯ рдФрд░ рдШрдЯрдХ
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдмреЛрд░реНрдб рдирд┐рдХрд▓рд╛ рд╣реИ:
- STM32F405RG рдирд┐рдпрдВрддреНрд░рдХ: рдПрдЖрд░рдПрдо 32-рдмрд┐рдЯ рдХреЙрд░реНрдЯреЗрдХреНрд╕-рдПрдо 4 рдПрдХ рдЧрдгрд┐рддреАрдп рдХреЛрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде, 168 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ рддрдХ рдЖрд╡реГрддреНрддрд┐, 1 рдПрдордмреА рдлреНрд▓реИрд╢ рдореЗрдореЛрд░реА, 196 рдЬреАрдмреА рд░реИрдоред


- рдирд┐рдпрдВрддреНрд░рдХ (6 рдкрд┐рди) рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП SWD рдХрдиреЗрдХреНрдЯрд░ред
- рд░рд┐рдмреВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдЯрди рд░реАрд╕реЗрдЯ рдХрд░реЗрдВред
- рддреАрди рд░рдВрдЧ рдХреА рдПрд▓рдИрдбреАред рдПрдХ рддрд░рдл, рддреАрди рдирд┐рдпрдВрддреНрд░рдХ рдкрд┐рди рдЦреЛ рдЬрд╛рддреЗ рд╣реИрдВред рджреВрд╕рд░реА рдУрд░, рд╡реЗ рдЕрднреА рднреА GPIO рдХрдиреЗрдХреНрдЯрд░реНрд╕ рдкрд░ рд╕реАрдорд┐рдд рд╕рдВрдкрд░реНрдХреЛрдВ рдХреЗ рдХрд╛рд░рдг рдЦреЛ рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрд▓рдИрдбреА рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╛рдд рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред
- рдЙрдЪреНрдЪ-рдЖрд╡реГрддреНрддрд┐ рдПрдЪрдПрд╕рдИ (рдХреЛрд░ рдШрдбрд╝реА рдХреЗ рд▓рд┐рдП 16 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ) рдФрд░ рдХрдо-рдЖрд╡реГрддреНрддрд┐ рдПрд▓рдПрд╕рдИ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреА рдШрдбрд╝реА рдХреЗ рд▓рд┐рдП 32.7680 kHz) рдХреНрд╡рд╛рд░реНрдЯреНрдЬред
- 2.54 рдорд┐рдореА рдХреА рдкрд┐рдЪ рд╡рд╛рд▓реА GPIO рдкрд┐рди рдмреНрд░реЗрдбрдмреЛрд░реНрдб рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИред
- рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ рдХреЗ 3.5 рдорд┐рдореА рдСрдбрд┐рдпреЛ рдЬреИрдХ рдХреЗ рд╕реНрдерд╛рди рдкрд░, рдореИрдВрдиреЗ 5-рд╡реЛрд▓реНрдЯ рдкрд╛рд╡рд░ рдХрдиреЗрдХреНрдЯрд░ рдХреЛ рддреИрдирд╛рдд рдХрд┐рдпрд╛ред рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдпрд╣ рдирд┐рд░реНрдгрдп рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдБ рдкреЗрд╢реЗрд╡рд░реЛрдВ рд░рд╣реЗ рд╣реИрдВред рдпреВрдПрд╕рдмреА рдХрдиреЗрдХреНрдЯрд░ рд╕реЗ рдкрд╛рд╡рд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдореМрдЬреВрдж рд╣реИ (рдиреАрдЪреЗ рд╡рд┐рд╡рд░рдг), рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд░реНрдХрд┐рдЯ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдпреВрдПрд╕рдмреА рдкреЛрд░реНрдЯ рдХреЛ рдЬрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рд╕рдордп рдХрд╛рдлреА рдХрдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

- рдорд┐рдиреА-рдпреВрдПрд╕рдмреА рдкреЛрд░реНрдЯ рдПрдХ рдУрд░, рдпрд╣ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдпреВрдПрд╕рдмреА-рдУрдЯреАрдЬреА рдкреЛрд░реНрдЯ рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдЪрд┐рдк STF203-22.TCT рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рджреВрд╕рд░реА рдУрд░, VBUS рдкрд╛рд╡рд░ рдкрд┐рди GPIO рдХрдиреЗрдХреНрдЯрд░ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ + 5V рдкрд┐рди рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдмреЛрд░реНрдб рдпреВрдПрд╕рдмреА рдкреЛрд░реНрдЯ рд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрдЧрд╛ред

- рдХрдареЛрд░рддрд╛ рдХреЗ рд╕рд╛рде рдорд╛рдЗрдХреНрд░реЛ-рдПрд╕рдбреА рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрдЯрд░: 47 k-рдкреБрд▓-рдЕрдк рд░реЗрд╕рд┐рд╕реНрдЯрд░реНрд╕ , рдкрд╛рд╡рд░ рдореИрдиреЗрдЬрдореЗрдВрдЯ рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ ( P-рдЪреИрдирд▓ MOSFET BSH205 ) рдФрд░ рдкрд╛рд╡рд░ рд▓рд╛рдЗрди рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рдЧреНрд░реАрди рдПрд▓рдИрдбреАред

рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рдЧреЗрдЯ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ PA15 рдкрд┐рди рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИред рдпрд╣ рдЬреЗрдЯреАрдбреАрдЖрдИ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрдкрд░реНрдХ рд╣реИ, рдЬреЛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рд╡реЛрд▓реНрдЯреЗрдЬ рдХреЗ рдЙрдЪреНрдЪ рд╕реНрддрд░ (рдкреБрд▓-рдЕрдк) рдХреЗ рд╕рд╛рде рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП JTAG рдХреЗ рдмрдЬрд╛рдп SWD рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдВрдкрд░реНрдХ рдореБрдХреНрдд рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ - рдЬрдм рдмреЛрд░реНрдб рдореЗрдВ рдмрд┐рдЬрд▓реА рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ, рддреЛ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдбреА-рдПрдирд░реНрдЬреЗрдЯрд┐рдХ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ PA15 рдХреЛ рдкрд┐рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдореНрди рд╕реНрддрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
- UDA1334 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдбрд┐рдЬрд┐рдЯрд▓-рд╕реЗ-рдПрдирд╛рд▓реЙрдЧ рдХрдирд╡рд░реНрдЯрд░ред рдЗрд╕ рдЪрд┐рдк рдХреЛ рдмрд╛рд╣рд░реА рдШрдбрд╝реА рд╕рдВрдХреЗрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИред рдбреЗрдЯрд╛ I2S рдмрд╕ рдХреЗ рдКрдкрд░ рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдбреЗрдЯрд╢реАрдЯ 47 ╬╝F рдкрд░ 5 рдзреНрд░реБрд╡реАрдп рдХреИрдкреЗрд╕рд┐рдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдХрд╛рд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рдЬреЛ рдЦрд░реАрджреЗ рдЧрдП рдереЗ рд╡реЗ 1411 рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЯреИрдВрдЯрд▓рдо рд╣реИрдВ, рдЬреЛ рд╕рд╕реНрддреЗ рднреА рдирд╣реАрдВ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдХреАрдордд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд▓рд┐рдЦреВрдВрдЧрд╛ред рдПрдирд╛рд▓реЙрдЧ рдкрд╛рд╡рд░ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд░реИрдЦрд┐рдХ рд╕реНрдЯреЗрдмрд▓рд╛рдЗрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдбрд┐рдЬрд┐рдЯрд▓ рд╣рд┐рд╕реНрд╕реЗ рдХреА рд╢рдХреНрддрд┐ рдХреЛ рдбрдмрд▓ рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЪрд╛рд▓реВ / рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

- рджреЛ рдЪреИрдирд▓ рдПрдореНрдкрд▓реАрдлрд╛рдпрд░ рджреЛ 31AP2005 рдЪрд┐рдкреНрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЙрдирдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рд╕реНрдЯреНрд░реЗрдкрд┐рдВрдЧ рдШрдЯрдХреЛрдВ (рдХреЗрд╡рд▓ рдкрд╛рд╡рд░ рдлрд┐рд▓реНрдЯрд░ рдФрд░ рдПрдХ рдЗрдирдкреБрдЯ рдлрд┐рд▓реНрдЯрд░) рдХреА рдПрдХ рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдСрдбрд┐рдпреЛ рдЖрдЙрдЯрдкреБрдЯ - 2.54 рдорд┐рдореА рдХреА рдкрд┐рдЪ рдХреЗ рд╕рд╛рде 4 рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдоред рдЦреБрдж рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдпрд╣ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХреНрдпрд╛ рд╣реИ - рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдореЗрдХрд╢рд┐рдлреНрдЯ рд╡рд┐рдХрд▓реНрдк рдпрд╛, рдЬреИрд╕реЗ рдХрд┐ рд░рд╛рд╕реНрдкрдмреЗрд░реА, рдПрдХ 3.5 рдорд┐рдореА рдкреНрд▓рдЧред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, 3.5 рдорд┐рдореА рд╣реЗрдбрдлрд╝реЛрди рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рд╡рдХреНрддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

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

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


ESP11 рдореЙрдбреНрдпреВрд▓ рддреИрдпрд╛рд░ рдХрд░рдирд╛
ESP8266 рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз рдЪреАрдЬ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдХрдИ рд▓реЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдпрд╣рд╛рдВ рдмрд╣реБрдд рд╣реА рд╢рд╛рдирджрд╛рд░ рд╣реЛрдЧреАред рдИрдПрд╕рдкреА 11 рдореЙрдбреНрдпреВрд▓ рдХреЛ рдмреЛрд░реНрдб рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛рдмрджреНрдз рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг, рдореИрдВ рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рджреВрдВрдЧрд╛ рдЬреЛ рдЗрд╕реЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

- рдмрд┐рдЬрд▓реА рдЪрд╛рд▓реВ рдХрд░реЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрд╕реНрдкреНрдЯреВрд▓ рдЪрд▓рд╛рдПрдВ
> esptool.py --port /dev/ttyUSB0 flash_id Connecting.... Detecting chip type... ESP8266 Chip is ESP8266EX Uploading stub... Running stub... Stub running... Manufacturer: e0 Device: 4014 Detected flash size: 1MB Hard resetting...
рд╕реЙрдлреНрдЯрд╡реЗрдпрд░
рдЬреАрдердм рдкрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИред рд╡рд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддреА рд╣реИ:
- рдЕрдзрд┐рдХрддрдо рдЖрд╡реГрддреНрддрд┐ (168 рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ) рдкрд░ рдирд┐рдпрдВрддреНрд░рдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ
- рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдШрдбрд╝реА рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИ
- рдПрд╕рдбреА рдХрд╛рд░реНрдб рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрдврд╝рддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП FatFS рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдирд┐рд░реНрджрд┐рд╖реНрдЯ WLAN рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ
- рдирд┐рд░реНрджрд┐рд╖реНрдЯ NTP рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЙрд╕рд╕реЗ рд╡рд░реНрддрдорд╛рди рд╕рдордп рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред рдШрдбрд╝реА рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред
- рдХрдИ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЧрдИ рд╣реИ, рддреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЯреАрд╕реАрдкреА рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рдкрд╛рда рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред
- рдЬрдм рдЖрдк рдмрд╛рд╣рд░реА рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрд╕рдбреА рдХрд╛рд░реНрдб рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ * .wav рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЛрдб (рдбреАрдПрдордП рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ I2S) рдореЗрдВ рдЦреЗрд▓рддрд╛ рд╣реИред
- ESP11 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдореЛрдб рдореЗрдВ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрдм рддрдХ DMA рдХреЗ рдмрд┐рдирд╛, рдХреЗрд╡рд▓ рд╡реНрдпрд╡рдзрд╛рди рдкрд░)
- USART1 (рдкрд┐рди PB6 / PB7) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ
- рдФрд░, рдмреЗрд╢рдХ, рдПрд▓рдИрдбреА рдЭрдкрдХреАред
Habr├й рдкрд░ рдХрдИ рд▓реЗрдЦ рдереЗ рдЬреЛ STM32 рдХреЛ рдПрдХ рдирд┐рдореНрди рд╕реНрддрд░ рдкрд░ (рдХреЗрд╡рд▓ рд░рдЬрд┐рд╕реНрдЯрд░ рдкреНрд░рдмрдВрдзрди рдпрд╛ CMSIS рджреНрд╡рд╛рд░рд╛) рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдереЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЕрдВрддрд┐рдо рд╕реЗ: рдПрдХ , рджреЛ , рддреАрди ред рд▓реЗрдЦ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдмрд╣реБрдд рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реА рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд░рд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдЙрддреНрдкрд╛рдж рдХреЗ рдПрдХ рдмрд╛рд░ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг, рд╢рд╛рдпрдж, рдЦреБрдж рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдХреЗ рд╢реМрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕реБрдВрджрд░ рдФрд░ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╣реЛ, рддреЛ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд╣реБрдд рдХрдо рд╣реИред Arduino рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рд╣реИ рдХрд┐ Arduino рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдиреЗ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдирд┐рдореНрди рд╕реНрддрд░ рдЫреЛрдбрд╝рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЙрд╕реА рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдФрд░ рдПрдЪрдПрдПрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдКрдкрд░ рдПрдХ рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рдкрд░рдд рдХреЛ рдЬреЛрдбрд╝рд╛ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рддреАрди рд╕реНрддрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ:
- рдирд┐рд░реНрдорд╛рддрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (HAL, FatFS, рднрд╡рд┐рд╖реНрдп рдХреЗ USB-OTG рдореЗрдВ) рдЖрдзрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВ
- рдореЗрд░реА StmPlusPlus рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрд╕реА рдЖрдзрд╛рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЗрд╕рдореЗрдВ рдмреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ (рдЬреИрд╕реЗ рд╕рд┐рд╕реНрдЯрдо, IOPort, IOPin, рдЯрд╛рдЗрдорд░, RealTimeClock, Usart, Spi, I2S) рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдмрд╛рд╣рд░реА рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдбреНрд░рд╛рдЗрд╡рд░ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ (рдЬреИрд╕реЗ SdCard, Esp11, DcfReceiver, Dac_MCP49x1, AudioDac_UDA1334 рдФрд░ рдЬреИрд╕реЗ рдЕрдиреНрдп) рдПрдХ WAV рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрд╡рд╛ рд╡рд░реНрдЧред
- StmPlusPlus рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрд╡рдпрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рднрд╛рд╖рд╛ рдХреА рдмреЛрд▓реА рдХреЗ рд▓рд┐рдП рдХреЗ рд░реВрдк рдореЗрдВред рдЬрдмрдХрд┐ рдореИрдВ рдХреБрдЫ рдкреБрд░рд╛рдиреЗ рдЬрдорд╛рдиреЗ рдХрд╛ рд╣реВрдВ, рдореИрдВ C ++ 11 рдореЗрдВ рд░рд╣рддрд╛ рд╣реВрдВред рдЗрд╕ рдорд╛рдирдХ рдореЗрдВ рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдлрд░реНрдорд╡реЗрдпрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИрдВ: рдПрдирдо рд╡рд░реНрдЧ, рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛, рдФрд░ рд╕реНрдЯреИрдб :: рд╕рд░рдгреА рдЬреИрд╕реЗ рд╕реНрдерд┐рд░ рдХрдВрдЯреЗрдирд░ред рд╡реИрд╕реЗ, рд╣реИрдмреЗ рдкрд░ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рдЕрджреНрднреБрдд рд▓реЗрдЦ рд╣реИ ред
StmPlusPlus рд▓рд╛рдЗрдмреНрд░реЗрд░реА
рдкреВрд░реНрдг рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛрдб рдХреЛ рдЬреАрдердм рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдореИрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╕рдВрд░рдЪрдирд╛, рд╡рд┐рдЪрд╛рд░ рдФрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдХреБрдЫ рдЫреЛрдЯреЗ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред
рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рд╕рдордп-рд╕рдордп рдкрд░ рдПрдХ рдкрд┐рди рд░рд╛рдЬреНрдп (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрдЯрди) рдХреЛ рдорддрджрд╛рди рдХрд░рдиреЗ рдФрд░ рдЗрд╕ рд░рд╛рдЬреНрдп рдХреЗ рдмрджрд▓рдиреЗ рдкрд░ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рд╣реИ:
class Button : IOPin { public: class EventHandler { public: virtual void onButtonPressed (const Button *, uint32_t numOccured) =0; }; Button (PortName name, uint32_t pin, uint32_t pull, const RealTimeClock & _rtc, duration_ms _pressDelay = 50, duration_ms _pressDuration = 300); inline void setHandler (EventHandler * _handler) { handler = _handler; } void periodic (); private: const RealTimeClock & rtc; duration_ms pressDelay, pressDuration; time_ms pressTime; bool currentState; uint32_t numOccured; EventHandler * handler; };
рдирд┐рд░реНрдорд╛рддрд╛ рд╕рднреА рдмрдЯрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:
Button::Button (PortName name, uint32_t pin, uint32_t pull, const RealTimeClock & _rtc, duration_ms _pressDelay, duration_ms _pressDuration): IOPin{name, pin, GPIO_MODE_INPUT, pull, GPIO_SPEED_LOW}, rtc{_rtc}, pressDelay{_pressDelay}, pressDuration{_pressDuration}, pressTime{INFINITY_TIME}, currentState{false}, numOccured{0}, handler{NULL} {
рдпрджрд┐ рдРрд╕реА рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╡реНрдпрд╡рдзрд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╢рд╛рдирджрд╛рд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рджрдмрд╛рд╡ рд╡рд╛рд▓реЗ рдкрд░рд┐рджреГрд╢реНрдп (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХрд▓ рдкреНрд░реЗрд╕ рдпрд╛ рд╣реЛрд▓реНрдб) рдЖрд╡рдзрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдордп-рд╕рдордп рдкрд░ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛрдб рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдордп-рд╕рдордп рдкрд░ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ onButtonPressed рд╡рд░реНрдЪреБрдЕрд▓ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
void Button::periodic () { if (handler == NULL) { return; } bool newState = (gpioParameters.Pull == GPIO_PULLUP)? !getBit() : getBit(); if (currentState == newState) {
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдЕрдкрдиреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдХрд┐рд╕реА рдШрдЯрдирд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдФрд░ рдХреЛрдб рдХреА рд╡рд┐рд╡рд┐рдзрддрд╛ рд╣реИред рдпрд╣ HAL_GetTick рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧрд┐рдирддреА рдХреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ (uint32_t) рдХреЗ рдХрд╛рд░рдг, рдкреНрд░рддреНрдпреЗрдХ 2 ^ 32 рдорд┐рд▓реАрд╕реЗрдХрдВрдб (рдкреНрд░рддреНрдпреЗрдХ 49 рджрд┐рди) рдкрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рджреНрд╡рд╛рд░рд╛ рд░реАрд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╡рд░реНрдЧ RealTimeClock рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ uint64_t рдЬреИрд╕реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд▓рдЧрднрдЧ 5 ^ 8 рд╡рд░реНрд╖ рджреЗрддрд╛ рд╣реИред
рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдХрдИ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрд╕рдкреАрдЖрдИред рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдХреЗрд╡рд▓ рд╡рд╛рдВрдЫрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (SPI1 / SPI2 / SPI3) рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдФрд░ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдЕрдиреНрдп рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд░реНрдЧ рдирд┐рд░реНрдорд╛рддрд╛ рджреНрд╡рд╛рд░рд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
class Spi { public: const uint32_t TIMEOUT = 5000; enum class DeviceName { SPI_1 = 0, SPI_2 = 1, SPI_3 = 2, }; Spi (DeviceName _device, IOPort::PortName sckPort, uint32_t sckPin, IOPort::PortName misoPort, uint32_t misoPin, IOPort::PortName mosiPort, uint32_t mosiPin, uint32_t pull = GPIO_NOPULL); HAL_StatusTypeDef start (uint32_t direction, uint32_t prescaler, uint32_t dataSize = SPI_DATASIZE_8BIT, uint32_t CLKPhase = SPI_PHASE_1EDGE); HAL_StatusTypeDef stop (); inline HAL_StatusTypeDef writeBuffer (uint8_t *pData, uint16_t pSize) { return HAL_SPI_Transmit(hspi, pData, pSize, TIMEOUT); } private: DeviceName device; IOPin sck, miso, mosi; SPI_HandleTypeDef *hspi; SPI_HandleTypeDef spiParams; void enableClock(); void disableClock(); };
рдкрд┐рди рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВрдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдлрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдЪреБрдирд╛, рдЬрдм рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕реАрдзреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
Spi::Spi (DeviceName _device, IOPort::PortName sckPort, uint32_t sckPin, IOPort::PortName misoPort, uint32_t misoPin, IOPort::PortName mosiPort, uint32_t mosiPin, uint32_t pull): device(_device), sck(sckPort, sckPin, GPIO_MODE_AF_PP, pull, GPIO_SPEED_HIGH, false), miso(misoPort, misoPin, GPIO_MODE_AF_PP, pull, GPIO_SPEED_HIGH, false), mosi(mosiPort, mosiPin, GPIO_MODE_AF_PP, pull, GPIO_SPEED_HIGH, false), hspi(NULL) { switch (device) { case DeviceName::SPI_1: #ifdef SPI1 sck.setAlternate(GPIO_AF5_SPI1); miso.setAlternate(GPIO_AF5_SPI1); mosi.setAlternate(GPIO_AF5_SPI1); spiParams.Instance = SPI1; #endif break; ... case DeviceName::SPI_3: #ifdef SPI3 sck.setAlternate(GPIO_AF6_SPI3); miso.setAlternate(GPIO_AF6_SPI3); mosi.setAlternate(GPIO_AF6_SPI3); spiParams.Instance = SPI3; #endif break; } spiParams.Init.Mode = SPI_MODE_MASTER; spiParams.Init.DataSize = SPI_DATASIZE_8BIT; spiParams.Init.CLKPolarity = SPI_POLARITY_HIGH; spiParams.Init.CLKPhase = SPI_PHASE_1EDGE; spiParams.Init.FirstBit = SPI_FIRSTBIT_MSB; spiParams.Init.TIMode = SPI_TIMODE_DISABLE; spiParams.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; spiParams.Init.CRCPolynomial = 7; spiParams.Init.NSS = SPI_NSS_SOFT; }
рд╕рдорд╛рди рдпреЛрдЬрдирд╛ рд╕рдХреНрд╖рдордХреЙрд▓ рдФрд░ рдбрд┐рд╕рдХреЙрд▓рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ, рдЬреЛ рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЦрд░рд╛рдм рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдФрд░ рдЦрд░рд╛рдм рдкреЛрд░реНрдЯреЗрдмрд▓ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ HAL рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╛рдо (SPI1, SPI2, SPI3), рдкрд┐рди рдкреИрд░рд╛рдореАрдЯрд░ (GPIO_AF5_SPI1) рдФрд░ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХреНрд▓реЙрдХрд┐рдВрдЧ рдХреЗ рдЪрд╛рд▓реВ / рдмрдВрдж рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд▓реЗрдЦ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрд╡реАрдЖрд░ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдореМрд▓рд┐рдХ рдЕрдВрддрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХрд╛ рдкреНрд░рд╛рд░рдВрдн рдФрд░ рдЕрдВрдд рджреЛ рд╕реНрдЯрд╛рд░реНрдЯ / рд╕реНрдЯреЙрдк рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
HAL_StatusTypeDef Spi::start (uint32_t direction, uint32_t prescaler, uint32_t dataSize, uint32_t CLKPhase) { hspi = &spiParams; enableClock(); spiParams.Init.Direction = direction; spiParams.Init.BaudRatePrescaler = prescaler; spiParams.Init.DataSize = dataSize; spiParams.Init.CLKPhase = CLKPhase; HAL_StatusTypeDef status = HAL_SPI_Init(hspi); if (status != HAL_OK) { USART_DEBUG("Can not initialize SPI " << (size_t)device << ": " << status); return status; } if (spiParams.Init.Direction == SPI_DIRECTION_1LINE) { SPI_1LINE_TX(hspi); } if ((spiParams.Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) { __HAL_SPI_ENABLE(hspi); } USART_DEBUG("Started SPI " << (size_t)device << ": BaudRatePrescaler = " << spiParams.Init.BaudRatePrescaler << ", DataSize = " << spiParams.Init.DataSize << ", CLKPhase = " << spiParams.Init.CLKPhase << ", Status = " << status); return status; } HAL_StatusTypeDef Spi::stop () { USART_DEBUG("Stopping SPI " << (size_t)device); HAL_StatusTypeDef retValue = HAL_SPI_DeInit(&spiParams); disableClock(); hspi = NULL; return retValue; }
рдЗрдВрдЯрд░рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ ред рд╡рд░реНрдЧ рдбреАрдПрдордП рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ I2S рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред I2S (рдЗрдВрдЯрд░-рдЖрдИрд╕реА рд╕рд╛рдЙрдВрдб) рдПрд╕рдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░-рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдРрдб-рдСрди рд╣реИ, рдЬреЛ рд╕реНрд╡рдпрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрдбрд┐рдпреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдФрд░ рдмрд┐рдЯ рджрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдШрдбрд╝реА рдЪрдпрди рдФрд░ рдЪреИрдирд▓ рдирд┐рдпрдВрддреНрд░рдг рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, I2S рд╡рд░реНрдЧ "рдкреЛрд░реНрдЯ" рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, I2S рд╡рд┐рд╢реЗрд╖ рдЧреБрдгреЛрдВ рд╡рд╛рд▓рд╛ рдПрдХ рдмрдВрджрд░рдЧрд╛рд╣ рд╣реИред рдХреБрдЫ рдбреЗрдЯрд╛ рдПрдЪрдПрдПрд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдкреНрд▓рд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп)ред рдХреБрдЫ рдбреЗрдЯрд╛ рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛ рдореБрдЦреНрдп рдХреЛрдб рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, irqPrio рд╕рдВрд░рдЪрдирд╛)ред
class I2S : public IOPort { public: const IRQn_Type I2S_IRQ = SPI2_IRQn; const IRQn_Type DMA_TX_IRQ = DMA1_Stream4_IRQn; I2S (PortName name, uint32_t pin, const InterruptPriority & prio); HAL_StatusTypeDef start (uint32_t standard, uint32_t audioFreq, uint32_t dataFormat); void stop (); inline HAL_StatusTypeDef transmit (uint16_t * pData, uint16_t size) { return HAL_I2S_Transmit_DMA(&i2s, pData, size); } inline void processI2SInterrupt () { HAL_I2S_IRQHandler(&i2s); } inline void processDmaTxInterrupt () { HAL_DMA_IRQHandler(&i2sDmaTx); } private: I2S_HandleTypeDef i2s; DMA_HandleTypeDef i2sDmaTx; const InterruptPriority & irqPrio; };
рдЗрд╕рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рд╕рднреА рд╕реНрдерд┐рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ:
I2S::I2S (PortName name, uint32_t pin, const InterruptPriority & prio): IOPort{name, GPIO_MODE_INPUT, GPIO_NOPULL, GPIO_SPEED_FREQ_LOW, pin, false}, irqPrio{prio} { i2s.Instance = SPI2; i2s.Init.Mode = I2S_MODE_MASTER_TX; i2s.Init.Standard = I2S_STANDARD_PHILIPS;
рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХреА рд╢реБрд░реБрдЖрдд рд╕реНрдЯрд╛рд░реНрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдкреЛрд░реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдХреНрд▓реЙрдХ рдХрд░рдиреЗ, рд╡реНрдпрд╡рдзрд╛рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ, рдбреАрдПрдордП рд╢реБрд░реВ рдХрд░рдиреЗ, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрд╡рдпрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред
HAL_StatusTypeDef I2S::start (uint32_t standard, uint32_t audioFreq, uint32_t dataFormat) { i2s.Init.Standard = standard; i2s.Init.AudioFreq = audioFreq; i2s.Init.DataFormat = dataFormat; setMode(GPIO_MODE_AF_PP); setAlternate(GPIO_AF5_SPI2); __HAL_RCC_SPI2_CLK_ENABLE(); HAL_StatusTypeDef status = HAL_I2S_Init(&i2s); if (status != HAL_OK) { USART_DEBUG("Can not start I2S: " << status); return HAL_ERROR; } __HAL_RCC_DMA1_CLK_ENABLE(); __HAL_LINKDMA(&i2s, hdmatx, i2sDmaTx); status = HAL_DMA_Init(&i2sDmaTx); if (status != HAL_OK) { USART_DEBUG("Can not initialize I2S DMA/TX channel: " << status); return HAL_ERROR; } HAL_NVIC_SetPriority(I2S_IRQ, irqPrio.first, irqPrio.second); HAL_NVIC_EnableIRQ(I2S_IRQ); HAL_NVIC_SetPriority(DMA_TX_IRQ, irqPrio.first + 1, irqPrio.second); HAL_NVIC_EnableIRQ(DMA_TX_IRQ); return HAL_OK; }
рд╕реНрдЯреЙрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд░рддреА рд╣реИ:
void I2S::stop () { HAL_NVIC_DisableIRQ(I2S_IRQ); HAL_NVIC_DisableIRQ(DMA_TX_IRQ); HAL_DMA_DeInit(&i2sDmaTx); __HAL_RCC_DMA1_CLK_DISABLE(); HAL_I2S_DeInit(&i2s); __HAL_RCC_SPI2_CLK_DISABLE(); setMode(GPIO_MODE_INPUT); }
рдпрд╣рд╛рдБ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ:
- рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рд╡реНрдпрд╡рдзрд╛рдиреЛрдВ рдХреЛ рд╕реНрдереИрддрд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд╛рд╣реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЛрдг рд╣реИред
- рдХреЛрдб рдХрд╛ рдРрд╕рд╛ рд╕рдВрдЧрдарди рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреЛрд░реНрдЯ рдкрд┐рди рд╣рдореЗрд╢рд╛ GPIO_MODE_INPUT рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛ рдЬрдм рдХреЛрдИ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рди рд╣реЛред рдпрд╣ рдПрдХ рдкреНрд▓рд╕ рд╣реИред
- рдЗрдВрдЯрд░рдкреНрдЯ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЛ рдмрд╛рд╣рд░ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдореБрдЦреНрдп рдХреЛрдб рдХреЗ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдПрдХ рдмрд╛рдзрд╛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрд╡рд╕рд░ рд╣реИред рдпрд╣ рднреА рдПрдХ рдкреНрд▓рд╕ рд╣реИред
- рд░реЛрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ DMA1 рдХреНрд▓реЙрдХрд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рд╕рд░рд▓реАрдХрд░рдг рдХреЗ рдмрд╣реБрдд рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдХреЛрдИ рдФрд░ рд╡реНрдпрдХреНрддрд┐ рдбреАрдПрдордП 1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХрд╛ рдПрдХ рдХреЗрдВрджреНрд░реАрдХреГрдд рд░рдЬрд┐рд╕реНрдЯрд░ рдмрдирд╛рдХрд░ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдХреНрд▓реЙрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред
- рдПрдХ рдФрд░ рд╕рд░рд▓реАрдХрд░рдг - рдкреНрд░рд╛рд░рдВрдн рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрдкрдиреА рдореВрд▓ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рд▓рд╛рддреА рд╣реИ (рдпрд╣ рдПрдХ рдЛрдг рд╣реИ, рд▓реЗрдХрд┐рди рдЖрд╕рд╛рдиреА рд╕реЗ рдлрд┐рдХреНрд╕рд┐рдВрдЧ рд╣реИ)ред рдЙрд╕реА рд╕рдордп, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд▓реЙрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдкреНрд▓рд╕ рд╣реИред
- рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдореБрдЦреНрдп рдХреЛрдб рдХреЛ SPI2_IRQn рдФрд░ DMA1_Stream4_IRQn рдХреЛ рдмреАрдЪ рдореЗрдВ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд processI2SInterrupt рдФрд░ processDmaTxInterrupt рд╣реИрдВрдбрд▓рд░ рдХрд╣рд▓рд╛рддреЗ рд╣реИрдВред
рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо
рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ:
int main (void) { HAL_Init(); IOPort defaultPortA(IOPort::PortName::A, GPIO_MODE_INPUT, GPIO_PULLDOWN); IOPort defaultPortB(IOPort::PortName::B, GPIO_MODE_INPUT, GPIO_PULLDOWN); IOPort defaultPortC(IOPort::PortName::C, GPIO_MODE_INPUT, GPIO_PULLDOWN);
рдпрд╣рд╛рдВ рд╣рдо HAL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ, рд╕рднреА рдХрдВрдЯреНрд░реЛрд▓рд░ рдкрд┐рдиреНрд╕ рдХреЛ рдЗрдирдкреБрдЯ (GPIO_MODE_INPUT / PULLDOWN) рджреНрд╡рд╛рд░рд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдирд┐рдпрдВрддреНрд░рдХ рдХреА рдЖрд╡реГрддреНрддрд┐ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдШрдбрд╝реА рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ (рдмрд╛рд╣рд░реА рдХреНрд╡рд╛рд░реНрдЯреНрдЬ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреА рдШрдбрд╝реА рд╕рд╣рд┐рдд)ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЬрд╛рд╡рд╛ рдХреА рд╢реИрд▓реА рдореЗрдВ рдереЛрдбрд╝рд╛, рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреА рд░рди рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЬрд┐рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╡реНрдпрд╡рдзрд╛рдиреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдБрдХрд┐ рд╣рдо C ++ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рд╡реНрдпрд╡рдзрд╛рди C рдХреА рджреБрдирд┐рдпрд╛ рдХреА рдЪреАрдЬреЗрдВ рд╣реИрдВ, рд╣рдореЗрдВ рдЙрдирдХреЗ рдЕрдиреБрд╕рд╛рд░ рдорд╛рд╕реНрдХ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛:
extern "C" { void SysTick_Handler (void) { HAL_IncTick(); if (appPtr != NULL) { appPtr->getRtc().onMilliSecondInterrupt(); } } void DMA2_Stream3_IRQHandler (void) { Devices::SdCard::getInstance()->processDmaRxInterrupt(); } void DMA2_Stream6_IRQHandler (void) { Devices::SdCard::getInstance()->processDmaTxInterrupt(); } void SDIO_IRQHandler (void) { Devices::SdCard::getInstance()->processSdIOInterrupt(); } void SPI2_IRQHandler(void) { appPtr->getI2S().processI2SInterrupt(); } void DMA1_Stream4_IRQHandler(void) { appPtr->getI2S().processDmaTxInterrupt(); } void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *channel) { appPtr->processDmaTxCpltCallback(channel); } ... }
MyApplication рд╡рд░реНрдЧ рдЗрди рд╕рднреА рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЙрдкрдХрд░рдгреЛрдВ, рдХреЙрд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рднреА рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
class MyApplication : public RealTimeClock::EventHandler, class MyApplication : public RealTimeClock::EventHandler, WavStreamer::EventHandler, Devices::Button::EventHandler { public: static const size_t INPUT_PINS = 8;
рдпрд╣реА рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рдпреБрдХреНрдд рдореЗрдореЛрд░реА рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред MyApplication рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ, рд╕рднреА рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж, рдЬрдм рддрдХ рд░рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддрдм рддрдХ рд╕рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
MyApplication::MyApplication () :
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдЬреЛ WAV рдлрд╝рд╛рдЗрд▓ рдЦреЗрд▓рдирд╛ рд╢реБрд░реВ / рдмрдВрдж рдХрд░рддрд╛ рд╣реИ:
virtual void MyApplication::onButtonPressed (const Devices::Button * b, uint32_t numOccured) { if (b == &playButton) { USART_DEBUG("play button pressed: " << numOccured); if (streamer.isActive()) { USART_DEBUG(" Stopping WAV"); streamer.stop(); } else { USART_DEBUG(" Starting WAV"); streamer.start(AudioDac_UDA1334::SourceType:: STREAM, config.getWavFile()); } } }
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдореБрдЦреНрдп рд░рди рд╡рд┐рдзрд┐ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░рддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдШрдЯрдирд╛ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ MyApplication рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ), рдФрд░ рдПрдХ рдЕрдВрддрд╣реАрди рд▓реВрдк рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдпрд╣ рд╕рдордп-рд╕рдордп рдкрд░ рдЙрди рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдордп-рд╕рдордп рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
void MyApplication::run () { log.initInstance(); USART_DEBUG("Oscillator frequency: " << System::getExternalOscillatorFreq() << ", MCU frequency: " << System::getMcuFreq()); HAL_StatusTypeDef status = HAL_TIMEOUT; do { status = rtc.start(8 * 2047 + 7, RTC_WAKEUPCLOCK_RTCCLK_DIV2, irqPrioRtc, this); USART_DEBUG("RTC start status: " << status); } while (status != HAL_OK); sdCard.setIrqPrio(irqPrioSd); sdCard.initInstance(); if (sdCard.isCardInserted()) { updateSdCardState(); } USART_DEBUG("Input pins: " << pins.size()); pinsState.fill(true); USART_DEBUG("Pin state: " << fillMessage()); esp.assignSendLed(&ledGreen); streamer.stop(); streamer.setHandler(this); streamer.setVolume(1.0); playButton.setHandler(this); bool reportState = false; while (true) { updateSdCardState(); playButton.periodic(); streamer.periodic(); if (isInputPinsChanged()) { USART_DEBUG("Input pins change detected"); ledBlue.putBit(true); reportState = true; } espSender.periodic(); if (espSender.isOutputMessageSent()) { if (reportState) { espSender.sendMessage(config, "TCP", config.getServerIp(), config.getServerPort(), fillMessage()); reportState = false; } if (!reportState) { ledBlue.putBit(false); } } if (heartbeatEvent.isOccured()) { ledGreen.putBit(heartbeatEvent.occurance() == 1); } } }
рдереЛрдбрд╝рд╛ рд╕рд╛ рдкреНрд░рдпреЛрдЧ
тАФ . тАФ 168 MHz. , , 172 MHz 180 MHz, , , MCO. , USART I2S, , , HAL.
. github . - , Mouser ( ). 37 . . , STM Olimex, .
. , :
- ( ). , , . : 4 8 . PLL, .
- , . 47 ╬╝F . , .
- SWD . - , . .
- . SMD , . 3 .
рдкреНрд░рд▓реЗрдЦрди
github GPL v3:
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!