📄 drvsys.c
字号:
/* Please make sure that Register Write-Protection Function has been disabled before using */
/* this function to select WDT clock source. */
/* User can check the status of Register Write-Protection Function */
/* with DrvSYS_IsProtectedRegLocked(). */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvSYS_SelectIPClockSource(E_SYS_IP_CLKSRC eIpClkSrc, uint8_t u8ClkSrcSel)
{
switch(eIpClkSrc)
{
case E_SYS_FRQDIV_CLKSRC:
SYSCLK->CLKSEL2.FRQDIV_S = u8ClkSrcSel;
break;
case E_SYS_I2S_CLKSRC:
SYSCLK->CLKSEL2.I2S_S = u8ClkSrcSel;
break;
case E_SYS_PWM67_CLKSRC:
SYSCLK->CLKSEL2.PWM67_S = u8ClkSrcSel;
break;
case E_SYS_PWM45_CLKSRC:
SYSCLK->CLKSEL2.PWM45_S = u8ClkSrcSel;
break;
case E_SYS_PWM23_CLKSRC:
SYSCLK->CLKSEL1.PWM23_S = u8ClkSrcSel;
break;
case E_SYS_PWM01_CLKSRC:
SYSCLK->CLKSEL1.PWM01_S = u8ClkSrcSel;
break;
case E_SYS_UART_CLKSRC:
SYSCLK->CLKSEL1.UART_S = u8ClkSrcSel;
break;
case E_SYS_TMR3_CLKSRC:
SYSCLK->CLKSEL1.TMR3_S = u8ClkSrcSel;
break;
case E_SYS_TMR2_CLKSRC:
SYSCLK->CLKSEL1.TMR2_S = u8ClkSrcSel;
break;
case E_SYS_TMR1_CLKSRC:
SYSCLK->CLKSEL1.TMR1_S = u8ClkSrcSel;
break;
case E_SYS_TMR0_CLKSRC:
SYSCLK->CLKSEL1.TMR0_S = u8ClkSrcSel;
break;
case E_SYS_ADC_CLKSRC:
SYSCLK->CLKSEL1.ADC_S = u8ClkSrcSel;
break;
case E_SYS_WDT_CLKSRC:
SYSCLK->CLKSEL1.WDT_S = u8ClkSrcSel;
break;
default:
return E_DRVSYS_ERR_IPSRC;
}
return E_SUCCESS;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvSYS_SetClockDivider */
/* */
/* Parameters: */
/* eIpDiv - [in] E_SYS_ADC_DIV / E_SYS_UART_DIV / E_SYS_USB_DIV /E_SYS_HCLK_DIV */
/* i32value - [in] 0 ~ 255 for ADC, 0 ~ 15 for other IP or HCLK */
/* */
/* Returns: */
/* 0: Success */
/* < 0: Incorrect value */
/* */
/* Description: */
/* This function is used to set IP divider number from the corresponding clock source. */
/* The actual clock divide number is (i32value + 1) */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvSYS_SetClockDivider(E_SYS_IP_DIV eIpDiv , int32_t i32value)
{
if (eIpDiv == E_SYS_ADC_DIV)
{
SYSCLK->CLKDIV.ADC_N = i32value;
}
else if(eIpDiv == E_SYS_UART_DIV)
{
SYSCLK->CLKDIV.UART_N = i32value;
}
else if(eIpDiv == E_SYS_USB_DIV)
{
SYSCLK->CLKDIV.USB_N = i32value;
}
else if(eIpDiv == E_SYS_HCLK_DIV)
{
SYSCLK->CLKDIV.HCLK_N = i32value;
SystemCoreClockUpdate();
}
else
return E_DRVSYS_ERR_IPDIV;
return E_SUCCESS;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvSYS_SetOscCtrl */
/* */
/* Parameters: */
/* eClkSrc - [in] E_SYS_XTL12M / E_SYS_XTL32K / E_SYS_OSC22M / E_SYS_OSC10K */
/* i32Enable - [in] 1: Enable / 0: Disable */
/* */
/* Returns: */
/* 0: Success */
/* < 0: Incorrect value */
/* */
/* Description: */
/* This function is used to enable/disable internal oscillator or external crystal */
/* */
/* Note: */
/* Please make sure that Register Write-Protection Function has been disabled before using */
/* this function to enable/disable internal oscillator or external crystal. */
/* User can check the status of Register Write-Protection Function */
/* with DrvSYS_IsProtectedRegLocked(). */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvSYS_SetOscCtrl(E_SYS_CHIP_CLKSRC eClkSrc, int32_t i32Enable)
{
switch(eClkSrc)
{
case E_SYS_XTL12M:
SYSCLK->PWRCON.XTL12M_EN = i32Enable;
break;
case E_SYS_XTL32K:
SYSCLK->PWRCON.XTL32K_EN = i32Enable;
break;
case E_SYS_OSC22M:
SYSCLK->PWRCON.OSC22M_EN = i32Enable;
break;
case E_SYS_OSC10K:
SYSCLK->PWRCON.OSC10K_EN = i32Enable;
break;
default:
return E_DRVSYS_ERR_ARGUMENT;
}
return E_SUCCESS;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: <PWRWU_IRQHandler> */
/* */
/* Parameter: */
/* None */
/* Returns: */
/* None */
/* */
/* Description: */
/* ISR to handle Power Down Wake up interrupt event */
/*---------------------------------------------------------------------------------------------------------*/
void PWRWU_IRQHandler(void)
{
SYSCLK->PWRCON.PD_WU_STS = 1;
if (PWRWU_callbackFn != NULL)
PWRWU_callbackFn();
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvSYS_SetPowerDownWakeUpInt */
/* */
/* Parameters: */
/* i32Enable - [in] 1: Enable Power dowm Wake up interrup */
/* 0: Disable Power dowm Wake up interrup */
/* pdwucallbackFn - [in] Power Down Wake Up Call back function */
/* i32enWUDelay - [in] 1: Enable clock cycles delay */
/* 0: Disable clock cycles delay */
/* */
/* Returns: */
/* None */
/* */
/* Description:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -