[新手园地] 我是白痴--仿菜农叔FIFO不成,求帮助

[复制链接]
4362|3
 楼主| leonbaichi 发表于 2011-9-3 01:00 | 显示全部楼层 |阅读模式
本帖最后由 leonbaichi 于 2011-9-3 01:27 编辑

之前学习过菜农叔的无限FIFO,那叫一个了得,自己在学串口的时候想顺便整整M0的FIFO,仿造着试试。结果碰了一天的壁。感谢JOHN LEE老师,SWALLOW0322以及电子WHITE_CAI等坛友的帮助。好歹让我找到了北,虽然没整出来,程序贴在下面,请大家帮忙看看。抛开程序写的好不好不谈。只要功能实现了先,就很开心了。
  1. #include <stdio.h>
  2. #include "NUC1xx.h"
  3. #include "DrvGPIO.h"
  4. #include "DrvUART.h"
  5. #include "DrvSYS.h"

  6. typedef struct {
  7.   volatile unsigned char RxBuffer[256], TxBuffer[256];
  8.   volatile unsigned char RxCount, TxCount;
  9.   volatile unsigned char RxdCount, TxdCount;
  10.   volatile unsigned char TxBusy;
  11. }UartStruct;
  12.    UartStruct Uart;
  13. void UART0Callback(uint32_t data);                                                                                                                       
  14. void Sys_Init()
  15. {
  16. UNLOCKREG();                                //芯片注册解锁
  17. SYSCLK->PWRCON.XTL12M_EN = 1;//        设定12M外部晶振
  18. DrvSYS_Delay(5000);        //等待时钟就绪
  19. DrvGPIO_Open(E_GPB, 10, E_IO_OUTPUT);                              //  设置GPB10端口为输出模式
  20. DrvGPIO_ClrBit(E_GPB, 10);                                               //  清GPB10端口  蜂鸣器不叫唤
  21. {
  22. STR_UART_T param;                               
  23. DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0);//         使能UART时钟,这边0X00指的是用外部的4~24M高速晶振
  24. DrvGPIO_InitFunction(E_FUNC_UART0);                                                         //         复用功能引脚设置               
  25. param.u32BaudRate        = 115200;                                                         //         波特率
  26. param.u8cDataBits        = DRVUART_DATABITS_8;                                 //         数据位
  27. param.u8cStopBits        = DRVUART_STOPBITS_1;                                 //         停止位
  28. param.u8cParity          = DRVUART_PARITY_NONE;                                 //         校验位
  29. param.u8cRxTriggerLevel  = DRVUART_FIFO_62BYTES;                                 //         FIFO存储深度 62字节
  30. param.u8TimeOut                 = 123;        //瞎整的                //         FIFO超时设定
  31. DrvUART_Open(UART_PORT0, ¶m);                        //         串口开启、结构体整体赋值
  32.         }
  33. }

  34. void Uart0_test()
  35. {

  36. //---------------------------------------------------------   
  37. printf("\n\n");                 //具体printf等函数说明,请参看stdio.h
  38. printf("/*==========================\n");
  39. printf("      菜农新唐M0助学板范例  \n");
  40. printf("      实验一:串口实验      \n");
  41. printf("leonbaichi 请输入内容        \n");
  42. printf("==========================*/\n");
  43. printf("\n\n");
  44. //------------------------------------------------               
  45. //本意是想实现输入什么原样返回
  46. //-----------------------------------------------
  47. }
  48. void UART0Callback(uint32_t data)
  49. {
  50. unsigned int i;
  51. unsigned char ch;
  52. /*---------------华丽的分割线-----------------------------------------------*/
  53. if(UART0->ISR.RLS_INT)           //线中断
  54. {
  55.   UART0->FSR.BIF =1;
  56.   UART0->FSR.PEF =1;
  57.   UART0->FSR.FEF =1;          //清标志位
  58. }
  59.   else
  60.   if( UART0->ISR.RDA_INT|UART0->ISR.TOUT_INT)  //TOUT或者RDA中断
  61.   {
  62. while ((UART0->FSR.RX_EMPTY)) //RX_EMPTY
  63. {//从FIFO中取出全部数据
  64. ch =(unsigned char)( UART0->DATA);//从FIFO中取出1个字符的数据  Uart.RxBuffer[Uart.RxCount ++] = ch;//暂存入缓冲区
  65. }

  66.   while (Uart.TxCount != Uart.RxCount)
  67. {
  68. Uart.TxBuffer[Uart.TxCount] = Uart.RxBuffer[Uart.TxCount];//移入发送缓冲区
  69. Uart.TxCount ++;
  70. }
  71. if (!Uart.TxBusy) {//发送器不忙可以立即发送
  72.            UART0->DATA = Uart.TxBuffer[Uart.TxdCount++]; //先发送缓冲区中的一个数据           
  73.         }
  74.   }
  75.   else
  76. if(UART0->ISR.THRE_INT)       
  77. {
  78. UART0->ISR.THRE_IF = UART0->ISR.THRE_IF;//清零
  79. Uart.TxBusy = (Uart.TxCount != Uart.TxdCount);//保证FIFO发送全部结束时,缓冲区空不拒绝发送
  80. for (i = 0; (i < 62) && (Uart.TxCount != Uart.TxdCount); i ++)
  81. {
  82. ch = Uart.TxBuffer[Uart.TxdCount ++];//取出缓冲区1个字节数据
  83. UART0->DATA = ch;//将缓冲区1个字节数据写入FIFO
  84. }               
  85. }
  86. }
  87. /*-----------------华丽的分割线--------------------------------------------*/

  88. void UartInit(void)
  89. {

  90.   Uart.TxCount = 0;
  91.   Uart.RxCount = 0;
  92.   Uart.TxdCount = 0;
  93.   Uart.RxdCount = 0;
  94.   Uart.TxBusy = 0;

  95.   DrvUART_EnableInt( UART_PORT0,DRVUART_THREINT,UART0Callback);        //调试的时候这个有问题,我不知道该怎么传递这个参数UART0Callback
  96. UART0->IER.THRE_IEN =1; //置位BUFF_ERR ,RLS, THRE, RDA,TOUT
  97. UART0->IER.RLS_IEN=1;               
  98. UART0->IER.RDA_IEN=1;
  99. UART0->IER.BUF_ERR_IEN=1;
  100. UART0->IER.TIME_OUT_EN =1; //使能计时
  101. }

  102. int main (void)
  103. {
  104. Sys_Init();
  105. UartInit();
  106. Uart0_test();
  107. while(1);
  108. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| leonbaichi 发表于 2011-9-3 01:22 | 显示全部楼层
本帖最后由 leonbaichi 于 2011-9-3 01:28 编辑

有很多不懂的,希望路过的高手不吝指导:
1.
DrvUART_EnableInt(E_UART_PORT  u32Port,uint32_t  u32InterruptFlag,PFN_DRVUART_CALLBACK pfncallback)
以上是EnableInt的函数原型,如何传递UART0Callback这个参数,同时以下的两个是在同一个drvuart.c文件下包含的。
PFN_DRVUART_CALLBACK pfncallback
typedef void (PFN_DRVUART_CALLBACK)(uint32_t userData);
2.
另外,那个TOUT的时间应该设置成多少为适宜呀?
 楼主| leonbaichi 发表于 2011-9-3 01:32 | 显示全部楼层
坛子里一批牛人,我还在这边整这个~~~唉~~情何以堪,情何以堪呐。。。。。。。。。
 楼主| leonbaichi 发表于 2011-9-3 01:43 | 显示全部楼层
还有人比我晚睡么???嘿嘿,明天六点起床。。。。。。。。。。。。。小便。。。。。。。。。。。哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

41

帖子

1

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