DSP UART配置和使用
一,初始化
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配置和使用相关推荐
- ZigBee 裸机 uart 配置
一. usart 数据发送 1. usart介绍 1)cc2530中,有两个串口, UART0 对应的外部设备 IO 引脚关系为:P0_2------RX, P0_3------TX UART1 ...
- 全志 H6 Orange Pi Lite 2 Android 7.0 UART配置
UART配置 查看原理图,确认管脚 从原理图可以确认,有串口UART3模块可以使用. 这里做了张图,方便以后对管脚. sys_config.fex配置 [uart3] uart3_used = 0 u ...
- 对MSP430F5438的时钟及uart配置
对MSP430F5438的时钟及uart配置 在使用的过程中,一直认为比较简单,也一直没有深究,忽然这几天卡壳了,出现问题是操作UART发送出的数据给232显示,并不是想得到的数据.这里涉及了两个地方 ...
- UART配置调试指南
UART配置(硬件描述) 1.根据原理图,查找相关的i2c引脚对应的GPIO值,以GPIO16作为UART1_TX,GPIO17作为UART1_RX为例. 2.查找GPIO16与GPIO17对应的BL ...
- 高通7x27a平台UART配置
高通7x27a平台使用uart1作为debug的配置 高通7x27a平台一共有5个UART PORT: Port 对应的GPIO 描述 UART1 122+123 Can used for debug ...
- SL8521E开发笔记---UART配置
简单的说,有多组 UART 控制器,有多组 UART PIN 引脚.UART PIN 可以灵活的分配给不同的 UART 控制器(不在同一个软件版本中).这个分配过程,就是去调整寄存器 REG_PIN_ ...
- [单片机框架][bsp层][N32G4FR][bsp_uart] UART配置和使用
USART 简介 通用同步异步收发器(USART)是一种全双工或半双工,同步或异步的一个串行数据交换接口.USART 提 供了可编程的波特率发生器,能对系统时钟进行分频产生 USART 发送和接收所需 ...
- stm8s uart配置
uart一般配置为1个起始位,8个数据位,1个停止位,无奇偶校验.8s105只有UART2,初始化配置如下: UART2_CR1_M = 0;//一个起始位,8个数据位 UART2_CR1_P ...
- CCS5.3 软件仿真:dsp仿真器配置
1.工程设置 可以在新建工程时直接设置,也可以设置project的properties. 这里选用C6000系列的C6747: 2.新建Target Configuration 新建Target Co ...
最新文章
- 简述机器指令与微指令之间的关系_自考《计算机组成原理》模拟试题(一)
- React Native进行签名打包成Apk
- Cocos坐标之convertToNodeSpace、convertToWorldSpace、convertToNodeSpaceAR、convertToWorldSpaceAR区别和用法...
- java捕获定时器抛出的异常_详细了解Java中定时器Timer的使用及缺陷分析
- 游戏服某个服外网玩家连不上,内网才能连
- MySQL LIMIT 如何改写成Oracle limit
- WebClient UI的Automatic Delta Handling是什么意思
- pdf打印机安装程序_CAD快速出打印PDF格式文件
- HTML5背景音乐的暂停与播放
- Math常用方法,String转float并且保留两位小数,除法
- 华为怎么用手机看时间到读秒_华为手机灭屏也可以看时间?其实设置方法很简单,不会有些可惜了...
- git 安装 on centos7
- 微课|中学生可以这样学Python(例9.1):Excel导入SQLite(2)
- Python 代码覆盖率统计工具 coverage.py
- /common/nlp/data/dictionary/CoreNatureDictionary.mini.txt加载失败
- 堆排序算法(C#实现)
- html展开阅读全文代码,一个简单的html点击展开/关闭代码
- Google Hack 最新版
- EMC、EMI、EMS和ESD的定义、区别和测试项
- 复利java_复利计算1.0,2.0,3.0(java)