一,初始化

1,给UART模块上电

2,执行必要的设备pin多路复用设置(请参阅设备特定的数据手册)。

3,配置

(1)通过将适当的时钟除数值写入除数锁存寄存器(DLL和DLH)来设置所需的波特率

(2)1GHz主频下 UART输入频率166666666Hz

4,如果要使用FIFO(FCR中的FIFOEN=1),则必须先设置FCR中的FIFOEN位,然后再配置FCR中的其他位。选择所需的触发电平,并通过将适当的值写入FIFO控制寄存器(FCR)来启用FIFO。通过设置TXCLR=1和RXCLR=1,清除发射机FIFO和接收机FIFO。

5,通过将适当的值写入线路控制寄存器(LCR)来选择所需的协议设置。e、 g.设置PEN=0(无奇偶校验),STB=0(1停止位),WLS=0x3(8位)

6,如果需要中断,请设置IER控制器。

7,如果需要自动流量控制,将适当的值写入调制解调器控制寄存器(MCR)。请注意,所有UART都不支持自动流量控制,有关支持的功能,请参阅设备特定的数据手册。

8,通过配置空闲位来选择对仿真挂起事件的所需响应,并通过在电源和仿真管理寄存器(PWREMU\u MGMT)中设置UTRST和URRST位来启用UART。这里我设置UTRST=1(发射机已启用),URRST=1(接收器已启用),FREE=1(启用自由运行模式;UART继续正常运行)

9,根据需求配置中断 IER寄存器(一般配置为IER=0x5,即接收中断和receiver line status异常中断)

10,映射中断函数到中断向量表。

二,串口数据发送

UART发送器部分包括发送器保持寄存器(THR)和发送器移位寄存器(TSR)。当UART处于FIFO模式时,THR是一个16字节的FIFO。发送器部分控制是UART线路控制寄存器(LCR)的功能。 串口发送时,只需要判断THR(即FIFO)为空,想THR写入即可。

1.读取TEMT in LSR来判断THR和TSR是否为空, 循环等待直到THRE =1

2.可以加一点延迟,为了稳定我这里加了30us延迟,如果不加延迟也能稳定运行可以不加

3.循环发送数据

a.写入数据到THR

b.等待UART发送数据,发送完成后THRE=1

c.重复执行a,b,直到数据发送完成

三,串口数据接收

接收时,判断RBR中有未读数据,读出该数据,再判断是否有新数据,有则继续读出来。但是一次中断读取次数不能超过配置的FIFO大小,超出则溢出了。当达到FIFO大小时,例如有8字节,读出8字节后则停止,等待下一次UART中断,再读数据。

1.读取IIR状态,判断是否属于receiver相关中断(INTID = 2 | INTID = 3 | INTID = 6)

2.读取DR in LSR来判断Data是否ready, 循环等待直到DR =1

3.循环读取数据

a.等待DR=1 in LSR register

b.从RBR中读出数据到内存

c.判断读取字节数是否超出FIFO长度,超出则结束读取,等待下一个接收中断

d.重复执行a,b,直到数据发送完成

四,串口uart初始化
void DebugUartInit(void)
{  
    RK6748_uartInit(DEBUG_PORT,DEBUG_PORT_BaudRate);
    RK6748_uartIntEnable(DEBUG_PORT);
    SetupInt();
    ConfigureIntUART1();
}

