TL6748 串口的使用
时间:10-02
整理:3721RD
点击:
TMS320C6748有三个硬件串口,Uart0、Uart1、Uart2.每个串口有轮询模式(POLL)、中断模式(INT)、直接数据访问模式(DMA)。 先来分析下串口三种不同工作模式的实现机制及优缺点:
1 轮询模式
轮询方式是对I/O设备的程序轮流查询,是早期的计算机系统对I/O设备的一种管理方式。它定时对各种设备轮流询问一遍有无处理要求。轮流询问之后,有要求的,则加以处理。在处理I/O设备的要求之后,处理机返回继续工作。
尽管轮询需要时间,但轮询要比I/O设备的速度要快得多一遍不会发生不能及时处理的问题。
当然,再快的处理机,能处理的输入输出设备的数量也是有一定限度的。而且,程序轮询占据了一部分CPU处理时间,是一种效率较低的方式,在DSP程序中很少应用。
2 中断方式
处理器的高速和输入输出设备的低速是一种矛盾,是设备管理要解决的一个重要问题。为了提高整体效率,减少在程序直接控制方式中CPU之间的数据传送,是很必要的。
中断方式的优缺点:
I/O设备中断方式使处理器的利用率提高,且能支持多通道程序和I/O设备的并行操作。不过,中断方式仍然存在一些问题。首先,MCU要配置各种各样的输入输出设备。如果这些IO设备都通过中断处理方式并行操作,那么中断次数的急剧会造成CPU无法响应中断和出现数据丢失现象。
其次,如果IO控制器的数据缓冲区比较小,在缓冲区装满数据之后将会发生中断。那么,在数据传送过程中,发生中断的机会增多,这将耗去大量CPU处理时间。
3 直接内存存储(DMA)方式
直接内存存储技术是指,数据在内存与IO设备间直接进行成块传输。
DMA有两个技术特征,首先是直接传送,其次是块传送。
所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何干涉,只需要CPU在过程开始时向设备发出“传送数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。
DMA与中断的区别
(1) 中断方式是数据缓冲区寄存器满之后发出中断,要求CPU进行中断处理,而DMA方式则是在所要求传送的数据块全部传送结束时要求CPU进行中断处理。这就大大减少了CPU进行中断处理的次数。
(2) 中断方式的数据传送是在中断处理时由CPU控制完成的,而DMA方式则是在DMA控制器的控制下,不经过CPU控制。这就排除了因并行设备过多而来不及处理以及因速度不匹配而造成数据丢失等现象。
DMA方式的优缺点
DMA方式中,由于IO设备直接同内存发生块的数据交换,因此效率比较高。
DMA控制器功能的强弱,是决定DMA效率的关键因素。DMA控制器需要为每次数据传送做大量的工作,数据传送单位的增大意味着传送次数的减少。另外,DMA方式窃取了时钟周期,CPU处理效率低了,要想尽量少地窃取时钟周期,就要设法提高DMA控制器的性能,这样可以较少地影响CPU处理效率。
下面讲解TMS320C6748三种工作方式程序:
1 POLL工作方式
int main(void)
{
PSCInit(); // 外设使能配置
GPIOBankPinMuxSet(); // GPIO 管脚复用配置
UARTInit(); // UART 初始化
unsigned char i; // 发送字符串
for(i = 0; i >= 1u;
}
Cnt++;
}
}
}
void Edma3CCErrHandlerIsr()
{
volatile unsigned int pendingIrqs = 0;
unsigned int regionNum = 0;
unsigned int evtqueNum = 0;
unsigned int index = 1;
unsigned int Cnt = 0;
IntEventClear(SYS_INT_EDMA3_0_CC0_ERRINT);
if((HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_EMR) != 0 ) || \
(HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_QEMR) != 0) || \
(HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_CCERR) != 0))
{
while((Cnt >= 1u;
}
index = 0u;
pendingIrqs = HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_QEMR);
while(pendingIrqs)
{
if((pendingIrqs & 1u)==TRUE)
{
HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_QEMCR) = (1u >= 1u;
}
index = 0u;
pendingIrqs = HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_CCERR);
if(pendingIrqs != 0u)
{
for(evtqueNum = 0u; evtqueNum ”功能,帖子会更漂亮。如:
1 轮询模式
轮询方式是对I/O设备的程序轮流查询,是早期的计算机系统对I/O设备的一种管理方式。它定时对各种设备轮流询问一遍有无处理要求。轮流询问之后,有要求的,则加以处理。在处理I/O设备的要求之后,处理机返回继续工作。
尽管轮询需要时间,但轮询要比I/O设备的速度要快得多一遍不会发生不能及时处理的问题。
当然,再快的处理机,能处理的输入输出设备的数量也是有一定限度的。而且,程序轮询占据了一部分CPU处理时间,是一种效率较低的方式,在DSP程序中很少应用。
2 中断方式
处理器的高速和输入输出设备的低速是一种矛盾,是设备管理要解决的一个重要问题。为了提高整体效率,减少在程序直接控制方式中CPU之间的数据传送,是很必要的。
中断方式的优缺点:
I/O设备中断方式使处理器的利用率提高,且能支持多通道程序和I/O设备的并行操作。不过,中断方式仍然存在一些问题。首先,MCU要配置各种各样的输入输出设备。如果这些IO设备都通过中断处理方式并行操作,那么中断次数的急剧会造成CPU无法响应中断和出现数据丢失现象。
其次,如果IO控制器的数据缓冲区比较小,在缓冲区装满数据之后将会发生中断。那么,在数据传送过程中,发生中断的机会增多,这将耗去大量CPU处理时间。
3 直接内存存储(DMA)方式
直接内存存储技术是指,数据在内存与IO设备间直接进行成块传输。
DMA有两个技术特征,首先是直接传送,其次是块传送。
所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何干涉,只需要CPU在过程开始时向设备发出“传送数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。
DMA与中断的区别
(1) 中断方式是数据缓冲区寄存器满之后发出中断,要求CPU进行中断处理,而DMA方式则是在所要求传送的数据块全部传送结束时要求CPU进行中断处理。这就大大减少了CPU进行中断处理的次数。
(2) 中断方式的数据传送是在中断处理时由CPU控制完成的,而DMA方式则是在DMA控制器的控制下,不经过CPU控制。这就排除了因并行设备过多而来不及处理以及因速度不匹配而造成数据丢失等现象。
DMA方式的优缺点
DMA方式中,由于IO设备直接同内存发生块的数据交换,因此效率比较高。
DMA控制器功能的强弱,是决定DMA效率的关键因素。DMA控制器需要为每次数据传送做大量的工作,数据传送单位的增大意味着传送次数的减少。另外,DMA方式窃取了时钟周期,CPU处理效率低了,要想尽量少地窃取时钟周期,就要设法提高DMA控制器的性能,这样可以较少地影响CPU处理效率。
下面讲解TMS320C6748三种工作方式程序:
1 POLL工作方式
int main(void)
{
PSCInit(); // 外设使能配置
GPIOBankPinMuxSet(); // GPIO 管脚复用配置
UARTInit(); // UART 初始化
unsigned char i; // 发送字符串
for(i = 0; i >= 1u;
}
Cnt++;
}
}
}
void Edma3CCErrHandlerIsr()
{
volatile unsigned int pendingIrqs = 0;
unsigned int regionNum = 0;
unsigned int evtqueNum = 0;
unsigned int index = 1;
unsigned int Cnt = 0;
IntEventClear(SYS_INT_EDMA3_0_CC0_ERRINT);
if((HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_EMR) != 0 ) || \
(HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_QEMR) != 0) || \
(HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_CCERR) != 0))
{
while((Cnt >= 1u;
}
index = 0u;
pendingIrqs = HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_QEMR);
while(pendingIrqs)
{
if((pendingIrqs & 1u)==TRUE)
{
HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_QEMCR) = (1u >= 1u;
}
index = 0u;
pendingIrqs = HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_CCERR);
if(pendingIrqs != 0u)
{
for(evtqueNum = 0u; evtqueNum ”功能,帖子会更漂亮。如:
- /****************************************************************************/
- /* */
- /* 回调函数 */
- /* */
- /****************************************************************************/
- void callback(unsigned int tccNum, unsigned int status)
- {
- UARTDMADisable(SOC_UART_2_REGS, (UART_RX_TRIG_LEVEL_1 | UART_FIFO_MODE));
- flag = 1;
- }