1.系统初始化
void SYS_Init(void)
{
/* Unlock protected registers */
SYS_UnlockReg(); //操作寄存器解锁
{ //切换外部晶振-->频率为50Mhz(默认内部晶振22.1184MHz)
CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk); /* Enable Internal RC 22.1184MHz clock */
CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk); /* Waiting for Internal RC clock ready */
CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1)); /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk); /* Enable external XTAL 12MHz clock */
CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk); /* Waiting for external XTAL clock ready */
CLK_SetCoreClock(PLL_CLOCK); /* Set core clock as PLL_CLOCK from PLL */
}
/* Update System Core Clock */
/* User can use SystemCoreClockUpdate() to calculate SystemCoreClock and cyclesPerUs automatically. */
SystemCoreClockUpdate(); //时钟信息更新
CLK_EnableModuleClock(UART0_MODULE);
/* Enable peripheral clock */
CLK->APBCLK |= CLK_APBCLK_UART0_EN_Msk ; //串口0外设使能
CLK->CLKSEL1 |= CLK_CLKSEL1_UART_S_PLL ; //串口0时钟配置
CLK->APBCLK |= CLK_APBCLK_TMR1_EN_Msk; //定时器1
CLK->CLKSEL1 |= CLK_CLKSEL1_TMR1_S_HCLK ;
/* Set P3 multi-function pins for UART0 RXD and TXD */
SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
SYS->P3_MFP |= SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0;
/* Lock protected registers */
SYS_LockReg(); //寄存器操作加锁
}
2.串口0
//! <串口初始化
void Uart0_Init(u32 baud)
{
SYS_UnlockReg();
/* Set P3 multi-function pins for UART0 RXD and TXD */ //配置管脚
SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
SYS->P3_MFP |= SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0;
SYS_LockReg();
/* Init UART0 to 115200-8n1 for print message */
UART_Open(UART0, 115200);
/* Enable Interrupt and install the call back function (开启接收中断/接收超时中断)*/
UART_ENABLE_INT(UART0, (UART_IER_RDA_IEN_Msk|UART_IER_RTO_IEN_Msk));
NVIC_EnableIRQ(UART0_IRQn); //启动中断
}
//! <串口中断
void UART0_IRQHandler(void)
{
uint8_t dat = 0;
if(UART0->ISR & UART_ISR_RDA_INT_Msk) //检查中断
{
while(UART_IS_RX_READY(UART0)) //检查接收标志
{
dat = UART_READ(UART0); //接收数据
que_Write(&Rx1_que,dat); //缓存数据
}
}
}
4.串口0发送基础函数
//! <串口0 发送一字节
void Uart0_SendByte(uint8_t ch)
{
UART0->DATA = ch;
while(UART0->FSR & UART_FSR_TX_FULL_Msk); //等待发送完成
}
//! <串口0 发送数据串
void Uart0_SendString(uint8_t *ch,uint16_t len)
{
while(len--)
{
Uart0_SendByte(*ch++);
}
}
3.定时器1
//时钟使能
CLK->APBCLK |= CLK_APBCLK_TMR1_EN_Msk;
CLK->CLKSEL1 |= CLK_CLKSEL1_TMR1_S_HCLK;
//!< 定时器初始化
void Timer1_Init(void)
{
//1000 is 1KHz,1ms
TIMER_Open(TIMER1,TIMER_PERIODIC_MODE,1000); //设置频率
TIMER_EnableInt(TIMER1); //使能中断
NVIC_EnableIRQ(TMR1_IRQn); //使能中断
TIMER_Start(TIMER1); //启动定时器
}
//!< 定时器中断
void TMR1_IRQHandler(void)
{
if(TIMER_GetIntFlag(TIMER1) == 1)
{
TIMER_ClearIntFlag(TIMER1);
/*User Code*/
}
}
4.总结
刚开始使用这个芯片,觉得有很多不是很适应,使用官方的例程时,测试的例子有点不太合理,有些例子配置居然不能直接重现,需要自己去多看官方寄存器的文档