[应用方案] 新唐M051 UART0使用程序

[复制链接]
2529|11
 楼主| 史迪威将军 发表于 2015-7-5 21:10 | 显示全部楼层 |阅读模式
  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. }


仙女山 发表于 2015-7-9 09:23 | 显示全部楼层
谢谢楼主的无私分享,这个能直接用了
 楼主| 史迪威将军 发表于 2015-7-15 10:21 | 显示全部楼层
这种方式放代码看着也很舒心
734774645 发表于 2015-7-16 20:26 | 显示全部楼层
if(UA0_ISR & RDA_INT)     //检查是否接收数据中断
检测对应的中断位置
稳稳の幸福 发表于 2015-7-16 21:23 | 显示全部楼层
    P3_MFP &= ~(P31_TXD0 | P30_RXD0);  
    P3_MFP |= (TXD0 | RXD0);      //P3.0 使能为串口0接收
          //P3.1 使能为串口0发送
可以配置其他管脚为串口吗
mintspring 发表于 2015-7-17 09:14 | 显示全部楼层
*函数名称:UartInit
*输    入:unFosc   晶振频率
          unBaud  波特率
*输    出:无
*功    能:串口初始化
******************************************/
VOID UartInit(UINT32 unFosc,UINT32 unBaud)
其实知道上面函数的参数含义就行了,还有可取值范围,其他怎么实现,管了干啥。
wode112233 发表于 2015-8-20 20:35 | 显示全部楼层
标记一下
yiyigirl2014 发表于 2015-8-20 20:39 | 显示全部楼层
VOID UART0_IRQHandler(VOID)这个参数是什么啊?
mintspring 发表于 2015-8-21 11:57 | 显示全部楼层
串口应该做一个特别的封装,选择哪一个,速率,是否校验,等等。
tcchiu1 发表于 2015-8-21 14:12 | 显示全部楼层
避免CPU跟外设之间非同步问题,建义如下所示,简化流程,一次写入到外设的寄存器。
    UA0_FCR |= TX_RST|RX_RST;      //发送FIFO复位,接收FIFO复位

天灵灵地灵灵 发表于 2015-8-24 20:36 | 显示全部楼层
如果考虑移植性,最好需要配置的硬件参数都用头文件概况。
稳稳の幸福 发表于 2015-8-24 20:53 | 显示全部楼层
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是否为空
  }
这个判断好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

291

帖子

0

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