ã¯ããã«
ãã®çãã¡ã¢ã«ã¯ã以äžã®åé¡ã«å¯Ÿããæãããªè§£æ±ºçãå«ãŸããŠããªããããç ãã¬å€ãäœåºŠãè¡ããªããã°ãªããŸããã§ããã
ã¿ã¹ã¯ïŒãã€ã¯ãã³ã³ãããŒã©ãŒã®åšèŸºãŠãããã®åäœã«é¢ãããŠãŒã¶ãŒæå®ã®ããŒã¿ã«åºã¥ããŠããªã¢ã«ã¿ã€ã ã§äœ¿çšã§ããã¬ãžã¹ã¿ãŒã®æ§æãã¹ã¯ã®é
åãã³ã³ãã€ã«æ®µéã§ååŸããŸãã åæã«ãã³ã³ãã€ã«æ®µéã§ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒãæ£ããèšå®ãããŠããããšã確èªããå¿
èŠããããŸãïŒãã€ã¯ãã³ã³ãããŒã©ãŒã®åšèŸºæ©åšãæ£ããæ§æãããŸãïŒã

ãããã©ããã£ãŠè¡ããã«èå³ããã人ã¯ãç«ã®äžã§ãé¡ãããŸãã
ç®æ¬¡ïŒ
- C ++ 14.ã®äž»ãªåé¡ãšå¶éã
- ãŠãŒã¶ãŒã決ããŠééããããªããšããäºå®ã«åºã¥ããœãªã¥ãŒã·ã§ã³ã
- ãŠãŒã¶ãŒãšã©ãŒã®èª¬æã
- ã¯ã©ã¹ãæ¡åŒµããŸãã
- ç¥ç§°ãšã³ããªã«ã€ããŠã
- çµæã
C ++ 14ã®äž»ãªåé¡ãšå¶é
ã¯ããã«èª¬æããã¿ã¹ã¯ã«åºäŒã£ããšããã«ãC ++èšèªæå®å
constexprãããã«æãåºããŸããã ãã®åé¡ã解決ããå¿
èŠæ§ã¯ãã©ã€ãã©ãªã®èšèšæ®µéã§ãç¹å®ããããããC ++ 11æšæºã®ãã¹ãŠã®å¶éãèæ
®ãããŸãããããã¯ãããšããšã©ã€ãã©ãªã®æ§ç¯ãèšç»ãããŠããŸããïŒconstexprã¡ãœããå
ã§ã«ãŒãã䜿çšã§ããªããªã©ïŒãããã³ã©ã€ãã©ãªèšèªãšããŠC ++ 14æšæºãéžæãããC ++ 11ã®å¶éã®å€ããåé€ãããŸããïŒC ++ 17ã¯ãã©ã€ãã©ãªã«èšå®ãããã¿ã¹ã¯ã®èŠ³ç¹ãããC ++ 14ãšããŸãå€ãããªãã£ããããæå³çã«éžæãããŸããã§ããïŒãããã¡ã€ã³ãšããŠãéžã°ããGCCããã®åœŒã®ãµããŒãã§ã å·çæç¹ã§ã¯ãã©ã€ãã©ãªã³ã³ãã€ã©ã¯å®å®ããŠããŸããïŒã
ããããC ++ 14ã®constexpré¢æ°ã¯ãªã¢ã«ã¿ã€ã é¢æ°ãšã»ãŒåãããã«æè»ã«ãªã£ããšããäºå®ã«ãé¢ãããã倧éšåã®å©ç¹-ãããã°ã®æ¬ åŠ-ãåãæ¶ã倪ããã€ãã¹èšå·ã1ã€æ®ã£ãŠããŸãã ããã«ã€ããŠã¯ã
ãã¡ãã® Habréã«æžãããŠã
ãŸã ã ãã®èšäºãããç§ã¯äž»ãªã¢ã€ãã¢ãåŸãŸããïŒ
ããããåé¡ã¯ããã ãã§ã¯çµãããŸããã åŸã§ãã䜿çšããconstexpré¢æ°ãäœæããå Žåãèªã¿åãå¯èœãªãšã©ãŒãè¿ããšäŸ¿å©ã§ãã ããã§ã¯ãstatic_assertãããã«ã¡ããã©é©åã§ãããšèª€ã£ãŠæ³å®ãããå¯èœæ§ããããŸãã ãã ããé¢æ°ãã©ã¡ãŒã¿ãŒã¯constexprã«ã§ããªããããstatic_assertã¯äœ¿çšã§ããŸãããããã¯ãã³ã³ãã€ã«æã«ãã©ã¡ãŒã¿ãŒå€ãèªèãããããšãä¿èšŒãããªãçç±ã§ãã
ãšã©ãŒã衚瀺ããæ¹æ³ã¯ïŒ ç§ãèŠã€ããå€ããå°ãªããéåžžã®æ¹æ³ã¯ãäŸå€ãã¹ããŒããããšã§ãïŒ
constexprã¡ãœããã§ã¯äŸå€ããµããŒããããŠããªããããconstexprã§throwã䜿çšããããšã¯äžå¯èœã§ãããšãããšã©ãŒã衚瀺ãããŸãã ã«ãŒãå
ã§äœããåŠçããå Žåãã©ã®èŠçŽ ãäŸå€ã«ãªã£ããã確èªããéã«ãã©ã®èŠçŽ ã«èœã¡ãããèŠã€ããããšã¯ã§ããŸããã
ç¶æ³ã¯æ¬¡ã®ãšããã§ããstatic_assertã¯äžå¯èœãthrowã¯äžå¯ãprintfãšå²ã蟌ã¿ã³ã³ãã€ã«ã¯äžå¯ã§ãã
ãŠãŒã¶ãŒã決ããŠééããããªããšããäºå®ã«åºã¥ããœãªã¥ãŒã·ã§ã³
ãããã®ãã¹ãŠã®å¶éãšãããã°ã§ããªãããšã¯ã©ãã§ããïŒ ããããã
ãŠãŒã¶ãŒã¯æ±ºããŠãã¹ãããªããšä»®å®ããŸãããïŒã¯ããæªæ¥çã§ãããä»ã®ãšãããããå
¬çãšèããŸãïŒã ããããconstexprã¯ãååãšããŠãå
¥åãã©ã¡ãŒã¿ãŒãæ£ãããªããšããäŸå€ããããã°ããã³ã¹ããŒããå¿
èŠããªãããšãããããŸããã
äŸãšããŠã誰ãã«ãã£ãŠæåã«ãªã³ã«ãããïŒã¯ããã¯ä¿¡å·ãåšèŸºè£
眮ã«éä¿¡ãããïŒãã€ã¯ãã³ã³ãããŒã©ãŒããŒã端æ«åºåå¶åŸ¡ãªããžã§ã¯ãã®ã¯ã©ã¹ãšãåºåãç®çã®é床ã§åºåã§æ§æãããïŒLEDãç¹æ»
ãããïŒããšãèããŸãã å®éãã¯ã©ã¹ã®ãªããžã§ã¯ãã«ã¯ãåºåç¶æ
ã1ãã0ã«ããŸãã¯ãã®éã«åãæ¿ããã¡ãœãããå¿
èŠã§ãã ç§ãã¡ã®æœèšãããã以äžã¯å¿
èŠãããŸããã
ãã ãããšãã»ã³ã¹ãçæããªãããã«ã1ã€ã®åºåå
šäœã®æ§æãèšè¿°ããæ§é ããããšä»®å®ããŸãã ãã®æ§é ã¯ããªããžã§ã¯ãã®ã¯ã©ã¹ã ãã§ãªããä»ã®ã¯ã©ã¹ïŒããšãã°ãäºåã«ã¢ãžã¥ãŒã«ãåæåããåºåãç®çã®ç¶æ
ã«æ§æããã¯ã©ã¹ïŒã§ã䜿çšãããŸãã ãã®æ§é ã¯æ¬¡ã®ããã«ãªããŸãã
struct __attribute__( ( packed ) ) pin_config_t { EC_PORT_NAME port;
ãã®æ§é ã¯ã次ã®åæã¯ã©ã¹ã䜿çšããŸãã enum class EC_PORT_PIN_NAME { PIN_0 = 0, PIN_1 = 1, PIN_2 = 2, PIN_3 = 3, PIN_4 = 4, PIN_5 = 5, PIN_6 = 6, PIN_7 = 7, PIN_8 = 8, PIN_9 = 9, PIN_10 = 10, PIN_11 = 11, PIN_12 = 12, PIN_13 = 13, PIN_14 = 14, PIN_15 = 15 }; enum class EC_PIN_MODE { INPUT = 0,
åè¿°ã®ããã«ãã¯ã©ã¹ã®ãªããžã§ã¯ãã¯ãåºåã®åºåïŒã¬ãã°ïŒã®ç¶æ
ã®ã¿ãå€æŽããå¿
èŠããããŸãã ã©ã€ãã©ãªã¯stm32f2ïŒããã³å¯äžïŒã§èšè¿°ãããŠããããããã®ç®çã®ããã«åããŒãã®GPIOç©çãããã¯ã§
BSRã¬ãžã¹ã¿ã䜿çšããã®ãåççã§ããããã«ãããããã0-15ã«ãŠãããïŒ1ïŒãæžã蟌ã¿ã察å¿ããããããèšå®ã§ããŸãïŒãŠãããïŒ1ïŒãæžã蟌ãïŒ 0çªç®ã®ãããã¯ããŒã0ã®åºåç¶æ
ã1ã«èšå®ãããŠãããïŒ1ïŒã16-31ã«æžã蟌ãããšã«ããã察å¿ãããããã16ã«ãªã»ããããŸãïŒãŠãããïŒ1ïŒã31çªç®ã®ãããã«æžã蟌ããšã31-16 = 15çªç®ã®ããŒããã³ããªã»ãããããŸãïŒ 0ïŒã
ã芧ã®ãšãããç®çã®åºåã1ã«èšå®ããã¿ã¹ã¯ã¯ãBSRã¬ãžã¹ã¿
1 << output_numberã«æžã蟌㿠ãã¬ã³ãŒã
1 << output_number + 16ã«ãªã»ããããããšã«ãªããŸãã
ãããã®ç®çã®ããã«ããŠãŒã¶ãŒæ§é æ§é ãã
portããã³
pin_nameãã£ãŒã«ããååŸããã ãã§ååã§ãã ä»ã®ãã¹ãŠã®ãã£ãŒã«ãã¯å¿
èŠãããŸããã
ãªããžã§ã¯ãã®ã¯ã©ã¹ã®äžè¬çãªãã¥ãŒã瀺ããŸãã
class pin { public: constexpr pin ( const pin_config_t* const pin_cfg_array ); void set ( void ) const; void reset ( void ) const; void set ( uint8_t state ) const; void set ( bool state ) const; void set ( int state ) const; private: constexpr uint32_t p_bsr_get ( const pin_config_t* const pin_cfg_array ); constexpr uint32_t set_msk_get ( const pin_config_t* const pin_cfg_array ); constexpr uint32_t reset_msk_get ( const pin_config_t* const pin_cfg_array ); const uint32_t p_bsr; const uint32_t bsr_set_msk, bsr_reset_msk; };
ã芧ã®ãšããããã®ã¯ã©ã¹ã«ã¯æ¬¡ã®ã¡ãœããããããŸãã
- ãã©ã¡ãŒã¿ãªãã§èšå®-åºåã®åºåã®ç¶æ
ã1ã«èšå®ããŸãã
- reset-åºåã®åºåã®ç¶æ
ã0ã«ãªã»ããããŸãã
- ããŸããŸãªã¿ã€ãã®ãã©ã¡ãŒã¿ãŒã§èšå®ããŸã-å®éã«ã¯ãäžèšã®é¢æ°ã䜿çšããŠåºåã§ç¹å®ã®ç¶æ
ãèšå®ããã®ã¯1ã€ã®é¢æ°ã§ãïŒåŸã§èª¬æããŸãïŒã
ãããã®æ¹æ³ã¯ãã¹ãŠããŠãŒã¶ãŒããªã¢ã«ã¿ã€ã ã§äœ¿çšããŸãã ããããèæ
®ããŠãã ããã
void pin::set ( void ) const { *M_U32_TO_P(this->p_bsr) = this->bsr_set_msk; } void pin::reset ( void ) const { *M_U32_TO_P(this->p_bsr) = this->bsr_reset_msk; } void pin::set ( uint8_t state ) const { if ( state ) { this->set(); } else { this->reset(); } } void pin::set ( bool state ) const { this->set( static_cast< uint8_t >( state ) ); } void pin::set ( int state ) const { this->set( static_cast< uint8_t >( state ) ); }
setããã³resetã¡ãœããã¯ã以äžã®å®çŸ©ã䜿çšããŠãuint32_tå€æ°ã®å€ãuint32_tå€æ°ãžã®ãã€ã³ã¿ãŒã«æ瀺çã«å€æããŸãã
// uint32_t uint32_t. // . #define M_U32_TO_P(point) ((uint32_t *)(point))
çŸæç¹ã§ã¯ããªããžã§ã¯ãã®ã¡ãœãããæ¢è£œã®ãã¹ã¯ã§ã©ã®ããã«æ©èœããããç解ããŸãããæãéèŠãªããšã¯ãããããæºåããããã«æ®ã£ãŠããŸãïŒãã®èšäºã®ç®çïŒã
ã¯ã©ã¹ã«ã¯3ã€ã®ã¡ãœããããããŸãã
- set_msk_get-uint32_tå€æ°ã®å€ãè¿ããŸããããã¯ããŠãŒã¶ãŒå®çŸ©ã®åºåã<< 1 >>ã«èšå®ããããã®BSRã¬ãžã¹ã¿ã®ãã¹ã¯ã§ãã
- reset_msk_get-å€æ°ã®uint32_tå€ãè¿ããŸããããã¯ããŠãŒã¶ãŒå®çŸ©ã®åºåã<< 0 >>ã«ãªã»ããããããã®BSRã¬ãžã¹ã¿ã®ãã¹ã¯ã§ãã
- p_bsr_get-ãã€ã¯ãã³ã³ãããŒã©ã®ç©çã¡ã¢ãªã«ãŒãäžã®BSRã¬ãžã¹ã¿ã®ã¢ãã¬ã¹ãå«ãuint32_tå€æ°ã®å€ãè¿ããŸãã
æ§é ãã©ã¡ãŒã¿ãŒãæå®ããéã«ãŠãŒã¶ãŒãééããªãééããªãã£ãããšãç¥ã£ãŠã次ã®ã³ãŒããæžãããšãã§ããŸãã
constexpr uint32_t pin::set_msk_get ( const pin_config_t* const pin_cfg_array ) { return 1 << M_EC_TO_U8(pin_cfg_array->pin_name); } constexpr uint32_t pin::reset_msk_get ( const pin_config_t* const pin_cfg_array ) { return 1 << M_EC_TO_U8( pin_cfg_array->pin_name ) + 16; } constexpr uint32_t pin::p_bsr_get( const pin_config_t* const pin_cfg_array ) { uint32_t p_port = p_base_port_address_get( pin_cfg_array->port ); return p_port + 0x18; }
ãããã®é¢æ°ã¯ãå®çŸ©ã䜿çšããŠãenumã¯ã©ã¹ã®å€ãuint8_tå€æ°ã«å€æããŸãã
p_bsr_getã¡ãœããã¯ãç¹å®ã®ã¯ã©ã¹ã«å±ããªã
p_base_port_address_getã¡ãœãã
ã䜿çšããŸãã
ãã®ã¡ãœããã¯ãEC_PORT_NAMEã¯ã©ã¹ã®åæå€ïŒããŒãåïŒãååŸãããã€ã¯ãã³ã³ãããŒã©ãŒã®ç©çã«ãŒãäžã®ãã®ããŒãã®ã¬ãžã¹ã¿ãŒã®äœçœ®ã®ç©çã¢ãã¬ã¹ãè¿ããŸãã 次ã®ããã«ãªããŸãã
äžè¬çãªã¡ãœããp_base_port_address_get constexpr uint32_t p_base_port_address_get( EC_PORT_NAME port_name ) { switch( port_name ) { #ifdef PORTA case EC_PORT_NAME::A: return 0x40020000; #endif #ifdef PORTB case EC_PORT_NAME::B: return 0x40020400; #endif #ifdef PORTC case EC_PORT_NAME::C: return 0x40020800; #endif #ifdef PORTD case EC_PORT_NAME::D: return 0x40020C00; #endif #ifdef PORTE case EC_PORT_NAME::E: return 0x40021000; #endif #ifdef PORTF case EC_PORT_NAME::F: return 0x40021400; #endif #ifdef PORTG case EC_PORT_NAME::G: return 0x40021800; #endif #ifdef PORTH case EC_PORT_NAME::H: return 0x40021C00; #endif #ifdef PORTI case EC_PORT_NAME::I: return 0x40022000; #endif } }
ãªã»ãã/ã»ãããã¹ã¯ã®å®æ°ãšã¬ãžã¹ã¿ã¢ãã¬ã¹ãå
¥åããã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒã¯æ¬¡ã®ãšããã§ãã
constexpr pin::pin ( const pin_config_t* const pin_cfg_array ): p_bsr ( this->p_bsr_get( pin_cfg_array ) ), bsr_set_msk ( this->set_msk_get( pin_cfg_array ) ), bsr_reset_msk ( this->reset_msk_get( pin_cfg_array ) ) {};
æè¡çã«ã¯ããã®ã¯ã©ã¹ã䜿çšã§ããããã«ãªããŸãããããŠãŒã¶ãŒãåžžã«ãã¹ãŠã®æ§é ãã©ã¡ãŒã¿ãŒãæ£ããå
¥åã§ããããã§ã¯ãªãããšãèŠããŠããŸã...
ãŠãŒã¶ãŒãšã©ãŒã®èª¬æã
äœæ¥äžã®ãããã°ãããã¯ã©ã¹ãã§ããã®ã§ãå
¥åæ§é ã®æ€èšŒãå®äºããã ãã§ãã¯ã©ã¹ã®ãªããžã§ã¯ããå®å
šã«äœ¿çšã§ããŸãã ããããåè¿°ã®ããã«ãconstexprã§ãããè¡ãã®ã¯å¿«é©ã§ã-äžå¯èœã§ãã ãããã解決çããããŸã-ãã³ãã¬ãŒãã ãŠãŒã¶ãŒã³ãŒãå
ã®ãã¹ãŠã®ãªããžã§ã¯ããã°ããŒãã«ã«èšå®ããå¿
èŠãããããïŒããã¯ã©ã€ãã©ãªã䜿çšããããã®äž»ãªæ¡ä»¶ã§ãããïŒã©ã€ãã©ãªïŒã®èª¬æã®ããã¥ã¡ã³ããèšäºã®æåŸã«èšèŒãããªã³ã¯ã§èªãããšãã§ããŸãïŒããã³ãã¬ãŒãã®äœ¿çšãæãåççã§ããããã§ãã å®éããã³ãã¬ãŒãã§ã¯static_assertãèš±å¯ãããŠããŸãã ãŸããããããçš®é¡ã®ã³ãŒãã䜿çšããŠãããè€éãªãã§ãã¯ãå®è¡ã§ããŸãã ãããŠãæãéèŠãªããšïŒ
æ§é äœããç¶æ¿ããããã³ãã¬ãŒãã¯ã©ã¹ãäœæãããã®ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§å¿
èŠãªãã¹ãŠã®ãã§ãã¯ãå®è¡ãããŠãŒã¶ãŒã³ãŒãã§ãã®ãã³ãã¬ãŒãã¯ã©ã¹ã®ãªããžã§ã¯ããã°ããŒãã«ã«å®£èšãããšãã³ã³ãã€ã©ãŒã¯ãã¯ã©ã¹ãç¶æ¿ããããŸãã«ãã®æ§é äœã«æé»çãªåå€æãé©çšã§ããããã«ãªããŸãããã®æ©äŒã¯äœ¿çšã§ããŸããïŒ
template < EC_PORT_NAME PORT, EC_PORT_PIN_NAME PIN_NAME, EC_PIN_MODE MODE, EC_PIN_OUTPUT_CFG OUTPUT_CONFIG, EC_PIN_SPEED SPEED, EC_PIN_PULL PULL, EC_PIN_AF AF, EC_LOCKED LOCKED, EC_PIN_STATE_AFTER_INIT STATE_AFTER_INIT > class pin_config_check_param : public pin_config_t { public: constexpr pin_config_check_param(): pin_config_t( { .port = PORT, .pin_name = PIN_NAME, .mode = MODE, .output_config = OUTPUT_CONFIG, .speed = SPEED, .pull = PULL, .af = AF, .locked = LOCKED, .state_after_init = STATE_AFTER_INIT } ) { #if defined(STM32F205RB)|defined(STM32F205RC)|defined(STM32F205RE) \ |defined(STM32F205RF)|defined(STM32F205RG) static_assert( PORT >= EC_PORT_NAME::A && PORT <= EC_PORT_NAME::H, "Invalid port name. The port name must be A..H." ); #endif static_assert( PIN_NAME >= EC_PORT_PIN_NAME::PIN_0 && PIN_NAME <= EC_PORT_PIN_NAME::PIN_15, "Invalid output name. An output with this name does not" "exist in any port. The output can have a name PIN_0..PIN_15." ); static_assert( MODE >= EC_PIN_MODE::INPUT && MODE <= EC_PIN_MODE::ANALOG, "The selected mode does not exist. " "The output can be set to mode: INPUT, OUTPUT, AF or ANALOG." ); static_assert( OUTPUT_CONFIG == EC_PIN_OUTPUT_CFG::PUSH_PULL || OUTPUT_CONFIG == EC_PIN_OUTPUT_CFG::OPEN_DRAIN, "A non-existent output mode is selected. " "The output can be in the mode: PUSH_PULL, OPEN_DRAIN." ); static_assert( SPEED >= EC_PIN_SPEED::LOW && SPEED <= EC_PIN_SPEED::HIGH, "A non-existent mode of port speed is selected. " "Possible modes: LOW, MEDIUM, FAST or HIGH." ); static_assert( PULL >= EC_PIN_PULL::NO_USE && PULL <= EC_PIN_PULL::DOWN, "A non-existent brace mode is selected." "The options are: NO_USE, UP or DOWN." ); static_assert( AF >= EC_PIN_AF::AF_0 && AF <= EC_PIN_AF::AF_15, "A non-existent mode of the alternative port function is selected." ); static_assert( LOCKED == EC_LOCKED::NOT_LOCKED || LOCKED == EC_LOCKED::LOCKED, "Invalid port lock mode selected." ); static_assert( STATE_AFTER_INIT == EC_PIN_STATE_AFTER_INIT::NO_USE || STATE_AFTER_INIT == EC_PIN_STATE_AFTER_INIT::SET, "The wrong state of the output is selected." "The status can be: NO_USE, UP or DOWN." ); }; };
ããã§ããŠãŒã¶ãŒã³ãŒãã§ãã®ã¯ã©ã¹ã®ãªããžã§ã¯ãã宣èšã§ããŸãã
const pin_config_check_param< EC_PORT_NAME::C, EC_PORT_PIN_NAME::PIN_4, EC_PIN_MODE::OUTPUT, EC_PIN_OUTPUT_CFG::PUSH_PULL, EC_PIN_SPEED::MEDIUM, EC_PIN_PULL::NO_USE, EC_PIN_AF::NO_USE, EC_LOCKED::LOCKED, EC_PIN_STATE_AFTER_INIT::SET > lcd_res;
ãã®åŸãã¯ã©ã¹pinã®ãªããžã§ã¯ããäœæãããšãã¯ãéåžžã®æ§é ãšããŠããããåç
§ããªãã§ãã ããã
const constexpr pin pin_lcd_res( &lcd_res );
次ã«ããŠãŒã¶ãŒã³ãŒãã§ããã®ãªããžã§ã¯ãã®ã¡ãœããã䜿çšã§ããŸãã
void port_test ( void ) { pin_lcd_res.reset(); pin_lcd_res.set(); }
ã¯ã©ã¹æ©èœãå±é
çµäºã¢ãŒãã§è¶³ãå¶åŸ¡ããã®ã«éåžžã«é©ããã¯ã©ã¹ãååŸããŸããã ãã ãããšã³ããªçšã«å¥ã®ã¯ã©ã¹ãäœæããªãã§ãã ããïŒ åºåãšå
¥åçšã«æ§æãããåºåã®äž¡æ¹ã§äœ¿çšã§ããããã«ãã¯ã©ã¹ãå°ãå€æŽããŸãã ãŸããåºåã§ç¶æ
ãå転ããæ¹æ³ãè¿œå ããŸãã
2ã€ã®å®æ°ã§ã¯ã©ã¹ãè£å®ããŸãã
- p_bb_odr_read-ããã«ã¯ãODRã¬ãžã¹ã¿ã®ãªããžã§ã¯ãåºåããããžã®ãã€ã³ã¿ãŒããããŸãïŒåºåãåºåã«äœ¿çšãããå Žåãåºååºåã§ãŠãŒã¶ãŒãèšå®ããäœçœ®ïŒã ããããã³ãã£ã³ã°é åã䜿çšã
- p_bb_idr_read-IDRã¬ãžã¹ã¿ã«ãªããžã§ã¯ãåºåããããžã®ãã€ã³ã¿ããããŸãïŒãã®ã¬ãžã¹ã¿ã«ã¯ãåºåã®æ§ææ¹æ³ã«é¢ä¿ãªããåºåå
¥åã§ã®å®éã®ç¶æ
ãå«ãŸããŸãïŒã ããããã³ãã£ã³ã°é åã䜿çšã
ç¹å®ã®åºåã«å¯ŸããŠãããã®å®æ°ã®å€ãè¿ãã¡ãœãããäœæããŸãã
constexpr uint32_t pin::bb_p_idr_read_get ( const pin_config_t* const pin_cfg_array ) { uint32_t p_port = p_base_port_address_get( pin_cfg_array->port ); uint32_t p_idr = p_port + 0x10; return M_GET_BB_P_PER(p_idr, M_EC_TO_U8(pin_cfg_array->pin_name)); } constexpr uint32_t pin::odr_bit_read_bb_p_get ( const pin_config_t* const pin_cfg_array ) { uint32_t p_port = p_base_port_address_get( pin_cfg_array->port ); uint32_t p_reg_odr = p_port + 0x14; return M_GET_BB_P_PER(p_reg_odr, M_EC_TO_U8(pin_cfg_array->pin_name)); }
ããã§ã¯ãM_GET_BB_P_PERãå®çŸ©ããŸããããã¯ãuint32_tã«ãããåšèŸºé åã®ã¬ãžã¹ã¿ã¢ãã¬ã¹ã®å€ãšããŒããããçªå·ã®uint32_tã«ãã£ãŠããã®ãããã®ããããã³ãã¢ãã¬ã¹ãè¿ããŸãã
M_GET_BB_P_PERãå®çŸ©ãã ãããã®ã³ãã³ãã®åæåãã³ã³ã¹ãã©ã¯ã¿ãŒã«è¿œå ããŸãããã
constexpr pin::pin ( const pin_config_t* const pin_cfg_array ): p_bsr ( this->p_bsr_get( pin_cfg_array ) ), p_bb_odr_read ( this->odr_bit_read_bb_p_get( pin_cfg_array ) ), bsr_set_msk ( this->set_msk_get( pin_cfg_array ) ), bsr_reset_msk ( this->reset_msk_get( pin_cfg_array ) ), p_bb_idr_read ( this->bb_p_idr_read_get( pin_cfg_array ) ) {};
ããŠããããã®å®æ°ã§åäœãããªã¢ã«ã¿ã€ã é¢æ°ãè¿œå ããŸãããã
void pin::invert( void ) const { if (*M_U32_TO_P_CONST(p_bb_odr_read)) {
ããã§ã¯ãå¥ã®1å®çŸ©ã䜿çšããïŒM_U32_TO_P_CONSTïŒãuint32_tå€æ°ã«æ ŒçŽãããŠããå€ãuint32_tæžã蟌ã¿ä¿è·å€æ°ãžã®ãã€ã³ã¿ãŒã«å€æããŸãã
æçµçã«ãã¯ã©ã¹ã¯æ¬¡ã®åœ¢åŒãåããŸããã
class pin { public: constexpr pin ( const pin_config_t* const pin_cfg_array ); void set ( void ) const; void reset ( void ) const; void set ( uint8_t state ) const; void set ( bool state ) const; void set ( int state ) const; void invert ( void ) const; int read ( void ) const; private: constexpr uint32_t p_bsr_get ( const pin_config_t* const pin_cfg_array ); constexpr uint32_t set_msk_get ( const pin_config_t* const pin_cfg_array ); constexpr uint32_t reset_msk_get ( const pin_config_t* const pin_cfg_array ); constexpr uint32_t odr_bit_read_bb_p_get ( const pin_config_t* const pin_cfg_array ); constexpr uint32_t bb_p_idr_read_get ( const pin_config_t* const pin_cfg_array ); const uint32_t p_bsr; const uint32_t bsr_set_msk, bsr_reset_msk; const uint32_t p_bb_odr_read, p_bb_idr_read; };
ç¥ç§°ãšã³ããªã«ã€ããŠã
å€ãã®å Žåãç¹å®ã®ã¿ã¹ã¯ïŒADCå
¥åãªã©ïŒã®ãªããžã§ã¯ãæ§ææ§é ãäœæããå¿
èŠããããŸãã ãã®ãããªçµè«ãå€æ°ããå Žåãæ¯åãã¹ãŠã®ãã©ã¡ãŒã¿ãŒãèšè¿°ããã®ã¯é¢åã§ãã ãããè¡ãã«ã¯ããã³ãã¬ãŒãã¯ã©ã¹ã䜿çšã§ããŸãããã³ãã¬ãŒãã¯ã©ã¹ã¯ãã³ãã¬ãŒãã¯ã©ã¹ã䜿çšããŸãã ADCã®å Žåã次ã®ããã«ãªããŸãã
template < EC_PORT_NAME PORT, EC_PORT_PIN_NAME PIN_NAME > class pin_config_adc_check_param : public pin_config_check_param< PORT, PIN_NAME, EC_PIN_MODE::INPUT, EC_PIN_OUTPUT_CFG::NO_USE, EC_PIN_SPEED::LOW, EC_PIN_PULL::UP, EC_PIN_AF::NO_USE, EC_LOCKED::LOCKED, EC_PIN_STATE_AFTER_INIT::NO_USE > { public: constexpr pin_config_adc_check_param() {}; };
ã³ãŒãå
ã®åºåã«å¿
èŠãªã¹ããŒã¹ã¯äœåãå°ãªããªããŸãã
const pin_config_adc_check_param< EC_PORT_NAME::B, EC_PORT_PIN_NAME::PIN_1 > adc_left;
ãŸãšã
ãããã£ãŠãåºåã§ã¯ãã³ã³ãã€ã«æ®µéã§RAMãäžå䜿çšãããã³ã³ã¹ãã©ã¯ã¿ãŒããªã¢ã«ã¿ã€ã ã§åŒã³åºãå¿
èŠã®ãªããªããžã§ã¯ããäœæããæ©äŒããããŸããã ãã®å Žåãããããæ£ããåæåãããŠããããšã確èªããŸãã
ãã®ç¹å®ã®ã±ãŒã¹ã§ã¯ãééããç¯ãããšã¯å°é£ã§ããç§ã¯åæããŸãã ããã§ã®ãã§ãã¯ã¯äžèŠãããããŸããããããšãã°ãPLLã³ã³ãã£ã®ã¥ã¬ãŒã·ã§ã³èšå®ã®äœæã«é¢ããŠã¯ããã§ã«è€éã«ãªã£ãŠããŸãã äœããèæ
®ããããšã¯ã§ããŸããã ããšãã°ãäžéšã®é€æ°ãå€ã«èšå®ããããšã¯ã§ããŸããããå
¥åãããã£ãŒã«ãã§ãããåãå
¥ããããšã¯ã§ããŸãããèšå®ãããé€æ°ã¯ãæšå¥šå€ã®å¢çã«å°éããªãããŸãã¯ãã®éã®é »åºŠãåãåããŸãã ãã®ãããªå Žåãã³ã³ãã€ã«æ®µéã§ãã§ãã¯ããæ©èœã¯éåžžã«åœ¹ç«ã¡ãŸãã
ãŸããã¯ã©ã¹ãã³ã®ãªããžã§ã¯ããåæåããããã«äœæãããã°ããŒãã«æ§é ãã¡ã€ã³ãã¡ãŒã ãŠã§ã¢ãã¡ã€ã«ã«ç§»åããªãããšã«ã泚æããŠãã ããã æªäœ¿çšãšããŠãªã³ã«ãŒã«ãã£ãŠç Žæ£ãããŸãã ãŠãŒã¶ãŒããã°ã©ã ã§å®éã«åŒã³åºãããã³ã³ã¹ãã©ã¯ã¿ãŒãšã¡ãœããã«ãã£ãŠå
¥åãããuint32_tå€æ°ã®ã¿ããã©ãã·ã¥ã«ç§»åããŸãã
ãã®èšäºã«èšèŒãããŠããã³ãŒãã¯ã
ãã®ã©ã€ãã©ãªã®äžéšã§ãã ã©ã€ãã©ãªã¯ãŸã éçºã®åæ段éã«ãããŸãã ã¢ã«ãã¡çã¯ã©ã®ããã«ãªããŸãã-ãã®ãããã¯ã«é¢ããå¥ã®èšäºããããŸãã
ã¢ã€ãã¢ãæãã€ãã
ããŒã¹ã¿ãŒã«å¯Ÿå¿ããŠããã
madcomakerã«æè¬ããŸãã