C ++ рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрдм рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде

рдХреЙрд░реНрдЯреЗрдХреНрд╕ рдПрдордПрдХреНрд╕ рдХреЛрд░ рдХреЗ рд╕рд╛рде рдПрдЖрд░рдПрдо (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдПрд╕рдЯреАрдПрдо 32 рдПрдл 10 рдПрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)


KDPV ARM Cortex M3 STM32F103c8t6 рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд╢реМрдХрд┐рдпрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП 32-рдмрд┐рдЯ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд╕рдбреАрдХреЗ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рдпрдВрддреНрд░рдХ рдХреА рдкрд░рд┐рдзрд┐ рдХреЗ рдирд┐рд░реНрдзрд╛рд░рдг рдХреЗ рд▓рд┐рдП рд╕реА ++ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

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

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкрд╣рд▓реЗ рдЗрд╕ рдкрд╛рд░ рдирд╣реАрдВ рдЖрдП рд╣реИрдВ, рдореИрдВ рдереЛрдбрд╝рд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд╣реА рдкрд╛рдардХ рдЬреЛ рдЗрд╕рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рд╡реЗ рдЗрд╕ рд╡рд┐рд╡рд░рдг рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

/* =========================================================================*/ typedef struct { __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x00 */ . . . __IO uint32_t ISR; /*!< USART Interrupt and status register, ... */ } USART_TypeDef; // USART_Type   . /* =========================================================================*/ #define USART1_BASE (APBPERIPH_BASE + 0x00013800) . . . #define USART1 ((USART_TypeDef *) USART1_BASE) #define USART1_BASE 0x400xx000U 

рдЖрдк рдпрд╣рд╛рдБ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ stm32f103xb.h here 800 kB

рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЗрд╡рд▓ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рд╕реНрдЯреЗрдЯрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛):

 // ---------------------------------------------------------------------------- if (USART1->ISR & (ONE_ISR_FLAG & OTHER_ISR_FLAG)) { } 

рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ CMSIS рдФрд░ HAL рдХреЗ рд░реВрдк рдореЗрдВ рдЬреНрдЮрд╛рдд рдореМрдЬреВрджрд╛ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рд╕рдорд╛рдзрд╛рди рд╢реМрдХрд┐рдпрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк C ++ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 // ---------------------------------------------------------------------------- USART_TypeDef & Usart1 = *USART1; // ---------------------------------------------------------------------------- if (Usart1.ISR & (ONE_ISR_FLAG & OTHER_ISR_FLAG)) { } 

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

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЗрд╕ рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рдХреЛ рддреБрд░рдВрдд рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ (EUSART - рдПрдХреНрд╕рдЯреЗрдВрдбреЗрдб рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рд╕реАрд░рд┐рдпрд▓ asinhronous reseiver- рдЯреНрд░рд╛рдВрд╕рдореАрдЯрд░) рдкрд░ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЗрддрдирд╛ рдЖрдХрд░реНрд╖рдХ, рдПрдбрд╡рд╛рдВрд╕ рдлреАрдЪрд░реНрд╕ рдХреЗ рд╕рд╛рде, рдПрдХ рд╕реАрд░рд┐рдпрд▓ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЯреНрд░рд╛рдВрд╕реАрд╡рд░ рдФрд░ рд╣рдорд╛рд░реЗ рдЫреЛрдЯреЗ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рдбреЗрд╕реНрдХрдЯреЙрдк рд╕рд┐рд╕реНрдЯрдо рдпрд╛ рд▓реИрдкрдЯреЙрдк рд╕реЗ тАЛтАЛрдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ, рд▓реЗрдХрд┐рди рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛрд░реНрдЯреЗрдХреНрд╕ рдХреЛ рдПрдХ рд╡рд┐рдХрд╕рд┐рдд рдХреНрд▓реЙрдХрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЗрд╕реА I / O рдкрд┐рди рдХреЛ рдмрд╛рд╣реНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ STM32F1xx рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдкреИрд░ рдЕрдиреНрдп рдПрдЖрд░рдПрдо рдХреЙрд░реНрдЯреЗрдХреНрд╕ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рд╕рд┐рд░реНрдл рдкрд░рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЗрдирдкреБрдЯ рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдВрджрд░рдЧрд╛рд╣ рдкрд┐рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

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

 /* =========================================================================*/ typedef struct { . . . } RCC_TypeDef; 

рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдЗрд╕ рддрд░рд╣ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ __IO рдЕрд╕реНрдерд┐рд░рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:

 /* =========================================================================*/ __IO uint32_t CR; 

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

рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

 /* =========================================================================*/ #define RCC ((RCC_TypeDef *)RCC_BASE) 

рдПрд╕рдбреАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд░рдЬрд┐рд╕реНрдЯрд░ рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдпрд╣рд╛рдБ рдкреЛрд░реНрдЯ рдП рдХрд╛ рд╕рдорд╛рд╡реЗрд╢ рд╣реИред

 // ---------------------------------------------------------------------------- RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; 

рдЖрдк рдПрдХ рд╕рд╛рде рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рдмрд┐рдЯреНрд╕ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 // ---------------------------------------------------------------------------- RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN; 

рдпрд╣ C ++, рдпрд╛ рдХреБрдЫ рдЕрд╕рд╛рдорд╛рдиреНрдп рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рдЕрд▓рдЧ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдУрдУрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

 // ---------------------------------------------------------------------------- Rcc.PortOn(Port::A); 

рдпрд╣ рдмреЗрд╣рддрд░ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди XXI рд╕рджреА рдореЗрдВ рд╣рдо рдереЛрдбрд╝рд╛ рдФрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ, C ++ 17 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдФрд░ рднреА рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рд▓рд┐рдЦреЗрдВрдЧреЗ:

 // ---------------------------------------------------------------------------- Rcc.PortOn<Port::A, Port::B>(); 

рдЬрд╣рд╛рдВ Rcc рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 // ---------------------------------------------------------------------------- TRcc & Rcc = *static_cast<TRcc *>RCC; 

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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ C ++ 11/14 рдорд╛рдирдХ рдореЗрдВ рдПрдХ рдлрдВрдХреНрд╢рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреБрдирд░реНрд╕рдВрдЧрдард┐рдд рдХрд░рддреЗ рд╣реБрдП рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 // ============================================================================ enum class GPort : uint32_t { A = RCC_APB2ENR_IOPAEN, B = RCC_APB2ENR_IOPBEN, C = RCC_APB2ENR_IOPCEN, }; // ---------------------------------------------------------------------------- class TRcc: public ::RCC_TypeDef { private: TRcc() = delete; ~TRcc() = delete; // ======================================================================== public: template<GPort... port> inline void PortOn(void) //    (inline) { //    -Og  -O0 APB2ENR |= SetBits<(uint32_t)port...>(); } // ------------------------------------------------------------------------ #define BITMASK 0x01 //    ,   #define MASKWIDTH 1 //      .   //          #undef. private: //   (fold)   . template<uint8_t bitmask> inline constexpr uint32_t SetBits(void) { //   ,  GPort  enum // (, , bitmask    ). // static_assert(bitmask < 16, " ."); return bitmask; } template<uint8_t bit1, uint8_t bit2, uint8_t... bit> inline constexpr uint32_t SetBits(void) { return SetBits<bit1>() | SetBits<bit2, bit...>(); } }; #undef BITMASK #undef MASKWIDTH // ------------------------------------------------------------------------ TRcc & Rcc = *static_cast<TRcc *>RCC; 

рдкреЛрд░реНрдЯ рдШрдбрд╝реА рд╕рдХреНрд╖рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

  Rcc.PortOn<GPort::A>(); 

