打印
[新手园地]

我是白痴--仿菜农叔FIFO不成,求帮助

[复制链接]
3263|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
leonbaichi|  楼主 | 2011-9-3 01:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 leonbaichi 于 2011-9-3 01:27 编辑

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

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

void Uart0_test()
{

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

  while (Uart.TxCount != Uart.RxCount)
{
Uart.TxBuffer[Uart.TxCount] = Uart.RxBuffer[Uart.TxCount];//移入发送缓冲区
Uart.TxCount ++;
}
if (!Uart.TxBusy) {//发送器不忙可以立即发送
           UART0->DATA = Uart.TxBuffer[Uart.TxdCount++]; //先发送缓冲区中的一个数据           
        }
  }
  else
if(UART0->ISR.THRE_INT)       
{
UART0->ISR.THRE_IF = UART0->ISR.THRE_IF;//清零
Uart.TxBusy = (Uart.TxCount != Uart.TxdCount);//保证FIFO发送全部结束时,缓冲区空不拒绝发送
for (i = 0; (i < 62) && (Uart.TxCount != Uart.TxdCount); i ++)
{
ch = Uart.TxBuffer[Uart.TxdCount ++];//取出缓冲区1个字节数据
UART0->DATA = ch;//将缓冲区1个字节数据写入FIFO
}               
}
}
/*-----------------华丽的分割线--------------------------------------------*/

void UartInit(void)
{

  Uart.TxCount = 0;
  Uart.RxCount = 0;
  Uart.TxdCount = 0;
  Uart.RxdCount = 0;
  Uart.TxBusy = 0;

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

int main (void)
{
Sys_Init();
UartInit();
Uart0_test();
while(1);
}

Smpl_DrvUART.zip

1.35 MB

相关帖子

沙发
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

粉丝