summaryrefslogtreecommitdiff
path: root/bsp/wch/arm/ch579m/libraries/StdPeriphDriver/CH57x_sys.c
blob: bb245180f8a18ef57ad5c92cae50ba6e57df7dd2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/********************************** (C) COPYRIGHT *******************************
* File Name          : CH57x_SYS.c
* Author             : WCH
* Version            : V1.0
* Date               : 2018/12/15
* Description
*******************************************************************************/

#include "CH57x_common.h"


/*******************************************************************************
* Function Name  : SYS_GetInfoSta
* Description    : 获取当前系统信息状态
* Input          : i:
                    refer to SYS_InfoStaTypeDef
* Return         : DISABLE  -  关闭
                   ENABLE   -  开启
*******************************************************************************/
UINT8 SYS_GetInfoSta( SYS_InfoStaTypeDef i )
{
    if(i == STA_SAFEACC_ACT)
        return (R8_SAFE_ACCESS_SIG & RB_SAFE_ACC_ACT);
    else
        return (R8_GLOB_CFG_INFO&(1<<i));
}

/*******************************************************************************
* Function Name  : SYS_ResetExecute
* Description    : 执行系统软件复位
* Input          : None
* Return         : None
*******************************************************************************/
void SYS_ResetExecute( void )
{
    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
    R8_RST_WDOG_CTRL |= RB_SOFTWARE_RESET;
    R8_SAFE_ACCESS_SIG = 0;
}

/*******************************************************************************
* Function Name  : SYS_DisableAllIrq
* Description    : 关闭所有中断,并保留当前中断值
* Input          : pirqv:当前保留中断值
* Return         : None
*******************************************************************************/
void SYS_DisableAllIrq( PUINT32 pirqv)
{
    *pirqv = NVIC->ISER[0];
    NVIC->ICER[0] = 0xffffffff;
}

/*******************************************************************************
* Function Name  : SYS_RecoverIrq
* Description    : 恢复之前关闭的中断值
* Input          : irq_status:当前保留中断值
* Return         : None
*******************************************************************************/
void SYS_RecoverIrq( UINT32 irq_status )
{
    NVIC->ISER[0] = irq_status;
}

/*******************************************************************************
* Function Name  : SYS_GetSysTickCnt
* Description    : 获取当前系统(SYSTICK)计数值
* Input          : None
* Return         : 当前计数值
*******************************************************************************/
UINT32 SYS_GetSysTickCnt( void )
{
    return(SysTick->VAL );
}

/*******************************************************************************
* Function Name  : WWDG_ITCfg
* Description    : 看门狗定时器溢出中断使能
* Input          : DISABLE-溢出不中断      ENABLE-溢出中断
* Return         : None
*******************************************************************************/
void  WWDG_ITCfg( UINT8 s )
{
    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
    if(s == DISABLE)        R8_RST_WDOG_CTRL&=~RB_WDOG_INT_EN;
    else                    R8_RST_WDOG_CTRL|=RB_WDOG_INT_EN;
    R8_SAFE_ACCESS_SIG = 0;
}

/*******************************************************************************
* Function Name  : WWDG_ResetCfg
* Description    : 看门狗定时器复位功能
* Input          : DISABLE-溢出不复位      ENABLE-溢出系统复位
* Return         : None
*******************************************************************************/
void WWDG_ResetCfg( UINT8 s )
{
    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
    if(s == DISABLE)        R8_RST_WDOG_CTRL&=~RB_WDOG_RST_EN;
    else                    R8_RST_WDOG_CTRL|=RB_WDOG_RST_EN;
    R8_SAFE_ACCESS_SIG = 0;
}

/*******************************************************************************
* Function Name  : WWDG_ClearFlag
* Description    : 清除看门狗中断标志,重新加载计数值也可清除
* Input          : None
* Return         : None
*******************************************************************************/
void WWDG_ClearFlag( void )
{
    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
    R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
    R8_RST_WDOG_CTRL |= RB_WDOG_INT_FLAG;
    R8_SAFE_ACCESS_SIG = 0;
}


/*******************************************************************************
* Function Name  : mDelayuS
* Description    : uS 延时
* Input          : t: 时间参数
* Return         : None
*******************************************************************************/
void mDelayuS( UINT16 t )
{
    UINT16 i, j;

    for(j=0; j<t; j++)
    {

#if     (FREQ_SYS == 40000000)
    for(i=0; i<4; i++)      __nop();

#elif       (FREQ_SYS == 32000000)
    i = 2;
    while(i--)  { __nop();  __nop(); }

#elif       (FREQ_SYS == 24000000)
    i = 1;
    while(i--)  { __nop();  __nop(); }

 #elif       (FREQ_SYS == 20000000)
    for(i=0; i<1; i++)      __nop();

 #elif       (FREQ_SYS == 16000000)
    __nop(); __nop();   __nop(); __nop();
    __nop(); __nop();   __nop(); __nop(); __nop();

#elif       (FREQ_SYS == 8000000)
    __nop(); __nop();

#endif

    }
}

/*******************************************************************************
* Function Name  : mDelaymS
* Description    : mS 延时
* Input          : t: 时间参数
* Return         : None
*******************************************************************************/
void mDelaymS( UINT16 t )
{
    UINT16 i;

    for(i=0; i<t; i++)
        mDelayuS(1000);
}


#if( defined  DEBUG)
int fputc( int c, FILE *f )
{
#if  DEBUG == Debug_UART0
  while( R8_UART0_TFC == UART_FIFO_SIZE );                        /* 等待数据发送 */
  R8_UART0_THR = c;                                               /* 发送数据 */
#elif DEBUG == Debug_UART1
  while( R8_UART1_TFC == UART_FIFO_SIZE );                        /* 等待数据发送 */
  R8_UART1_THR = c;                                               /* 发送数据 */
#elif DEBUG == Debug_UART2
  while( R8_UART2_TFC == UART_FIFO_SIZE );                        /* 等待数据发送 */
  R8_UART2_THR = c;                                               /* 发送数据 */
#elif DEBUG == Debug_UART3
  while( R8_UART3_TFC == UART_FIFO_SIZE );                        /* 等待数据发送 */
  R8_UART3_THR = c;                                               /* 发送数据 */
#endif
  return( c );
}
#endif