Added RTC module
This commit is contained in:
parent
24bac1d060
commit
29b097016f
|
|
@ -0,0 +1,276 @@
|
|||
/*!
|
||||
\file gd32f10x_rtc.c
|
||||
\brief RTC driver
|
||||
|
||||
\version 2014-12-26, V1.0.0, firmware for GD32F10x
|
||||
\version 2017-06-20, V2.0.0, firmware for GD32F10x
|
||||
\version 2018-07-31, V2.1.0, firmware for GD32F10x
|
||||
\version 2020-09-30, V2.2.0, firmware for GD32F10x
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright (c) 2020, GigaDevice Semiconductor Inc.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
3. Neither the name of the copyright holder nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "gd32f10x_rtc.h"
|
||||
|
||||
/* RTC register high / low bits mask */
|
||||
#define RTC_HIGH_BITS_MASK ((uint32_t)0x000F0000U) /* RTC high bits mask */
|
||||
#define RTC_LOW_BITS_MASK ((uint32_t)0x0000FFFFU) /* RTC low bits mask */
|
||||
|
||||
/* RTC register high bits offset */
|
||||
#define RTC_HIGH_BITS_OFFSET ((uint32_t)16U)
|
||||
|
||||
/*!
|
||||
\brief enter RTC configuration mode
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void rtc_configuration_mode_enter(void)
|
||||
{
|
||||
RTC_CTL |= RTC_CTL_CMF;
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief exit RTC configuration mode
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void rtc_configuration_mode_exit(void)
|
||||
{
|
||||
RTC_CTL &= ~RTC_CTL_CMF;
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief set RTC counter value
|
||||
\param[in] cnt: RTC counter value
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void rtc_counter_set(uint32_t cnt)
|
||||
{
|
||||
rtc_configuration_mode_enter();
|
||||
/* set the RTC counter high bits */
|
||||
RTC_CNTH = (cnt >> RTC_HIGH_BITS_OFFSET);
|
||||
/* set the RTC counter low bits */
|
||||
RTC_CNTL = (cnt & RTC_LOW_BITS_MASK);
|
||||
rtc_configuration_mode_exit();
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief set RTC prescaler value
|
||||
\param[in] psc: RTC prescaler value
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void rtc_prescaler_set(uint32_t psc)
|
||||
{
|
||||
rtc_configuration_mode_enter();
|
||||
/* set the RTC prescaler high bits */
|
||||
RTC_PSCH = ((psc & RTC_HIGH_BITS_MASK) >> RTC_HIGH_BITS_OFFSET);
|
||||
/* set the RTC prescaler low bits */
|
||||
RTC_PSCL = (psc & RTC_LOW_BITS_MASK);
|
||||
rtc_configuration_mode_exit();
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief wait RTC last write operation finished flag set
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void rtc_lwoff_wait(void)
|
||||
{
|
||||
/* loop until LWOFF flag is set */
|
||||
while(RESET == (RTC_CTL & RTC_CTL_LWOFF)){
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief wait RTC registers synchronized flag set
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void rtc_register_sync_wait(void)
|
||||
{
|
||||
/* clear RSYNF flag */
|
||||
RTC_CTL &= ~RTC_CTL_RSYNF;
|
||||
/* loop until RSYNF flag is set */
|
||||
while(RESET == (RTC_CTL & RTC_CTL_RSYNF)){
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief set RTC alarm value
|
||||
\param[in] alarm: RTC alarm value
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void rtc_alarm_config(uint32_t alarm)
|
||||
{
|
||||
rtc_configuration_mode_enter();
|
||||
/* set the alarm high bits */
|
||||
RTC_ALRMH = (alarm >> RTC_HIGH_BITS_OFFSET);
|
||||
/* set the alarm low bits */
|
||||
RTC_ALRML = (alarm & RTC_LOW_BITS_MASK);
|
||||
rtc_configuration_mode_exit();
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief get RTC counter value
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval RTC counter value
|
||||
*/
|
||||
uint32_t rtc_counter_get(void)
|
||||
{
|
||||
uint32_t temp = 0x0U;
|
||||
|
||||
temp = RTC_CNTL;
|
||||
temp |= (RTC_CNTH << RTC_HIGH_BITS_OFFSET);
|
||||
return temp;
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief get RTC divider value
|
||||
\param[in] none
|
||||
\param[out] none
|
||||
\retval RTC divider value
|
||||
*/
|
||||
uint32_t rtc_divider_get(void)
|
||||
{
|
||||
uint32_t temp = 0x00U;
|
||||
|
||||
temp = ((RTC_DIVH & RTC_DIVH_DIV) << RTC_HIGH_BITS_OFFSET);
|
||||
temp |= RTC_DIVL;
|
||||
return temp;
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief get RTC flag status
|
||||
\param[in] flag: specify which flag status to get
|
||||
only one parameter can be selected which is shown as below:
|
||||
\arg RTC_FLAG_SECOND: second interrupt flag
|
||||
\arg RTC_FLAG_ALARM: alarm interrupt flag
|
||||
\arg RTC_FLAG_OVERFLOW: overflow interrupt flag
|
||||
\arg RTC_FLAG_RSYN: registers synchronized flag
|
||||
\arg RTC_FLAG_LWOF: last write operation finished flag
|
||||
\param[out] none
|
||||
\retval SET or RESET
|
||||
*/
|
||||
FlagStatus rtc_flag_get(uint32_t flag)
|
||||
{
|
||||
if(RESET != (RTC_CTL & flag)){
|
||||
return SET;
|
||||
}else{
|
||||
return RESET;
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief clear RTC flag status
|
||||
\param[in] flag: specify which flag status to clear
|
||||
one or more parameters can be selected which are shown as below:
|
||||
\arg RTC_FLAG_SECOND: second interrupt flag
|
||||
\arg RTC_FLAG_ALARM: alarm interrupt flag
|
||||
\arg RTC_FLAG_OVERFLOW: overflow interrupt flag
|
||||
\arg RTC_FLAG_RSYN: registers synchronized flag
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void rtc_flag_clear(uint32_t flag)
|
||||
{
|
||||
/* clear RTC flag */
|
||||
RTC_CTL &= ~flag;
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief get RTC interrupt flag status
|
||||
\param[in] flag: specify which flag status to get
|
||||
only one parameter can be selected which is shown as below:
|
||||
\arg RTC_INT_FLAG_SECOND: second interrupt flag
|
||||
\arg RTC_INT_FLAG_ALARM: alarm interrupt flag
|
||||
\arg RTC_INT_FLAG_OVERFLOW: overflow interrupt flag
|
||||
\param[out] none
|
||||
\retval SET or RESET
|
||||
*/
|
||||
FlagStatus rtc_interrupt_flag_get(uint32_t flag)
|
||||
{
|
||||
if(RESET != (RTC_CTL & flag)){
|
||||
return SET;
|
||||
}else{
|
||||
return RESET;
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief clear RTC interrupt flag status
|
||||
\param[in] flag: specify which flag status to clear
|
||||
one or more parameters can be selected which are shown as below:
|
||||
\arg RTC_INT_FLAG_SECOND: second interrupt flag
|
||||
\arg RTC_INT_FLAG_ALARM: alarm interrupt flag
|
||||
\arg RTC_INT_FLAG_OVERFLOW: overflow interrupt flag
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void rtc_interrupt_flag_clear(uint32_t flag)
|
||||
{
|
||||
/* clear RTC interrupt flag */
|
||||
RTC_CTL &= ~flag;
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief enable RTC interrupt
|
||||
\param[in] interrupt: specify which interrupt to enbale
|
||||
one or more parameters can be selected which are shown as below:
|
||||
\arg RTC_INT_SECOND: second interrupt
|
||||
\arg RTC_INT_ALARM: alarm interrupt
|
||||
\arg RTC_INT_OVERFLOW: overflow interrupt
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void rtc_interrupt_enable(uint32_t interrupt)
|
||||
{
|
||||
RTC_INTEN |= interrupt;
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief disable RTC interrupt
|
||||
\param[in] interrupt: specify which interrupt to disbale
|
||||
one or more parameters can be selected which are shown as below:
|
||||
\arg RTC_INT_SECOND: second interrupt
|
||||
\arg RTC_INT_ALARM: alarm interrupt
|
||||
\arg RTC_INT_OVERFLOW: overflow interrupt
|
||||
\param[out] none
|
||||
\retval none
|
||||
*/
|
||||
void rtc_interrupt_disable(uint32_t interrupt)
|
||||
{
|
||||
RTC_INTEN &= ~interrupt;
|
||||
}
|
||||
|
|
@ -38,6 +38,8 @@
|
|||
#define RTE_DEVICE_STDPERIPHERALS_PMU
|
||||
/* GigaDevice::Device:GD32F10x_StdPeripherals:RCU:2.0.2 */
|
||||
#define RTE_DEVICE_STDPERIPHERALS_RCU
|
||||
/* GigaDevice::Device:GD32F10x_StdPeripherals:RTC:2.0.2 */
|
||||
#define RTE_DEVICE_STDPERIPHERALS_RTC
|
||||
/* GigaDevice::Device:GD32F10x_StdPeripherals:USART:2.0.2 */
|
||||
#define RTE_DEVICE_STDPERIPHERALS_USART
|
||||
/* Keil.ARM Compiler::Compiler:I/O:STDIN:User:1.2.0 */
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -153,7 +153,40 @@
|
|||
<Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F10x_CL -FS08000000 -FL040000 -FP0($$Device:GD32F107VC$Flash\GD32F10x_CL.FLM))</Name>
|
||||
</SetRegEntry>
|
||||
</TargetDriverDllRegistry>
|
||||
<Breakpoint/>
|
||||
<Breakpoint>
|
||||
<Bp>
|
||||
<Number>0</Number>
|
||||
<Type>0</Type>
|
||||
<LineNumber>287</LineNumber>
|
||||
<EnabledFlag>1</EnabledFlag>
|
||||
<Address>0</Address>
|
||||
<ByteObject>0</ByteObject>
|
||||
<HtxType>0</HtxType>
|
||||
<ManyObjects>0</ManyObjects>
|
||||
<SizeOfObject>0</SizeOfObject>
|
||||
<BreakByAccess>0</BreakByAccess>
|
||||
<BreakIfRCount>0</BreakIfRCount>
|
||||
<Filename>.\main.c</Filename>
|
||||
<ExecCommand></ExecCommand>
|
||||
<Expression></Expression>
|
||||
</Bp>
|
||||
<Bp>
|
||||
<Number>1</Number>
|
||||
<Type>0</Type>
|
||||
<LineNumber>286</LineNumber>
|
||||
<EnabledFlag>1</EnabledFlag>
|
||||
<Address>0</Address>
|
||||
<ByteObject>0</ByteObject>
|
||||
<HtxType>0</HtxType>
|
||||
<ManyObjects>0</ManyObjects>
|
||||
<SizeOfObject>0</SizeOfObject>
|
||||
<BreakByAccess>0</BreakByAccess>
|
||||
<BreakIfRCount>0</BreakIfRCount>
|
||||
<Filename>.\main.c</Filename>
|
||||
<ExecCommand></ExecCommand>
|
||||
<Expression></Expression>
|
||||
</Bp>
|
||||
</Breakpoint>
|
||||
<WatchWindow1>
|
||||
<Ww>
|
||||
<count>0</count>
|
||||
|
|
@ -206,7 +239,7 @@
|
|||
</Mm>
|
||||
</MemoryWindow3>
|
||||
<ScvdPack>
|
||||
<Filename>E:\Arm\Packs\ARM\CMSIS-FreeRTOS\10.5.1\CMSIS\RTOS2\FreeRTOS\FreeRTOS.scvd</Filename>
|
||||
<Filename>C:\Users\User\AppData\Local\Arm\Packs\ARM\CMSIS-FreeRTOS\10.5.1\CMSIS\RTOS2\FreeRTOS\FreeRTOS.scvd</Filename>
|
||||
<Type>ARM.CMSIS-FreeRTOS.10.5.1</Type>
|
||||
<SubType>1</SubType>
|
||||
</ScvdPack>
|
||||
|
|
@ -325,7 +358,7 @@
|
|||
|
||||
<Group>
|
||||
<GroupName>FreeRTOS</GroupName>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
|
|
|
|||
|
|
@ -857,6 +857,12 @@
|
|||
<targetInfo name="Target 1"/>
|
||||
</targetInfos>
|
||||
</component>
|
||||
<component Cclass="Device" Cgroup="GD32F10x_StdPeripherals" Csub="RTC" Cvendor="GigaDevice" Cversion="2.0.2" condition="GD32F10x STDPERIPHERALS RCU">
|
||||
<package name="GD32F10x_DFP" schemaVersion="1.2" url="https://gd32mcu.com/data/documents/pack/" vendor="GigaDevice" version="2.0.3"/>
|
||||
<targetInfos>
|
||||
<targetInfo name="Target 1"/>
|
||||
</targetInfos>
|
||||
</component>
|
||||
<component Cclass="Device" Cgroup="GD32F10x_StdPeripherals" Csub="USART" Cvendor="GigaDevice" Cversion="2.0.2" condition="GD32F10x STDPERIPHERALS RCU">
|
||||
<package name="GD32F10x_DFP" schemaVersion="1.2" url="https://gd32mcu.com/data/documents/pack/" vendor="GigaDevice" version="2.0.3"/>
|
||||
<targetInfos>
|
||||
|
|
@ -959,6 +965,14 @@
|
|||
<targetInfo name="Target 1"/>
|
||||
</targetInfos>
|
||||
</file>
|
||||
<file attr="config" category="source" name="Device\Firmware\Peripherals\src\gd32f10x_rtc.c" version="2.0.2">
|
||||
<instance index="0">RTE\Device\GD32F107VC\gd32f10x_rtc.c</instance>
|
||||
<component Cclass="Device" Cgroup="GD32F10x_StdPeripherals" Csub="RTC" Cvendor="GigaDevice" Cversion="2.0.2" condition="GD32F10x STDPERIPHERALS RCU"/>
|
||||
<package name="GD32F10x_DFP" schemaVersion="1.2" url="https://gd32mcu.com/data/documents/pack/" vendor="GigaDevice" version="2.0.3"/>
|
||||
<targetInfos>
|
||||
<targetInfo name="Target 1"/>
|
||||
</targetInfos>
|
||||
</file>
|
||||
<file attr="config" category="source" name="Device\Firmware\Peripherals\src\gd32f10x_usart.c" version="2.0.2">
|
||||
<instance index="0">RTE\Device\GD32F107VC\gd32f10x_usart.c</instance>
|
||||
<component Cclass="Device" Cgroup="GD32F10x_StdPeripherals" Csub="USART" Cvendor="GigaDevice" Cversion="2.0.2" condition="GD32F10x STDPERIPHERALS RCU"/>
|
||||
|
|
|
|||
27
main.c
27
main.c
|
|
@ -190,8 +190,18 @@ static void vInitMCU(void)
|
|||
rcu_periph_clock_enable(RCU_ENET);
|
||||
rcu_periph_clock_enable(RCU_ENETTX);
|
||||
rcu_periph_clock_enable(RCU_ENETRX);
|
||||
rcu_periph_clock_enable(RCU_RTC);
|
||||
rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);
|
||||
|
||||
/*Configure GPIO Alternate UART function*/
|
||||
/* Configure RTC */
|
||||
|
||||
rtc_configuration_mode_enter();
|
||||
rtc_lwoff_wait();
|
||||
rtc_counter_set(0xA5A5A5A5);
|
||||
//rtc_lwoff_wait();
|
||||
rtc_configuration_mode_exit();
|
||||
|
||||
/* Configure GPIO Alternate UART function */
|
||||
gd_eval_com_init(EVAL_COM1);
|
||||
gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ, BUTTON_USER);
|
||||
|
||||
|
|
@ -201,7 +211,7 @@ static void vInitMCU(void)
|
|||
gpio_init(LED5_TICK_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, LED5_TICK);
|
||||
gpio_bit_set(LED5_TICK_PORT, LED5_TICK);
|
||||
|
||||
/*Enable PLL2 to generate 50MHz clocks */
|
||||
/* Enable PLL2 to generate 50MHz clocks */
|
||||
if (ERROR == xInitPLL2()) FreeRTOS_debug_printf(("PLL2 initialization failed\n"));
|
||||
|
||||
/* Put PLL2 clocks into CKOUT0(PA1) as ref clock for ethernet phy */
|
||||
|
|
@ -209,7 +219,7 @@ static void vInitMCU(void)
|
|||
gpio_ethernet_phy_select(GPIO_ENET_PHY_RMII);
|
||||
|
||||
/* Configure GPIO Alternate RMII function */
|
||||
gpio_init(RMII_TXD_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, RMII_TX_EN);
|
||||
gpio_init(RMII_TXD_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, RMII_TX_EN);
|
||||
gpio_init(RMII_TXD_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, RMII_TXD0);
|
||||
gpio_init(RMII_TXD_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, RMII_TXD1);
|
||||
|
||||
|
|
@ -269,14 +279,13 @@ void vTaskToggleLed( void *pvParameters)
|
|||
|
||||
static void prvMiscInitialisation( void )
|
||||
{
|
||||
unsigned long xTimeNow;
|
||||
UBaseType_t xTimeNow;
|
||||
uint32_t ulRandomNumbers[ 4 ];
|
||||
|
||||
/* Seed the random number generator. */
|
||||
// time( &xTimeNow );
|
||||
FreeRTOS_debug_printf( ("Seed for randomiser: %lu\r\n", xTimeNow ) );
|
||||
FreeRTOS_debug_printf( ("Seed for randomiser\n") );
|
||||
// prvSRand( ( uint32_t ) xTimeNow );
|
||||
/* Seed the random number generator. */
|
||||
xTimeNow = rtc_counter_get();
|
||||
FreeRTOS_debug_printf( ("Seed for randomiser: %lu\r\n", xTimeNow ) );
|
||||
prvSRand( ( uint32_t ) xTimeNow );
|
||||
|
||||
( void ) xApplicationGetRandomNumber( &ulRandomNumbers[ 0 ] );
|
||||
( void ) xApplicationGetRandomNumber( &ulRandomNumbers[ 1 ] );
|
||||
|
|
|
|||
Loading…
Reference in New Issue