EFM32 Zero Gecko Software Documentation  efm32zg-doc-4.2.1
em_rtcc.c
Go to the documentation of this file.
1 /***************************************************************************/
33 #include "em_rtcc.h"
34 #if defined( RTCC_COUNT ) && ( RTCC_COUNT == 1 )
35 #include "em_bus.h"
36 
37 /***************************************************************************/
42 /***************************************************************************/
48 /*******************************************************************************
49  ******************************* DEFINES ***********************************
50  ******************************************************************************/
51 
52 /*******************************************************************************
53  ************************** LOCAL FUNCTIONS ********************************
54  ******************************************************************************/
55 
56 /*******************************************************************************
57  ************************** GLOBAL FUNCTIONS *******************************
58  ******************************************************************************/
59 
60 /***************************************************************************/
77 void RTCC_ChannelInit( int ch, RTCC_CCChConf_TypeDef const *confPtr )
78 {
79  EFM_ASSERT( RTCC_CH_VALID( ch ) );
80  EFM_ASSERT( (uint32_t)confPtr->compMask
81  < ( _RTCC_CC_CTRL_COMPMASK_MASK >> _RTCC_CC_CTRL_COMPMASK_SHIFT )
82  + 1 );
83 
85  RTCC->CC[ch].CTRL = ( (uint32_t)confPtr->chMode << _RTCC_CC_CTRL_MODE_SHIFT )
86  | ( (uint32_t)confPtr->compMatchOutAction << _RTCC_CC_CTRL_CMOA_SHIFT )
87  | ( (uint32_t)confPtr->prsSel << _RTCC_CC_CTRL_PRSSEL_SHIFT )
88  | ( (uint32_t)confPtr->inputEdgeSel << _RTCC_CC_CTRL_ICEDGE_SHIFT )
89  | ( (uint32_t)confPtr->compBase << _RTCC_CC_CTRL_COMPBASE_SHIFT )
90  | ( (uint32_t)confPtr->compMask << _RTCC_CC_CTRL_COMPMASK_SHIFT )
91  | ( (uint32_t)confPtr->dayCompMode << _RTCC_CC_CTRL_DAYCC_SHIFT );
92 }
93 
94 /***************************************************************************/
101 void RTCC_Enable( bool enable )
102 {
103  /* Bitbanding the enable bit in the CTRL register (atomic). */
104  BUS_RegBitWrite((&RTCC->CTRL), _RTCC_CTRL_ENABLE_SHIFT, enable);
105 }
106 
107 /***************************************************************************/
119 void RTCC_Init( const RTCC_Init_TypeDef *init )
120 {
121  RTCC->CTRL = ( (uint32_t)init->enable << _RTCC_CTRL_ENABLE_SHIFT )
122  | ( (uint32_t)init->debugRun << _RTCC_CTRL_DEBUGRUN_SHIFT )
123  | ( (uint32_t)init->precntWrapOnCCV0 << _RTCC_CTRL_PRECCV0TOP_SHIFT )
124  | ( (uint32_t)init->cntWrapOnCCV1 << _RTCC_CTRL_CCV1TOP_SHIFT )
125  | ( (uint32_t)init->presc << _RTCC_CTRL_CNTPRESC_SHIFT )
126  | ( (uint32_t)init->prescMode << _RTCC_CTRL_CNTTICK_SHIFT )
127 #if defined(_RTCC_CTRL_BUMODETSEN_MASK)
128  | ( (uint32_t)init->enaBackupModeSet << _RTCC_CTRL_BUMODETSEN_SHIFT )
129 #endif
130  | ( (uint32_t)init->enaOSCFailDetect << _RTCC_CTRL_OSCFDETEN_SHIFT )
131  | ( (uint32_t)init->cntMode << _RTCC_CTRL_CNTMODE_SHIFT )
132  | ( (uint32_t)init->disLeapYearCorr << _RTCC_CTRL_LYEARCORRDIS_SHIFT );
133 }
134 
135 /***************************************************************************/
139 void RTCC_Reset( void )
140 {
141  int i;
142 
143  /* Restore all RTCC registers to their default values. */
144  RTCC_Unlock();
145  RTCC->CTRL = _RTCC_CTRL_RESETVALUE;
146  RTCC->PRECNT = _RTCC_PRECNT_RESETVALUE;
147  RTCC->CNT = _RTCC_CNT_RESETVALUE;
148  RTCC->TIME = _RTCC_TIME_RESETVALUE;
149  RTCC->DATE = _RTCC_DATE_RESETVALUE;
150  RTCC->IEN = _RTCC_IEN_RESETVALUE;
151  RTCC->IFC = _RTCC_IFC_MASK;
152  RTCC_StatusClear();
153  RTCC->EM4WUEN = _RTCC_EM4WUEN_RESETVALUE;
154 
155  for (i = 0; i < 3; i++)
156  {
157  RTCC->CC[i].CTRL = _RTCC_CC_CTRL_RESETVALUE;
158  RTCC->CC[i].CCV = _RTCC_CC_CCV_RESETVALUE;
159  RTCC->CC[i].TIME = _RTCC_CC_TIME_RESETVALUE;
160  RTCC->CC[i].DATE = _RTCC_CC_DATE_RESETVALUE;
161  }
162 }
163 
164 /***************************************************************************/
168 void RTCC_StatusClear( void )
169 {
170  while ( RTCC->SYNCBUSY & RTCC_SYNCBUSY_CMD )
171  {
172  // Wait for syncronization.
173  }
174  RTCC->CMD = RTCC_CMD_CLRSTATUS;
175 }
176 
180 #endif /* defined( RTCC_COUNT ) && ( RTCC_COUNT == 1 ) */
RAM and peripheral bit-field set and clear API.
Real Time Counter (RTCC) peripheral API.
__STATIC_INLINE void BUS_RegBitWrite(volatile uint32_t *addr, unsigned int bit, unsigned int val)
Perform a single-bit write operation on a peripheral register.
Definition: em_bus.h:146