系统初始化包含了时钟(clock)初始化和多功能引脚(Multi Function Pin 简称MFP寄存器)配置。
void SYS_Init(void) {
/* 解锁保护寄存器 */
SYS_UnlockReg();
/*芯片中很多寄存器是写保护的,例如PWRCTL寄存器,要写这些寄存器需要先解锁*/
/* 使能外部高速晶振,一般范围是 (4~24 MHz) */
CLK->PWRCTL |= (0x1 << CLK_PWRCTL_HXT_EN_Pos); // HXT Enabled
/* 等待外部时钟稳定,一般是12M */
CLK_WaitClockReady( CLK_CLKSTATUS_HXT_STB_Msk);
/* HCLK就是CPU 的时钟,切为外部晶振HXT */
CLK->CLKSEL0 = (CLK->CLKSEL0 &~CLK_CLKSEL0_HCLK_S_Msk) | CLK_CLKSEL0_HCLK_S_HXT;
/* 使能UART0和UART1两个IP的时钟 */
CLK->APBCLK |= CLK_APBCLK_UART0_EN;
// UART0 Clock Enable
CLK->APBCLK |= CLK_APBCLK_UART1_EN;
// UART1 Clock Enable
/* 选择UART时钟源 */
CLK->CLKSEL1 = (CLK->CLKSEL1 & ~CLK_CLKSEL1_UART_S_Msk) | CLK_CLKSEL1_UART_S_HXT;// 选择外部 12 MHz or 32 KHz 做时钟源
/* Update System Core Clock */
/* 可以通过 SystemCoreClockUpdate() 来自动计算 PllClock, SystemCoreClock 和 CycylesPerUs */
SystemCoreClockUpdate();
/* 初始化 I/O 多功能引脚 */
/* PB13用作UART0 接收,PB14用作UART0发送 */
SYS->PB_H_MFP &= ~(SYS_PB_H_MFP_PB13_MFP_Msk | SYS_PB_H_MFP_PB14_MFP_Msk);
SYS->PB_H_MFP |= (SYS_PB_H_MFP_PB13_MFP_UART0_RX | SYS_PB_H_MFP_PB14_MFP_UART0_TX);
/* PB4用作UART1 RTS,PB5用作UART1接收,PB6用作UART1 发送,PB7用作UART1 CTS */
SYS->PB_L_MFP &= ~(SYS_PB_L_MFP_PB4_MFP_Msk | SYS_PB_L_MFP_PB5_MFP_Msk | SYS_PB_L_MFP_PB6_MFP_Msk | SYS_PB_L_MFP_PB7_MFP_Msk);
SYS->PB_L_MFP |= (SYS_PB_L_MFP_PB4_MFP_UART1_RTS | SYS_PB_L_MFP_PB5_MFP_UART1_RX | SYS_PB_L_MFP_PB6_MFP_UART1_TX | SYS_PB_L_MFP_PB7_MFP_UART1_CTS);
/* 重新加锁 */
SYS_LockReg();
}
|