2021-05-28 新唐M051芯片--串口0,定时器

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.总结

刚开始使用这个芯片,觉得有很多不是很适应,使用官方的例程时,测试的例子有点不太合理,有些例子配置居然不能直接重现,需要自己去多看官方寄存器的文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值