GCC рдЗрд╕реЗ рдХрдорд╛рдВрдб рдХреЗ рдРрд╕реЗ рд╕реЗрдЯ рдореЗрдВ рддреИрдирд╛рдд рдХрд░реЗрдЧреА:

  ldr r3, [pc, #376] ; (0x8000608 <main()+392>) ldr r0, [r3, #24] orr.w r0, r0, #4 str r0, [r3, #24] 

рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛? рдЕрдЧрд▓реА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ

  Rcc.PortOn<GPort::A, GPort::B, GPort::C>(); 

рдХрд╛рд╢, рдирд╣реАрдВ рддреЛ рднреЛрд▓реЗ GCC рдиреЗ рдЕрдиреБрдЧрд╛рдореА рдкреБрдирд░рд╛рд╡рд░реНрддрди рдХреЙрд▓ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рддреИрдирд╛рдд рдХрд┐рдпрд╛:

  ldr r3, [pc, #380] ; (0x8000614 <main()+404>) ldr r0, [r3, #24] orr.w r0, r0, #4 ; APB2ENR |= GPort::A str r0, [r3, #24] ldr r0, [r3, #24] orr.w r0, r0, #28 ; APB2ENR |= Gport::B | GPort::C str r0, [r3, #24] #24] 

рдЬреАрд╕реАрд╕реА рдХреЗ рдмрдЪрд╛рд╡ рдореЗрдВ, рдореБрдЭреЗ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдХреЗрд╡рд▓ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ I / O рдкреЛрд░реНрдЯ рдХреНрд▓рд╛рд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдЦреИрд░, C ++ 17 рдорджрдж рдХрд░рдиреЗ рдХреА рдЬрд▓реНрджреА рдореЗрдВ рд╣реИред рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ TRCC рд╡рд░реНрдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВред

 // ---------------------------------------------------------------------------- class TRcc: public ::RCC_TypeDef { private: TRcc() = delete; //     ,  ~TRcc() = delete; //    . // ======================================================================== public: template<GPort... port> inline void PortOn(void) //    (inline) { //    -Og  -O0 APB2ENR |= SetBits17<(uint32_t)port...>(); } // ------------------------------------------------------------------------ #define BITMASK 0x01 //    ,   #define MASKWIDTH 1 //      .   //          #undef. private: //   (fold)   . ++ 17. template<uint8_t... bitmask> inline constexpr uint32_t SetBits17(void) { return (bitmask | ...); //     ... | bit } }; #undef BITMASK #undef MASKWIDTH 

рдЕрдм рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛:

 ldr r2, [pc, #372] ; (0x800060c <main()+396>) ldr r0, [r2, #24] orr.w r0, r0, #28 ; APB2ENR |= Gport::A | Gport::B | GPort::C str r0, [r3, #24] 

рдФрд░ рдХреНрд▓рд╛рд╕ рдХреЛрдб рд╕рд░рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИред

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

рдпрд╣рд╛рдБ C ++ рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ

 Rcc.PortOn<Port::A, Port::B, Port::C>(); 

рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдкрд░ рдХреНрд▓рд╛рд╕рд┐рдХ рдкрд╛рда:

 RCC->APB2 |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN; 

рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдПрдХ рдЗрд╖реНрдЯрддрдо рд╕реЗрдЯ рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдБ GCC рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рд╣реИ (рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдСрдл -рдСрдЧ):

  ldr r2, [pc, #372] ; (0x800060c <main()+396>) [  RCC] ldr r0, [r2, #0] ; r0 = RCC->APB2 // [  APB2] orr.w r0, r0, #160 ; r0 |= 0x10100000 str r0, [r2, #0] ; RCC->APB2 = r0 

рдЕрдм рдЖрдкрдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдкреЛрд░реНрдЯ рдХреНрд▓рд╛рд╕ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред I / O рдкреЛрд░реНрдЯ рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИ рдХрд┐ рдПрдХ рдкреЛрд░реНрдЯ рд▓реЗрдЧ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЪрд╛рд░ рдмрд┐рдЯреНрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП, 16-рдмрд┐рдЯ рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП 64 рдмрд┐рдЯреНрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рджреЛ 32-рдмрд┐рдЯ CRL рдФрд░ CRH рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВред рд╕рд╛рде рд╣реА, рдмрд┐рдЯрдорд╛рд╕реНрдХ рдХреА рдЪреМрдбрд╝рд╛рдИ 1 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ, C ++ 17 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдЗрд╕рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИред

рдЫрд╡рд┐

рдЗрд╕рдХреЗ рдмрд╛рдж, TGPIO рд╡рд░реНрдЧ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рд╕рд╛рде рд╣реА рдЕрдиреНрдп рдкрд░рд┐рдзреАрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдПрдВ, рдПрдХ рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ, I2C, SPI, DAP, рдЯрд╛рдЗрдорд░ рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ, рдЬреЛ рдЖрдо рддреМрд░ рдкрд░ ARM Cortex рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрд▓ рдИ рдбреА рдХреЗ рд╕рд╛рде рдкрд▓рдХ рдЭрдкрдХрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред

рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЧрд▓реЗ рдиреЛрдЯ рдореЗрдВред рдЧрд┐рдЯрд╣рдм рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕реВрддреНрд░ ред

рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рд▓реЗрдЦ рдиреЛрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рдХрд╛рдо рдЖрддреЗ рдереЗ


C ++ 11 рдореЗрдВ рдПрдХ рддрд░реНрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯ ред
рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдирд╡рд╛рдЪрд╛рд░ ред
рд╕реА ++ рднрд╛рд╖рд╛ рдирд╡рд╛рдЪрд╛рд░ 17ред рднрд╛рдЧ 1. рдмрд╛рддрдЪреАрдд рдФрд░ рд╡реНрдпреБрддреНрдкрддреНрддрд┐ ред
рдПрд╕рдЯреАрдПрдо рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдХреА рд▓рд┐рдВрдХ рдХреА рд╕реВрдЪреА ред
рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкреИрд░рд╛рдореАрдЯрд░ рдореИрдХреНрд░реЛрдЬрд╝

рдЦрдмрд░реЗ рдХреЗ рд▓реЗрдЦ рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдпрд╣ рдиреЛрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛


Attiny13 рдкрд░ рдЯреНрд░реИрдлрд┐рдХ рд▓рд╛рдЗрдЯ ред

рдЬреВрд▓рд┐рдпрди рдЕрд╕рд╛рдВрдЬреЗ рдХреЛ рдпреВрдХреЗ рдкреБрд▓рд┐рд╕ рдиреЗ рдХрд┐рдпрд╛ рдЧрд┐рд░рдлреНрддрд╛рд░
рдЕрд╕реНрдкрд╖реНрдЯ рд╕реНрдореГрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдВрддрд░рд┐рдХреНрд╖

рд▓рд┐рдЦрд┐рдд режрек/резреи/реирежрезреп - рд╣реИрдкреНрдкреА рдХреЙрд╕реНрдореЛрдиреЙрдЯрд┐рдХреНрд╕ рдбреЗ!

рдкреБрдирд╢реНрдЪ
STM32F103c8t6 Stm CubeMx рдореЗрдВ CubeMX рд╕реЗ рдЪрд┐рддреНрд░ STM32F103c8t6ред

рдПрдХ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ, GNU MCU рдЧреНрд░рд╣рдг рдПрдЖрд░рдПрдо рдПрдВрдмреЗрдбреЗрдб рдФрд░ STM CubeMX рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд▓рд┐рдкреНрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдкрд╛рда рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЕрд░реНрдерд╛рддреН рдорд╛рдирдХ C ++, _start () рдФрд░ _init () рдлрд╝рдВрдХреНрд╢рди рдХреА рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ, рдЬреЛ рдЧреНрд░рд╣рдг рд╡реИрдХреНрдЯрд░ MCU рд╕реЗ рдЗрдВрдЯрд░рдкреНрдЯ рд╡реИрдХреНрдЯрд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рд▓рд┐рдП рдЧрдП рд╣реИрдВред рдПрдЖрд░рдПрдо рдПрдВрдмреЗрдбреЗрдб, рдФрд░ рдХреЙрд░реНрдЯреЗрдХреНрд╕ рдПрдо 3 рдХреЛрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдФрд░ рдХрд╛рдо рдлрд╛рдЗрд▓реЗрдВ рдХреНрдпреВрдмрдПрдХреНрд╕рдПрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд╣реИрдВред


рдкреА рдкреА рдПрд╕
KDPV рдкрд░ STM32F103c8t6 рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд╕рд╛рде рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рднреА рдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рдмреЛрд░реНрдб рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЦрд░реАрджрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИред

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


All Articles