/*========================================================** 文件模块说明:*C6748的串口驱动,1和2是RS232,0是TTL    * 文件版本: V1.0.0* 开发人员: Rock* 创建时间: 2013-11-01 * Copyright(c) 2013-2015  Rock-Embed Limited Co.*========================================================*/
#include "types.h"
#include "rk6748.h"
#include "test_uart.h"// pinmux defines.
#define PINMUX_UART0_REG      (3)
#define PINMUX_UART0_MASK     (0x0000FFFF)
#define PINMUX_UART0_VAL      (0x00002222)
#define PINMUX_UART1_REG_0    (0)
#define PINMUX_UART1_MASK_0   (0x00FF0000)
#define PINMUX_UART1_VAL_0    (0x00220000)
#define PINMUX_UART1_REG_1    (4)
#define PINMUX_UART1_MASK_1   (0xFF000000)
#define PINMUX_UART1_VAL_1    (0x22000000)
#define PINMUX_UART2_REG_0    (0)
#define PINMUX_UART2_MASK_0   (0xFF000000)
#define PINMUX_UART2_VAL_0    (0x44000000)
#define PINMUX_UART2_REG_1    (4)
#define PINMUX_UART2_MASK_1   (0x00FF0000)
#define PINMUX_UART2_VAL_1    (0x00220000)#define UART_REG_READ(base,reg, result) \((result) = (*(volatile UINT32 *)((UINT32)base + (reg))))
#define UART_REG_WRITE(base,reg, data) \((*(volatile UINT32 *)((UINT32)base + (reg))) = (data))UINT8 LRecvBuf[1024];
UINT32 LBufRecvCounter;
UINT32 RK6748_uartBase[]={UART0_BASE,UART1_BASE,UART2_BASE};UINT8 RK6748_uartInit(UINT8 bySioNum,UINT32 dwBaudRate)//int baudrate
{UINT32 base,divisor;UINT8  byLCR;UINT32 i;switch (bySioNum){case 0:RK6748_lpscTransition(PSC0, DOMAIN0, LPSC_UART0, PSC_ENABLE);RK6748_pinmuxConfig(PINMUX_UART0_REG, PINMUX_UART0_MASK, PINMUX_UART0_VAL);break;case 1:RK6748_lpscTransition(PSC1, DOMAIN0, LPSC_UART1, PSC_ENABLE);RK6748_pinmuxConfig(PINMUX_UART1_REG_0, PINMUX_UART1_MASK_0, PINMUX_UART1_VAL_0);RK6748_pinmuxConfig(PINMUX_UART1_REG_1, PINMUX_UART1_MASK_1, PINMUX_UART1_VAL_1);break;case 2:RK6748_lpscTransition(PSC1, DOMAIN0, LPSC_UART2, PSC_ENABLE);RK6748_pinmuxConfig(PINMUX_UART2_REG_0, PINMUX_UART2_MASK_0, PINMUX_UART2_VAL_0);RK6748_pinmuxConfig(PINMUX_UART2_REG_1, PINMUX_UART2_MASK_1, PINMUX_UART2_VAL_1);break;default:return (ERR_INIT_FAIL);}base=RK6748_uartBase[bySioNum];//通道号3--4,应用接口是3--4if(bySioNum>=4)     return ERR_FAIL;byLCR = 0x03;// 8-Data's Bit-Length  1-Stopping Bit-Length  no-Parity & Parity/* initialize each channel's driver function pointers */divisor = 200000000 / ( dwBaudRate * 16);//24000000 / ( baudrate * 16);//divisor = 200000000 / ( g_tSioCtrl[bySioNum].dwBaudRate * 16);/* reset the chip */UART_REG_WRITE(base,UART_PWREMU_MGMT,0x0000);for(i=0;i<10000;i++);//设置波特率UART_REG_WRITE(base,UART_LCR,byLCR|0x80);UART_REG_WRITE(base,UART_THR,divisor & 0xff);UART_REG_WRITE(base,UART_IER,divisor >> 8); UART_REG_WRITE(base,UART_LCR,byLCR); //配置寄存器,使能fifo,8字节UART_REG_WRITE(base,UART_FCR,0x0001);UART_REG_WRITE(base,UART_FCR,0x0006);UART_REG_WRITE(base,UART_IER,0x0000);UART_REG_WRITE(base,UART_LCR,byLCR);UART_REG_WRITE(base,UART_MCR,0x0000);UART_REG_WRITE(base,UART_FCR,0x0089);UART_REG_WRITE(base,UART_PWREMU_MGMT,0x6001);UART_REG_WRITE(base,UART_FCR,0x00cf);return (ERR_NO_ERROR);
}//-----------------------------------------------------------------------------
// helper function to compute the number of bytes in a string.
//-----------------------------------------------------------------------------
static UINT32 getStringLength(char *in_string)
{UINT32 numBytes = 0;while (in_string[numBytes] != 0){numBytes++;}return numBytes;
}//串口发送
void RK6748_uartSend(UINT8 bySioNum ,char *pData)//2/从2开始打印口,前置通信口
{UINT32  i,base;UINT32  status_lsr=0;int len=0;len=getStringLength(pData);base=RK6748_uartBase[bySioNum];   //等待发送fifo空while((status_lsr & 0x40) != 0x40) UART_REG_READ(base,UART_LSR, status_lsr);for(i=0;i<500;i++);//delay 30usfor(i=0;i<len;i++){status_lsr=0;UART_REG_WRITE(base,UART_THR, *pData++);//等待发送fifo空while((status_lsr & 0x40) != 0x40) UART_REG_READ(base,UART_LSR, status_lsr);}//等待发送fifo空while((status_lsr & 0x40) != 0x40) UART_REG_READ(base,UART_LSR, status_lsr);
}     //串口发送
void RK6748_uartSendByte(UINT8 bySioNum ,char pdata)//2/从2开始打印口,前置通信口
{UINT32  base;UINT32  status_lsr=0;base=RK6748_uartBase[bySioNum];  UART_REG_WRITE(base,UART_THR, pdata);//等待发送fifo空while((status_lsr & 0x40) != 0x40) UART_REG_READ(base,UART_LSR, status_lsr);}
//串口接收
void RK6748_uartRx(UINT8 bySioNum)
{UINT32    status_iir,inData, status_lsr,status;int       rxdloop = 0; UINT32  base;base=RK6748_uartBase[bySioNum]; UART_REG_READ(base,UART_IIR, status_iir); status_iir &=0x0e;if((status_iir == 0x04)|(status_iir == 0x0C)|(status_iir == 0x06)) //rx-int{    UART_REG_READ(base,UART_LSR, status_lsr);    while((status_lsr & 0x01) == 0x01){UART_REG_READ(base,UART_RBR, inData);   LRecvBuf[LBufRecvCounter++]=(char)inData;       UART_REG_READ(base,UART_LSR, status_lsr);//接收回环测试,收到一个字节发送一个字节RK6748_uartSendByte(bySioNum,inData);rxdloop++;if(rxdloop>=8)break; //8字节FIFO,读到8就跳出来,多读会出错}}
}void RK6748_uartRxInt0(void)
{RK6748_uartRx(0);
}
void RK6748_uartRxInt1(void)
{RK6748_uartRx(1);
}
void RK6748_uartRxInt2(void)
{RK6748_uartRx(2);
}void RK6748_uartIntEnable(UINT8 bySioNum)
{UINT32  base;base=RK6748_uartBase[bySioNum];   // 使能接受中断,禁止发送中断UART_REG_WRITE(base,UART_IER, 0x05);
}void RK6748_uartIntDisable(UINT8 bySioNum)
{UINT32  base;base=RK6748_uartBase[bySioNum];   // 禁止发送和接受中断UART_REG_WRITE(base,UART_IER, 0x00);
}

DSP UART配置和使用相关推荐

  1. ZigBee 裸机 uart 配置

    一.   usart 数据发送 1. usart介绍 1)cc2530中,有两个串口, UART0 对应的外部设备 IO 引脚关系为:P0_2------RX, P0_3------TX UART1 ...

  2. 全志 H6 Orange Pi Lite 2 Android 7.0 UART配置

    UART配置 查看原理图,确认管脚 从原理图可以确认,有串口UART3模块可以使用. 这里做了张图,方便以后对管脚. sys_config.fex配置 [uart3] uart3_used = 0 u ...

  3. 对MSP430F5438的时钟及uart配置

    对MSP430F5438的时钟及uart配置 在使用的过程中,一直认为比较简单,也一直没有深究,忽然这几天卡壳了,出现问题是操作UART发送出的数据给232显示,并不是想得到的数据.这里涉及了两个地方 ...

  4. UART配置调试指南

    UART配置(硬件描述) 1.根据原理图,查找相关的i2c引脚对应的GPIO值,以GPIO16作为UART1_TX,GPIO17作为UART1_RX为例. 2.查找GPIO16与GPIO17对应的BL ...

  5. 高通7x27a平台UART配置

    高通7x27a平台使用uart1作为debug的配置 高通7x27a平台一共有5个UART PORT: Port 对应的GPIO 描述 UART1 122+123 Can used for debug ...

  6. SL8521E开发笔记---UART配置

    简单的说,有多组 UART 控制器,有多组 UART PIN 引脚.UART PIN 可以灵活的分配给不同的 UART 控制器(不在同一个软件版本中).这个分配过程,就是去调整寄存器 REG_PIN_ ...

  7. [单片机框架][bsp层][N32G4FR][bsp_uart] UART配置和使用

    USART 简介 通用同步异步收发器(USART)是一种全双工或半双工,同步或异步的一个串行数据交换接口.USART 提 供了可编程的波特率发生器,能对系统时钟进行分频产生 USART 发送和接收所需 ...

  8. stm8s uart配置

    uart一般配置为1个起始位,8个数据位,1个停止位,无奇偶校验.8s105只有UART2,初始化配置如下: UART2_CR1_M = 0;//一个起始位,8个数据位     UART2_CR1_P ...

  9. CCS5.3 软件仿真:dsp仿真器配置

    1.工程设置 可以在新建工程时直接设置,也可以设置project的properties. 这里选用C6000系列的C6747: 2.新建Target Configuration 新建Target Co ...

最新文章

  1. 简述机器指令与微指令之间的关系_自考《计算机组成原理》模拟试题(一)
  2. React Native进行签名打包成Apk
  3. Cocos坐标之convertToNodeSpace、convertToWorldSpace、convertToNodeSpaceAR、convertToWorldSpaceAR区别和用法...
  4. java捕获定时器抛出的异常_详细了解Java中定时器Timer的使用及缺陷分析
  5. 游戏服某个服外网玩家连不上,内网才能连
  6. MySQL LIMIT 如何改写成Oracle limit
  7. WebClient UI的Automatic Delta Handling是什么意思
  8. pdf打印机安装程序_CAD快速出打印PDF格式文件
  9. HTML5背景音乐的暂停与播放
  10. Math常用方法,String转float并且保留两位小数,除法
  11. 华为怎么用手机看时间到读秒_华为手机灭屏也可以看时间?其实设置方法很简单,不会有些可惜了...
  12. git 安装 on centos7
  13. 微课|中学生可以这样学Python(例9.1):Excel导入SQLite(2)
  14. Python 代码覆盖率统计工具 coverage.py
  15. /common/nlp/data/dictionary/CoreNatureDictionary.mini.txt加载失败
  16. 堆排序算法(C#实现)
  17. html展开阅读全文代码,一个简单的html点击展开/关闭代码
  18. Google Hack 最新版
  19. EMC、EMI、EMS和ESD的定义、区别和测试项
  20. 复利java_复利计算1.0,2.0,3.0(java)

热门文章

  1. 怎么在HTML中插入背景图片,绝对有用!
  2. Python-plt绘制折线图legend
  3. 期末计算机课总结100字,期末自我鉴定100字左右9篇
  4. 微信登录失败,10003
  5. 《港联证券》新三板股票交易规则是什么?如何进行交易?
  6. Emacs_238_company中使用C-j和C-k选择候选项
  7. vue项目 使用 export * from 時候报错
  8. BMDZ-4型PVDF薄膜电阻综合测试测试仪
  9. spring 中 pojo 类为什么不需要注入
  10. 已购买 Office 重新下载安装