- //内核时钟最高可达到50MHz
- #define PLL_CLOCK 50000000//50MHz
- void SYS_Init(void)
- {
- //解除写保护功能
- //芯片中很多寄存器是写保护的,要写这些寄存器需要先解锁
- SYS_UnlockReg();
-
- /*
- 初始化系统时钟
- */
-
- //使能时钟源,内部高速时钟 22.1184 MHz
- CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);
-
- //等待时钟稳定
- CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);
-
- //设置HCLK时钟源和HCLK分频
- CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC,CLK_CLKDIV_HCLK(1));
-
- //使能时钟源,外部高速时钟 12 MHz
- CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);
- //使能PLL时钟,选择选择外部时钟源,倍频到50MHz
- CLK_EnablePLL(CLK_PLLCON_PLL_SRC_HXT, CLK_PLLCON_50MHz_HXT );
-
- //等待时钟稳定,外部高速时钟,PLL时钟,内部低速时钟
- CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk | CLK_CLKSTATUS_PLL_STB_Msk | CLK_CLKSTATUS_IRC10K_STB_Msk);
-
- /*
- 使能IP时钟。例如UART、ADC、PWM等等
- */
- //串口
-
- //使能串口时钟
- CLK_EnableModuleClock(UART0_MODULE);
-
- //设置串口时钟,时钟源为外部高速时钟,1分频
- CLK_SetModuleClock(UART0_MODULE,CLK_CLKSEL1_UART_S_HXT,CLK_CLKDIV_UART(1));
-
- //PWM
- //使能PWM时钟
- CLK_EnableModuleClock(PWM45_MODULE);
- //设置PWM时钟,时钟源为外部高速时钟,最后一个是无参数
- CLK_SetModuleClock(PWM45_MODULE,CLK_CLKSEL2_PWM45_S_HXT,NULL);
- CLK_EnableModuleClock(PWM67_MODULE);
- CLK_SetModuleClock(PWM67_MODULE,CLK_CLKSEL2_PWM67_S_HXT,NULL);
-
- //更新系统时钟
- SystemCoreClockUpdate();
-
- /*
- 初始化I/O复用功能
- */
- //串口
- SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
- SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);
- //使能写保护功能
- SYS_LockReg();
- }
- 补充:
- 新唐的芯片一般有3种软件复位方式:CPU reset、Chip reset和System reset
- CPU reset: 就是将 CPU 执行指针 PC 直接指到 0 的地方重新执行程序,其它外设都不复位
- Chip reset: 就是整个芯片复位,类似于 POR(power on reset)上电复位的方式,让程序重新执行
- System reset:类似于 Chip reset,除了不复位晶振电路和 Config Area 的值不会重新加载,其
- 它的电路都会被复位
|