[DemoCode下载]

新唐M051 UART0使用程序

[复制链接]
1649|11
手机看帖
扫描二维码
随时随地手机跟帖
wahahaheihei|  楼主 | 2016-8-13 16:48 | 显示全部楼层 |阅读模式
#include "UART.h"
/****************************************
*函数名称:UartInit
*输    入:unFosc   晶振频率
          unBaud  波特率
*输    出:无
*功    能:串口初始化
******************************************/
VOID UartInit(UINT32 unFosc,UINT32 unBaud)
{
    P3_MFP &= ~(P31_TXD0 | P30_RXD0);  
    P3_MFP |= (TXD0 | RXD0);      //P3.0 使能为串口0接收
          //P3.1 使能为串口0发送
    UART0_Clock_EN;         //串口0时钟使能
    UARTClkSource_ex12MHZ;  //串口时钟选择为外部晶振
    CLKDIV &= ~(15<<8);  //串口时钟分频为0
    IPRSTC2 |= UART0_RST;   //复位串口0
    IPRSTC2 &= ~UART0_RST;  //复位结束
    UA0_FCR |= TX_RST;      //发送FIFO复位
    UA0_FCR |= RX_RST;      //接收FIFO复位
    UA0_LCR &= ~PBE;      //校验位功能取消
UA0_LCR &= ~WLS;
    UA0_LCR |= WL_8BIT;     //8位数据位
    UA0_LCR &= NSB_ONE;     //1位停止位
    UA0_BAUD |= DIV_X_EN|DIV_X_ONE;   //设置波特率分频   
    UA0_BAUD |= ((unFosc / unBaud) -2); //波特率设置  UART_CLK/(A+2) = 115200, UART_CLK=12MHz
UA0_IER |= RDA_IEN;     //接收数据中断使能
NVIC_ISER |= UART0_INT;     //使能串口0中断
}
/****************************************
*函数名称:UartSend
*输    入:pBuf     发送数据缓冲区
          unNumOfBytes  发送字节总数
*输    出:无
*功    能:串口发送数据
******************************************/
VOID UartSend(UINT8 *pBuf,UINT32 unNumOfBytes)
{
  UINT32 i;
  for(i=0; i<unNumOfBytes; i++)
  {
         UA0_THR = *(pBuf+i);
         while ((UA0_FSR&TX_EMPTY) != 0x00); //检查发送FIFO是否为空
  }
}
/****************************************
*函数名称:UART0_IRQHandler
*输    入:无
*输    出:无
*功    能:串口0中断服务函数
******************************************/
VOID UART0_IRQHandler(VOID)
{
    UINT8 ucData;
if(UA0_ISR & RDA_INT)     //检查是否接收数据中断
{  
  while(UA0_ISR & RDA_IF)    //获取所有接收到的数据
  {
   while (UA0_FSR & RX_EMPTY);  //检查接收FIFO是否为空   
   ucData = UA0_RBR;    //读取数据
   UartSend(&ucData,1);   //发送数据
   //以下测试接收数据用
    if(ucData == 0x11)  P2_DOUT &= ~0xff;
    if(ucData == 0xff)  P2_DOUT |= 0xff;
  }
}
}
/****************************************
*函数名称:main
*输    入:无
*输    出:无
*功    能:函数主体
******************************************/
INT32 main(VOID)
{
// unsigned char i,j;
     PROTECT_REG
  (            //ISP下载时保护FLASH存储器
   PWRCON |= XTL12M_EN;      //默认时钟源为外部晶振
   while((CLKSTATUS & XTL12M_STB) == 0);   //等待12MHz时钟稳定
   CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //设置外部晶振为系统时钟
   //以下测试接收数据
   //P2_PMD=0x5555;          //GPIO设置为输出模式  
  )
  UartInit(12000000,9600);      //波特率设置为9600bps
  while(1)
  {
/*   j=0;
                //发送数据0~255
    for(i=0; i<256; i++)
    {
       UartSend(&j,1);
     j++;
     Delayms(50);   
    } */
  }
}


天灵灵地灵灵| | 2016-8-14 15:23 | 显示全部楼层
这种配置方法非常简单好学。

使用特权

评论回复
mintspring| | 2016-8-15 13:24 | 显示全部楼层
/****************************************
*函数名称:UART0_IRQHandler
*输    入:无
*输    出:无
*功    能:串口0中断服务函数
******************************************/
VOID UART0_IRQHandler(VOID)
{
    UINT8 ucData;
if(UA0_ISR & RDA_INT)     //检查是否接收数据中断
{  
  while(UA0_ISR & RDA_IF)    //获取所有接收到的数据
  {
   while (UA0_FSR & RX_EMPTY);  //检查接收FIFO是否为空   
   ucData = UA0_RBR;    //读取数据
   UartSend(&ucData,1);   //发送数据
   //以下测试接收数据用
    if(ucData == 0x11)  P2_DOUT &= ~0xff;
    if(ucData == 0xff)  P2_DOUT |= 0xff;
  }
}
}
这种还是很好理解的。

使用特权

评论回复
Jessicakjdsl| | 2016-8-15 21:31 | 显示全部楼层
如果外面想加入485的话需要怎样写串口程序呢

使用特权

评论回复
gejigeji521| | 2016-8-18 22:46 | 显示全部楼层
UA0_IER |= RDA_IEN;     //接收数据中断使能
NVIC_ISER |= UART0_INT;     //使能串口0中断

使用特权

评论回复
643757107| | 2016-8-19 21:45 | 显示全部楼层
串口的使用方式多种多样,在不同的情况下都可以用

使用特权

评论回复
稳稳の幸福| | 2016-8-20 07:41 | 显示全部楼层
P3_MFP &= ~(P31_TXD0 | P30_RXD0);  
P3_MFP |= (TXD0 | RXD0);      //P3.0 使能为串口0接收
//P3.1 使能为串口0发送

使用特权

评论回复
yiyigirl2014| | 2016-8-20 15:54 | 显示全部楼层
每一个单片机上都有好几个串口,一般这些串口功能不尽相同,其中有一个完整版的功能,还有一些职能作为调试信息输出打印使用。

使用特权

评论回复
heisexingqisi| | 2016-8-20 22:48 | 显示全部楼层
VOID UartSend(UINT8 *pBuf,UINT32 unNumOfBytes)
{
  UINT32 i;
  for(i=0; i<unNumOfBytes; i++)
  {
         UA0_THR = *(pBuf+i);
         while ((UA0_FSR&TX_EMPTY) != 0x00); //检查发送FIFO是否为空
  }
}

使用特权

评论回复
yexinyuan1212| | 2017-12-25 17:31 | 显示全部楼层
按照这个示范写的程序,数据能正常的进行接收,为什么看不到发射出来的数据呢??

使用特权

评论回复
wahahaheihei|  楼主 | 2017-12-25 20:37 | 显示全部楼层
yexinyuan1212 发表于 2017-12-25 17:31
按照这个示范写的程序,数据能正常的进行接收,为什么看不到发射出来的数据呢?? ...

看看是不是线没接对,或者用普通的printf测试能否打印出数据,确认硬件本身没问题。

使用特权

评论回复
捉虫天师| | 2017-12-25 20:41 | 显示全部楼层
有时候硬件问题没有查出来,总以为软件的问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

197

主题

2975

帖子

12

粉丝