рд╕рднреА рдХреЛ рдЕрдЪреНрдЫрд╛ рд╕реНрд╡рд╛рд╕реНрдереНрдп!
рдЬрдм рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдореНрдмреЗрдбреЗрдб рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╕рд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдВ C ++ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдХрднреА-рдХрднреА рдореИрдВ рдРрд╕реЗ рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рджреЗрддрд╛ рд╣реВрдВ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ
рдмреАрдорд╛рд░ рдЫрд╛рддреНрд░реЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред
рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдРрд╕реЗ рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ, рдЬреИрд╕реЗ рд╕реАрдПрдордПрд╕рдЖрдИрдПрд╕ рдФрд░ рдЙрдирдХреЗ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛, C ++ 17 рднрд╛рд╖рд╛ рдФрд░ рдорд╛рдирдХ C ++ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 4 рдПрд▓рдЗрдбреА рдХреЛ рдмреНрд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рджрд┐рдпрд╛ рдЧрдпрд╛, рдФрд░ рдЗрд╕реА рддрд░рд╣ ... рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдЬреАрддрддрд╛ рд╣реИред рд░реЛрдо рдореЗрдВ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рдЖрдХрд╛рд░ рдФрд░ рдХрдо рд╕реЗ рдХрдо рдЦрд░реНрдЪ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд░реИрдо рд╣реЛрдЧреАред рд╕рдВрдХрд▓рдХ рдЕрдиреБрдХреВрд▓рди рдордзреНрдпрдо рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред IAR рдХрдВрдкрд╛рдЗрд▓рд░ 8.40.1ред
рд╡рд┐рдЬреЗрддрд╛
рдХреИрдирд░реА рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП 5 рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЦреБрдж рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЫрд╛рддреНрд░реЛрдВ рдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдФрд░ рдореЗрд░реЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реБрдЖред рдореИрдВ рдЖрдкрдХреЛ рддреБрд░рдВрдд рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдкреНрд░рдХрд╛рд╢рди рдХреЛ "рдЕрд╕рд╛рдорд╛рдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреМрди рдЬрд╛рдирддрд╛ рд╣реИред
рдЯрд╛рд╕реНрдХ рдХреА рд╢рд░реНрддреЗрдВ
рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдкрд░ 4 рдПрд▓рдЗрдбреА рд╣реИрдВ GPIOA.5, GPIOC.5, GPIOC.8, GPIOC.9ред рдЙрдиреНрд╣реЗрдВ рдкрд▓рдХ рдЭрдкрдХрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ C рдореЗрдВ рд▓рд┐рдЦрд╛ рдХреЛрдб рд▓рд┐рдпрд╛:
void delay() { for (int i = 0; i < 1000000; ++i){ } } int main() { for(;;) { GPIOA->ODR ^= (1 << 5); GPIOC->ODR ^= (1 << 5); GPIOC->ODR ^= (1 << 8); GPIOC->ODR ^= (1 << 9); delay(); } return 0 ; }
рдпрд╣рд╛рдВ
delay()
рдлрд╝рдВрдХреНрд╢рди рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдФрдкрдЪрд╛рд░рд┐рдХ рд╣реИ, рдПрдХ рдирд┐рдпрдорд┐рдд рдЪрдХреНрд░ рд╣реИ, рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЙрди рдкрд░ рдХреНрд▓реЙрдХрд┐рдВрдЧ рд▓рд╛рдЧреВ рд╣реИред
рдореИрдВ рдпрд╣ рднреА рдареАрдХ рд╕реЗ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдХреЛрдб рдХреЛ рдкреЛрд░реНрдЯреЗрдмрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдЯрдмреИрдВрдЧрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдпрд╣ рдХреЛрдб рд╕реНрдЯреИрдХ рдкрд░ 8 рдмрд╛рдЗрдЯреНрд╕ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдордзреНрдпрдо рдЕрдиреБрдХреВрд▓рди рдкрд░ рд░реЛрдо рдореЗрдВ 256 рдмрд╛рдЗрдЯреНрд╕
255 рдмрд╛рдЗрдЯреНрд╕ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЛрдб рдореЗрдореЛрд░реА
рд░реАрдбрдУрдирд▓реА рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреА 1 рдмрд╛рдЗрдЯ
рд░реАрдбрд░рд╛рдЗрдЯрдЗрдЯ рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреЗ 8 рдмрд╛рдЗрдЯреНрд╕
255 рдмрд╛рдЗрдЯреНрд╕ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдореЗрдореЛрд░реА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрд╛рдзрд┐рдд рд╡реИрдХреНрдЯрд░ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рддрд╣рдд рдЪрд▓рд╛ рдЧрдпрд╛, рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдмрд┐рдВрджреБ рдмреНрд▓реЙрдХ рдХреЛ рдЖрд░рдореНрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IAR рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдФрд░ __low_level_init рдлрд╝рдВрдХреНрд╢рди, рдЬрд╣рд╛рдВ рдкреЛрд░реНрдЯ рд╕реНрд╡рдпрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рдереЗред
рддреЛ, рдкреВрд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВ:
- рдореБрдЦреНрдп () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдпрдерд╛рд╕рдВрднрд╡ рдХрдо рдХреЛрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
- рдЖрдк рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ
- IAR 8.40.1 рд╕рдВрдХрд▓рдХ C ++ 17 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ
- CMSIS рд╣реЗрдбрд░ рдлрд╛рдЗрд▓ рдЬреИрд╕реЗ "#include" stm32f411xe.h "рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
- рдЖрдк рдЗрдирд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП __forceinline рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
- рдордзреНрдпрдо рд╕рдВрдХрд▓рдХ рдЕрдиреБрдХреВрд▓рди
рдЫрд╛рддреНрд░реЛрдВ рдХрд╛ рдлреИрд╕рд▓рд╛
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрдИ рд╕рдорд╛рдзрд╛рди рдереЗ, рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ ... рдпрд╣ рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдЖрдпрд╛ред
рдЪреВрдВрдХрд┐ рд╣реЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЫрд╛рддреНрд░реЛрдВ рдиреЗ рд╕рдмрд╕реЗ рдкрд╣рд▓рд╛ рдХрд╛рдо
Gpio
рд╡рд░реНрдЧ рдХрд╛ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЕрдкрдиреЗ рдкрддреЗ рдкрд░ рдкреЛрд░реНрдЯ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡реЗ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдУрд╡рд░рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╡реЗ рдпрд╣рд╛рдВ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рд▓реЗрддреЗ рд╣реИрдВ:
рд╕рдВрд░рдЪрдирд╛ рдУрд╡рд░рд▓реЗ :
class Gpio { public: __forceinline inline void Toggle(const std::uint8_t bitNum) volatile { Odr ^= bitNum ; } private: volatile std::uint32_t Moder; volatile std::uint32_t Otyper; volatile std::uint32_t Ospeedr; volatile std::uint32_t Pupdr; volatile std::uint32_t Idr; volatile std::uint32_t Odr;
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рддреБрд░рдВрдд
Gpio
рд╡рд░реНрдЧ рдХреА рдкрд╣рдЪрд╛рди рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреА рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдкрддреЗ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдкреИрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд░рд╛рдЬреНрдп рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдПрдХ рд╡рд┐рдзрд┐:
рдлрд┐рд░ рд╣рдордиреЗ
GpioPin
рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд┐рд╕рдореЗрдВ
GpioPin
рдХреЛ рд╕реВрдЪрдХ рдФрд░ рдкреИрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ:
struct GpioPin { volatile Gpio* port ; std::uint32_t pinNum ; } ;
рдлрд┐рд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрд▓рдЗрдбреА рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдИ рдЬреЛ рдкреЛрд░реНрдЯ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреИрд░реЛрдВ рдкрд░ рдмреИрдарддреА рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдПрд▓рдИрдбреА рдХреЗ
Toggle()
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЙрд╕ рдкрд░ рдЪрд▓реА рдЧрдИ:
const GpioPin leds[] = {{reinterpret_cast<volatile Gpio*>(GpioaBaseAddr), 5}, {reinterpret_cast<volatile Gpio*>(GpiocBaseAddr), 5}, {reinterpret_cast<volatile Gpio*>(GpiocBaseAddr), 9}, {reinterpret_cast<volatile Gpio*>(GpiocBaseAddr), 9} } ; struct LedsDriver { __forceinline static inline void ToggelAll() { for (auto& it: leds) { it.port->Toggle(it.pinNum); } } } ;
рдЦреИрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрд░реЗ рдХреЛрдб: constexpr std::uint32_t GpioaBaseAddr = 0x4002'0000 ; constexpr std::uint32_t GpiocBaseAddr = 0x4002'0800 ; class Gpio { public: __forceinline inline void Toggle(const std::uint8_t bitNum) volatile { Odr ^= bitNum ; } private: volatile std::uint32_t Moder; volatile std::uint32_t Otyper; volatile std::uint32_t Ospeedr; volatile std::uint32_t Pupdr; volatile std::uint32_t Idr; volatile std::uint32_t Odr; } ;
рдордзреНрдпрдо рдЕрдиреБрдХреВрд▓рди рдкрд░ рдЙрдирдХреЗ рдХреЛрдб рдХреЗ рдЖрдБрдХрдбрд╝реЗ:
рд░реАрдбрдСрдирд▓реА рдХреЛрдб рдореЗрдореЛрд░реА рдХреЗ 275 рдмрд╛рдЗрдЯреНрд╕
рд░реАрдбрдУрдирд▓реА рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреА 1 рдмрд╛рдЗрдЯ
рд░реАрдбрд░рд╛рдЗрдЯрдЗрдЯ рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреЗ 8 рдмрд╛рдЗрдЯреНрд╕
рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реА рдореЗрдореЛрд░реА рд▓реЗрддрд╛ рд╣реИ :)
рдореЗрд░рд╛ рдлреИрд╕рд▓рд╛
рдмреЗрд╢рдХ, рдореИрдВрдиреЗ рд╕рд░рд▓ рддрд░реАрдХреЛрдВ рдХреА рддрд▓рд╛рд╢ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдЧрдВрднреАрд░ рд░реВрдк рд╕реЗ рдЕрднрд┐рдирдп рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ :)ред
рдПрд▓рдИрдбреА рд╡рд┐рднрд┐рдиреНрди рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреИрд░реЛрдВ рдкрд░ рд╣реИрдВред
Port
рдХреНрд▓рд╛рд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реА рдЪреАрдЬ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд░реИрдо рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдЯреИрдЯрд┐рдХ рддрд░реАрдХреЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдмрдВрджрд░рдЧрд╛рд╣ рд╡рд░реНрдЧ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
template <std::uint32_t addr> struct Port {
рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕рдХрд╛ рдПрдХ рдкреЛрд░реНрдЯ рдПрдбреНрд░реЗрд╕ рд╣реЛрдЧрд╛ред
"#include "stm32f411xe.h"
, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреЛрд░реНрдЯ A рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ GPIOA_BASE рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╣реЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдирд┐рд░рдВрддрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
constexpr std::uint32_t GpioaBaseAddr = 0x4002'0000 ; constexpr std::uint32_t GpiocBaseAddr = 0x4002'0800 ; using PortA = Port<GpioaBaseAddr> ; using PortC = Port<GpiocBaseAddr> ;
рдмреНрд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЯреЙрдЧрд▓ рд╡рд┐рдзрд┐ (const st :: uint8_t bit) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдпрд╛ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдмрд┐рдЯ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдЧрд╛ред рд╡рд┐рдзрд┐ рд╕реНрдерд┐рд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЗрд╕реЗ рдХрдХреНрд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
template <std::uint32_t addr> struct Port {
рдЙрддреНрдХреГрд╖реНрдЯ
Port<>
рд╣реИ, рдпрд╣ рдкреИрд░реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрд▓рдИрдбреА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреИрд░ рдкрд░ рдмреИрдарддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреНрд▓рд╛рд╕
Pin
рдмрдирд╛рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ
Port<>
рдФрд░ рд▓реЗрдЧ рдирдВрдмрд░ рд╣реЛрдЧрд╛ред рдЪреВрдВрдХрд┐
Port<>
рдкреНрд░рдХрд╛рд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ, рдЕрд░реНрдерд╛рдд рд╡рд┐рднрд┐рдиреНрди рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ, рд╣рдо рдХреЗрд╡рд▓ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдХрд╛рд░ рдЯреА рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
template <typename T, std::uint8_t pinNum> struct Pin { __forceinline inline static void Toggle() { T::Toggle(pinNum) ; } } ;
рдпрд╣ рдмреБрд░рд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ
T
рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ
Toggle()
рд╡рд┐рдзрд┐ рд╣реИ рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓
Port<>
рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд╕реЗ
PortBase
рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
PortBase
рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╕реЗ
Port<>
рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд╣рдо рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░рд╛ рдкрд╛рд╕ рдЯрд╛рдЗрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
PortBase
рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
constexpr std::uint32_t OdrAddrShift = 20U; struct PortBase { }; template <std::uint32_t addr> struct Port: PortBase { __forceinline inline static void Toggle(const std::uint8_t bit) { *reinterpret_cast<std::uint32_t*>(addr ) ^= (1 << bit) ; } }; template <typename T, std::uint8_t pinNum, class = typename std::enable_if_t<std::is_base_of<PortBase, T>::value>>
рдЕрдм рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рдХреЗрд╡рд▓ рддрднреА
PortBase
рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдореЗрдВ рдмреЗрд╕ рдХреНрд▓рд╛рд╕
PortBase
ред
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрди рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд┐рдирд╛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
using PortA = Port<GpioaBaseAddr> ; using PortC = Port<GpiocBaseAddr> ; using Led1 = Pin<PortA, 5> ; using Led2 = Pin<PortC, 5> ; using Led3 = Pin<PortC, 8> ; using Led4 = Pin<PortC, 9> ; int main() { for(;;) { Led1::Toggle(); Led2::Toggle(); Led3::Toggle(); Led4::Toggle(); delay(); } return 0 ; }
рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЛрдб рдореЗрдореЛрд░реА рдХреА 271 рдмрд╛рдЗрдЯреНрд╕
рд░реАрдбрдУрдирд▓реА рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреА 1 рдмрд╛рдЗрдЯ
рд░реАрдбрд░рд╛рдИрдЯ рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреЗ 24 рдмрд╛рдЗрдЯреНрд╕
рд░реИрдо рдореЗрдВ рдпреЗ рдЕрддрд┐рд░рд┐рдХреНрдд 16 рдмрд╛рдЗрдЯ рдФрд░ рд░реЛрдо рдореЗрдВ 16 рдмрд╛рдЗрдЯреНрд╕ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдПред рд╡реЗ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЖрдП рдереЗ рдХрд┐ рд╣рдо рдкреЛрд░реНрдЯ рдХреНрд▓рд╛рд╕ рдХреЗ рдЯреЙрдЧрд▓ рдлрд╝рдВрдХреНрд╢рди (const std :: uint8_t bit) рдХреЗ рдмрд┐рдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░, рдЬрдм рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдЯреИрдХ рдкрд░ 4 рдЕрддрд┐рд░рд┐рдХреНрдд рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рд░рдЬрд┐рд╕реНрдЯрд░ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рди рдХреЗ рд▓рд┐рдП рд▓реЗрдЧ рдирдВрдмрд░ рдХреЗ рдорд╛рди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рдореБрдЦреНрдп рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рд╕реНрдЯреИрдХ рд╕реЗ рдЗрди рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЗрдХрд╛рд░ рдХрд╛рдо рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлрдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдВрдкрд╛рдЗрд▓рд░ рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рдЖрдк рдкреЛрд░реНрдЯ рдХреНрд▓рд╛рд╕ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдирд┐рдХрд╛рд▓рдХрд░,
Pin
рдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЛрд░реНрдЯ рдПрдбреНрд░реЗрд╕, рдФрд░
Toggle()
рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдУрдбреАрдЖрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдкрддреЗ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ:
constexpr std::uint32_t OdrAddrShift = 20U; template <std::uint32_t addr, std::uint8_t pinNum, struct Pin { __forceinline inline static void Toggle() { *reinterpret_cast<std::uint32_t*>(addr + OdrAddrShift ) ^= (1 << bit) ; } } ; using Led1 = Pin<GpioaBaseAddr, 5> ;
рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЗрд╕ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рд╕рдВрд░рдХреНрд╖рдг рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред
рд╣рдо рдордзреНрдпрдо рдкрд░ рдЕрдиреБрдХреВрд▓рди рдбрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрддреЗ рд╣реИрдВ:
251 рдмрд╛рдЗрдЯреНрд╕ рдХреЛрдб рдореЗрдореЛрд░реА рдХреА рдмрд╛рдЗрдЯ
рд░реАрдбрдУрдирд▓реА рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреА 1 рдмрд╛рдЗрдЯ
рд░реАрдбрд░рд╛рдЗрдЯрдЗрдЯ рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреЗ 8 рдмрд╛рдЗрдЯреНрд╕
рд╡рд╛рд╣ рд╡рд╛рд╣ рд╡рд╛рд╣ ... рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 4 рдмрд╛рдЗрдЯреНрд╕ рдХрдо рд╣реИрдВ
sishnogo рдХреЛрдб255 рдмрд╛рдЗрдЯреНрд╕ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЛрдб рдореЗрдореЛрд░реА
рд░реАрдбрдУрдирд▓реА рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреА 1 рдмрд╛рдЗрдЯ
рд░реАрдбрд░рд╛рдЗрдЯрдЗрдЯ рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреЗ 8 рдмрд╛рдЗрдЯреНрд╕
рдпрд╣ рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдЖрдЗрдП рд╕реА + рдХреЛрдб (рдмрд╛рдПрдВ) рдФрд░ рд╕реА рдХреЛрдб (рджрд╛рдПрдВ) рдХреЗ рд▓рд┐рдП рдбрд┐рдмрдЧрд░ рдореЗрдВ рдХреЛрдбрд╛рдВрддрд░рдХ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрд┐рд▓реНрдЯ-рдЗрди рдХрд┐рдпрд╛, рдЕрдм рдЗрд╕рдореЗрдВ рдХреЛрдИ рдХреЙрд▓ рдирд╣реАрдВ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдпрд╣ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕реА рдХреЛрдб рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рдпрд╛ рддреЛ R1 рдпрд╛ R2 рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреЛрд░реНрдЯ рдПрдбреНрд░реЗрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рд░ рдмрд╛рд░ рдмрд┐рдЯ рд╕реНрд╡рд┐рдЪ рд╣реЛрдиреЗ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИ (рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдПрдбреНрд░реЗрд╕ рдХреЛ R1 рдпрд╛ R2 рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ)ред рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдЖрд░ 1 рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо 3 рдХреЙрд▓ рд╣рдореЗрд╢рд╛ рдкреЛрд░реНрдЯ рд╕реА рд╕реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╕рдорд╛рди рдкреЛрд░реНрдЯ рд╕реА рдкрддреЗ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдирддреАрдЬрддрди, 2 рдЯреАрдо рдФрд░ 4 рдмрд╛рдЗрдЯреНрд╕ рдмрдЪрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рдпрд╣ рдЖрдзреБрдирд┐рдХ рд╕рдВрдХрд▓рдХ рдХрд╛ рдПрдХ рдЪрдорддреНрдХрд╛рд░ рд╣реИ :) рдареАрдХ рд╣реИ, рдареАрдХ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреЛрдИ рднреА рд╡рд╣рд╛рдВ рд░реБрдХ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЪрд▓реЛ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВред рд▓реЗрдХрд┐рди рдореБрдЦреНрдп () рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рд╕рд╛рде рдЖрдк рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рднреА рдПрд▓ рдИ рдбреА рдХрд╣реАрдВ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╣реЛрдВ, рдФрд░ рдЖрдк рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ... рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
int main() { for(;;) { LedsContainer::ToggleAll() ; delay(); } return 0 ; }
рд╣рдо рдмреЗрд╡рдХреВрдлреЛрдВ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ 4 рдПрд▓ рдИ рдбреА рдХреЗ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ LEDsContainer :: ToggleAll, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ :)ред рд╣рдо рдПрд▓ рдИ рдбреА рдХреЛ рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд░ рдЯреЙрдЧрд▓ () рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВред
рдЫрд╛рддреНрд░реЛрдВ рдиреЗ рдПрд▓рдЗрдбреА рд╕реЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
Pin<PortA, 5>
,
Pin<PortC, 5>
, рдФрд░ рдореИрдВ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╕реНрдЯреЛрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЖрдк рд╕рднреА рдкрд┐рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА рдФрд░ рдореИрдВ рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рдЬреАрддрдиреЗ рдореЗрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЯрдкрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдорд╛рдорд▓рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
class LedsContainer { private: constexpr static auto records = std::make_tuple ( Pin<PortA, 5>{}, Pin<PortC, 5>{}, Pin<PortC, 8>{}, Pin<PortC, 9>{} ) ; using tRecordsTuple = decltype(records) ; }
рдПрдХ рдорд╣рд╛рди рдХрдВрдЯреЗрдирд░ рд╣реИ, рдпрд╣ рд╕рднреА рдПрд▓рдИрдбреА рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИред рдЕрдм рдЗрд╕рдореЗрдВ
ToggleAll()
рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:
class LedsContainer { public: __forceinline static inline void ToggleAll() {
рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдЯреНрдпреВрдкрд▓ рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ рдЪрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЯрдкрд▓ рддрддреНрд╡ рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЯрдкрд▓ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреНрд░рд╛рдкреНрдд рд╡рд┐рдзрд┐ рд╣реИред рдЦреИрд░ рдпрд╛рдиреА рдЕрдЧрд░ рд╣рдо
std::get<0>(records).Toggle()
рд▓рд┐рдЦрддреЗ рд╣реИрдВ
std::get<0>(records).Toggle()
, рддреЛ
Toggle()
рд╡рд┐рдзрд┐ рдХреЛ рдХреНрд▓рд╛рд╕
Pin<PortA, 5>
рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдЧрд░
std::get<1>(records).Toggle()
Pin<PortA, 5>
std::get<1>(records).Toggle()
ред рддрдм
Toggle()
рд╡рд┐рдзрд┐ рдХреЛ рдХрдХреНрд╖рд╛
Pin<Port, 5>
рдФрд░ рдЗрддрдиреЗ рдкрд░ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ...
рдЖрдк
рдЕрдкрдиреЗ рдЫрд╛рддреНрд░реЛрдВ рдХреА рдирд╛рдХ рдкреЛрдВрдЫ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╕ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
__forceinline static inline void ToggleAll() { std::get<0>(records).Toggle(); std::get<1>(records).Toggle(); std::get<2>(records).Toggle(); std::get<3>(records).Toggle(); }
рд▓реЗрдХрд┐рди рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рддрдирд╛рд╡ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдХреЛрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЕрдкрдиреА рдХрдВрдкрдиреА рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЦрд░реНрдЪ рдХрд░рддреЗ рд╣реБрдП, рдХрд╣рддреЗ рд╣реИрдВ, рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рдПрд▓рдИрдбреА рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдЖрдкрдХреЛ рджреЛ рдЬрдЧрд╣реЛрдВ рдкрд░, рдЯрдкрд▓ рдореЗрдВ рдФрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рдХреЛрдб рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ - рдФрд░ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХрдВрдкрдиреА рдХрд╛ рдорд╛рд▓рд┐рдХ рдмрд╣реБрдд рдкреНрд░рд╕рдиреНрди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯрдкрд▓ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:
class class LedsContainer { friend int main() ; public: __forceinline static inline void ToggleAll() {
рдпрд╣ рдбрд░рд╛рд╡рдирд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреА рдХрд┐
рд╢рд┐рдЬрд╝рдиреА рд╡рд┐рдзрд┐ рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ ...
рд╕рдВрдХрд▓рди рдордВрдЪ рдкрд░ рдКрдкрд░ рд╕реЗ рдпрд╣ рд╕рдм рдЬрд╛рджреВ рд╕рдЪрдореБрдЪ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:
рдЖрдЧреЗ рдмрдврд╝реЛ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд┐рдирд╛ рдХреЛрдб рдЖрдХрд╛рд░ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЬрд╛рдВрдЪ рдХрд░реЗрдВ:
рд╡рд╣ рдХреЛрдб рдЬреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ #include <cstddef> #include <tuple> #include <utility> #include <cstdint> #include <type_traits> //#include "stm32f411xe.h" #define __forceinline _Pragma("inline=forced") constexpr std::uint32_t GpioaBaseAddr = 0x4002'0000 ; constexpr std::uint32_t GpiocBaseAddr = 0x4002'0800 ; constexpr std::uint32_t OdrAddrShift = 20U; struct PortBase { }; template <std::uint32_t addr> struct Port: PortBase { __forceinline inline static void Toggle(const std::uint8_t bit) { *reinterpret_cast<std::uint32_t*>(addr + OdrAddrShift) ^= (1 << bit) ; } }; template <typename T, std::uint8_t pinNum, class = typename std::enable_if_t<std::is_base_of<PortBase, T>::value>> struct Pin { __forceinline inline static void Toggle() { T::Toggle(pinNum) ; } } ; using PortA = Port<GpioaBaseAddr> ; using PortC = Port<GpiocBaseAddr> ; //using Led1 = Pin<PortA, 5> ; //using Led2 = Pin<PortC, 5> ; //using Led3 = Pin<PortC, 8> ; //using Led4 = Pin<PortC, 9> ; class LedsContainer { friend int main() ; public: __forceinline static inline void ToggleAll() { // 3,2,1,0 , visit(std::make_index_sequence<std::tuple_size<tRecordsTuple>::value>()); } private: __forceinline template<std::size_t... index> static inline void visit(std::index_sequence<index...>) { Pass((std::get<index>(records).Toggle(), true)...); } __forceinline template<typename... Args> static void inline Pass(Args... ) { } constexpr static auto records = std::make_tuple ( Pin<PortA, 5>{}, Pin<PortC, 5>{}, Pin<PortC, 8>{}, Pin<PortC, 9>{} ) ; using tRecordsTuple = decltype(records) ; } ; void delay() { for (int i = 0; i < 1000000; ++i){ } } int main() { for(;;) { LedsContainer::ToggleAll() ; //GPIOA->ODR ^= 1 << 5; //GPIOC->ODR ^= 1 << 5; //GPIOC->ODR ^= 1 << 8; //GPIOC->ODR ^= 1 << 9; delay(); } return 0 ; }
рдЕрд╕реЗрдВрдмрд▓рд░ рд╕рдмреВрдд, рдирд┐рдпреЛрдЬрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдирдкреИрдХреНрдб: рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдореЗрдореЛрд░реА рдУрд╡рд░рдХрд┐рд▓ рд╣реИ, 18 рдмрд╛рдЗрдЯреНрд╕ рдЕрдзрд┐рдХ рд╣реИред рд╕рдорд╕реНрдпрд╛рдПрдВ рд╕рдорд╛рди рд╣реИрдВ, рд╕рд╛рде рд╣реА рдПрдХ рдФрд░ 12 рдмрд╛рдЗрдЯреНрд╕ред рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рд╡реЗ рдХрд╣рд╛рдБ рд╕реЗ рдЖрдП рд╣реИрдВ ... рд╢рд╛рдпрдж рдХреЛрдИ рд╕рдордЭрд╛рдПрдЧрд╛ред
рд░реАрдбрдСрдирд▓реА рдХреЛрдб рдореЗрдореЛрд░реА рдХреЗ 283 рдмрд╛рдЗрдЯреНрд╕
рд░реАрдбрдУрдирд▓реА рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреА 1 рдмрд╛рдЗрдЯ
рд░реАрдбрд░рд╛рдИрдЯ рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреЗ 24 рдмрд╛рдЗрдЯреНрд╕
рдЕрдм рдордзреНрдпрдо рдЕрдиреБрдХреВрд▓рди рдФрд░ рд▓реЛ рдФрд░ рдирд┐рд╣рд╛рд░рдирд╛ рдкрд░ рдПрдХ рд╣реА рдмрд╛рдд ... рд╣рдореЗрдВ рдорд╛рдереЗ рдореЗрдВ рд╕реА ++ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдорд╛рди рдХреЛрдб рдФрд░ рдЕрдзрд┐рдХ рдЖрд╢рд╛рд╡рд╛рджреА рд╕реА рдХреЛрдб рдорд┐рд▓рд╛ред
251 рдмрд╛рдЗрдЯреНрд╕ рдХреЛрдб рдореЗрдореЛрд░реА рдХреА рдмрд╛рдЗрдЯ
рд░реАрдбрдУрдирд▓реА рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреА 1 рдмрд╛рдЗрдЯ
рд░реАрдбрд░рд╛рдЗрдЯрдЗрдЯ рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХреЗ 8 рдмрд╛рдЗрдЯреНрд╕
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ рдЬреАрдд рдЧрдпрд╛, рдФрд░
рдХреИрдирд░реА рджреНрд╡реАрдк рдкрд░ рдЪрд▓рд╛ рдЧрдпрд╛ рдФрд░ рдЪреЗрд▓реНрдпрд╛рдмрд┐рдВрд╕реНрдХ рдореЗрдВ рдЖрд░рд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рдиреНрди рд╣реВрдВ :), рд▓реЗрдХрд┐рди рдЫрд╛рддреНрд░ рднреА рдорд╣рд╛рди рдереЗ, рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкрд░реАрдХреНрд╖рд╛ рдЙрддреНрддреАрд░реНрдг рдХреА!
рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рдХреЛрдб рдпрд╣рд╛рдБ рд╣реИрдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдареАрдХ рд╣реИ, рдореИрдВ рд╕рд╛рде рдЖрдпрд╛ рдерд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ EEPROM рдореЗрдореЛрд░реА рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ рдФрд░ рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╡рд░реНрдЧ рд╣реИ (рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдкрдврд╝реЗрдВ, рд▓рд┐рдЦреЗрдВ, рд▓рд┐рдЦреЗрдВ)ред рд╡рд░реНрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ, рдЬреИрд╕реЗ
Param<float<>>
,
Param<int<>>
рдФрд░ рдЖрдкрдХреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рд╕рднреА рдХреЛ рдПрдХ рдЯрдкрд▓ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рдЕрд▓рдЧ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░
SetToDefault()
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред рд╕рдЪ рд╣реИ, рдЕрдЧрд░ рдРрд╕реЗ 100 рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рддреЛ рд░реЛрдо рдмрд╣реБрдд рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд░реИрдо рдХреЛ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
PS рдореБрдЭреЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЕрдзрд┐рдХрддрдо рдЕрдиреБрдХреВрд▓рди рдкрд░ рдпрд╣ рдХреЛрдб C рдФрд░ рдореЗрд░реЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдЖрдХрд╛рд░ рдЬреИрд╕рд╛ рд╣реИред рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдХреЛрдб рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд╕рднреА рдкреНрд░рдпрд╛рд╕ рдПрдХ рд╣реА рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдкрд░ рдЖрддреЗ рд╣реИрдВред
P.S1
рдЕрдЪреНрдЫреА рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП 0xd34df00d рдзрдиреНрдпрд╡рд╛рджред рдЖрдк
std::apply()
рд╕рд╛рде рдПрдХ рдЯрдкрд▓ рдХреЛ рдЦреЛрд▓рдирд╛ рд╕рд░рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
ToggleAll()
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХреЛрдб рдлрд┐рд░ рдЗрд╕реЗ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ:
__forceinline static inline void ToggleAll() { std::apply([](auto... args) { (args.Toggle(), ...); }, records); }
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, IAR рдореЗрдВ, std :: рд▓рд╛рдЧреВ рдЕрднреА рддрдХ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛,
std рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрдЦреЗрдВ
:: рд▓рд╛рдЧреВ рдХрд░реЗрдВ