每个IP的初始化都需要先初始化时钟,然后才是IP功能初始化。初始化UART之前需要使能要用的晶振,然后选择时钟源并使能时钟。最后将UART用到的引脚切换为UART功能。
void UART0_Init() { /* UART选择HIRC做时钟源 */ CLK->CLKSEL1 = (CLK->CLKSEL1 &~CLK_CLKSEL1_UART_S_Msk) |CLK_CLKSEL1_UART_S_HIRC; /* 使能UART0 IP的时钟 */ CLK->APBCLK |= CLK_APBCLK_UART0_EN; /* 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); /* Init UART0 */ UART_Open(UART0, 115200);/*默认数据长度为8bit,没有奇偶校验,1个停止位*/ /*初始化UART1,波特率9600,数据长度8bit,1个停止位,偶校验*/ UART_SetLine_Config(UART1, 9600, UART_WORD_LEN_8, UART_PARITY_EVEN,UART_STOP_BIT_1); }
这里为了大家看得清楚,把选择时钟源,使能时钟,配置多功能引脚都放到UART0_Init函数里面了。其实这部分代码大家随意,想放到Sys_Init也行。 UART_Open会根据UART选择的时钟源计算波特率。会用到函数SystemCoreClockUpdate();更新过的变量。 上面的代码执行之后,UART_WRITE(UART0, 0x31)就会从UART TX引脚发送0x31了。如果要使用printf打印信息,keil project中加入retarget.c就可以,然后由宏定义#defineDEBUG_PORT UART0决定printf从哪个UART口打印。 |