[DemoCode下载] 新唐M051 UART0使用程序

[复制链接]
 楼主| wahahaheihei 发表于 2016-8-13 16:48 | 显示全部楼层 |阅读模式
  1. #include "UART.h"
  2. /****************************************
  3. *函数名称:UartInit
  4. *输    入:unFosc   晶振频率
  5.           unBaud  波特率
  6. *输    出:无
  7. *功    能:串口初始化
  8. ******************************************/
  9. VOID UartInit(UINT32 unFosc,UINT32 unBaud)
  10. {
  11.     P3_MFP &= ~(P31_TXD0 | P30_RXD0);  
  12.     P3_MFP |= (TXD0 | RXD0);      //P3.0 使能为串口0接收
  13.           //P3.1 使能为串口0发送
  14.     UART0_Clock_EN;         //串口0时钟使能
  15.     UARTClkSource_ex12MHZ;  //串口时钟选择为外部晶振
  16.     CLKDIV &= ~(15<<8);  //串口时钟分频为0
  17.     IPRSTC2 |= UART0_RST;   //复位串口0
  18.     IPRSTC2 &= ~UART0_RST;  //复位结束
  19.     UA0_FCR |= TX_RST;      //发送FIFO复位
  20.     UA0_FCR |= RX_RST;      //接收FIFO复位
  21.     UA0_LCR &= ~PBE;      //校验位功能取消
  22. UA0_LCR &= ~WLS;
  23.     UA0_LCR |= WL_8BIT;     //8位数据位
  24.     UA0_LCR &= NSB_ONE;     //1位停止位
  25.     UA0_BAUD |= DIV_X_EN|DIV_X_ONE;   //设置波特率分频   
  26.     UA0_BAUD |= ((unFosc / unBaud) -2); //波特率设置  UART_CLK/(A+2) = 115200, UART_CLK=12MHz
  27. UA0_IER |= RDA_IEN;     //接收数据中断使能
  28. NVIC_ISER |= UART0_INT;     //使能串口0中断
  29. }
  30. /****************************************
  31. *函数名称:UartSend
  32. *输    入:pBuf     发送数据缓冲区
  33.           unNumOfBytes  发送字节总数
  34. *输    出:无
  35. *功    能:串口发送数据
  36. ******************************************/
  37. VOID UartSend(UINT8 *pBuf,UINT32 unNumOfBytes)
  38. {
  39.   UINT32 i;
  40.   for(i=0; i<unNumOfBytes; i++)
  41.   {
  42.          UA0_THR = *(pBuf+i);
  43.          while ((UA0_FSR&TX_EMPTY) != 0x00); //检查发送FIFO是否为空
  44.   }
  45. }
  46. /****************************************
  47. *函数名称:UART0_IRQHandler
  48. *输    入:无
  49. *输    出:无
  50. *功    能:串口0中断服务函数
  51. ******************************************/
  52. VOID UART0_IRQHandler(VOID)
  53. {
  54.     UINT8 ucData;
  55. if(UA0_ISR & RDA_INT)     //检查是否接收数据中断
  56. {  
  57.   while(UA0_ISR & RDA_IF)    //获取所有接收到的数据
  58.   {
  59.    while (UA0_FSR & RX_EMPTY);  //检查接收FIFO是否为空   
  60.    ucData = UA0_RBR;    //读取数据
  61.    UartSend(&ucData,1);   //发送数据
  62.    //以下测试接收数据用
  63.     if(ucData == 0x11)  P2_DOUT &= ~0xff;
  64.     if(ucData == 0xff)  P2_DOUT |= 0xff;
  65.   }
  66. }
  67. }
  68. /****************************************
  69. *函数名称:main
  70. *输    入:无
  71. *输    出:无
  72. *功    能:函数主体
  73. ******************************************/
  74. INT32 main(VOID)
  75. {
  76. // unsigned char i,j;
  77.      PROTECT_REG
  78.   (            //ISP下载时保护FLASH存储器
  79.    PWRCON |= XTL12M_EN;      //默认时钟源为外部晶振
  80.    while((CLKSTATUS & XTL12M_STB) == 0);   //等待12MHz时钟稳定
  81.    CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //设置外部晶振为系统时钟
  82.    //以下测试接收数据
  83.    //P2_PMD=0x5555;          //GPIO设置为输出模式  
  84.   )
  85.   UartInit(12000000,9600);      //波特率设置为9600bps
  86.   while(1)
  87.   {
  88. /*   j=0;
  89.                 //发送数据0~255
  90.     for(i=0; i<256; i++)
  91.     {
  92.        UartSend(&j,1);
  93.      j++;
  94.      Delayms(50);   
  95.     } */
  96.   }
  97. }


天灵灵地灵灵 发表于 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 | 显示全部楼层
有时候硬件问题没有查出来,总以为软件的问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

231

主题

3196

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部